#include <Wire.h>

#include <Adafruit_SSD1306.h>
#include <splash.h>

#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#include <MQ2.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define B1 3  // Change to the pin number you use for B1
#define B2 4  // Change to the pin number you use for B2
#define B3 6  // Change to the pin number you use for B3
#define BUZZ 2 // Change to the pin number you use for the buzzer
#define LED 12  // Change to the pin number you use for the LED

int pin = A0;
int dly1;
float lpg, co, smoke;
long ppm, ppm1, dly, beep;
bool mode, alarm, st;
MQ2 mq2(pin);

void setup() {
  Serial.begin(115200);
  pinMode(B1, INPUT_PULLUP);
  pinMode(B2, INPUT_PULLUP);
  pinMode(B3, INPUT_PULLUP);
  pinMode(BUZZ, OUTPUT);
  pinMode(LED, OUTPUT);

  mq2.begin();

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // Don't proceed, loop forever
  }
  alarm = 1;
}

void loop() {
  dly++;
  dly1++;
  if (!digitalRead(B1) & digitalRead(B2)) {
    mode = 0;
  }
  if (digitalRead(B1) & !digitalRead(B2)) {
    mode = 1;
  }
  if (digitalRead(B3))
    st = 0;
  if (!digitalRead(B3) & !st) {
    st = 1;
    alarm = !alarm;
  }
  float* values = mq2.read(true);

  co = mq2.readCO();
  smoke = mq2.readSmoke();
  ppm = smoke;
  ppm1 = co;

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  if (mode)
    display.println(F("    CO    "));
  else
    display.println(F("  SMOKE   "));

  display.setTextSize(3);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 20);
  if (mode) {
    if (ppm1 < 10000)
      display.print(F(" "));
    else
      display.print(ppm1 / 10000);
    if (ppm1 < 1000)
      display.print(F(" "));
    else
      display.print((ppm1 / 1000) % 10);
    if (ppm1 < 100)
      display.print(F(" "));
    else
      display.print((ppm1 / 100) % 10);
    if (ppm1 < 10)
      display.print(F(" "));
    else
      display.print((ppm1 / 10) % 10);
    display.print(ppm1 % 10);
  } else {
    if (ppm < 10000)
      display.print(F(" "));
    else
      display.print(ppm / 10000);
    if (ppm < 1000)
      display.print(F(" "));
    else
      display.print((ppm / 1000) % 10);
    if (ppm < 100)
      display.print(F(" "));
    else
      display.print((ppm / 100) % 10);
    if (ppm < 10)
      display.print(F(" "));
    else
      display.print((ppm / 10) % 10);
    display.print(ppm % 10);
  }

  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(105, 30);
  display.println(F("PPM"));
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 55);
  if (mode) {
    display.print(F("SMOKE "));
    display.print(ppm);
  } else {
    display.print(F(" CO "));
    display.print(ppm1);
  }
  display.setCursor(64, 55);
  if (alarm)
    display.println(F(" ALARM ON"));
  else
    display.println(F(" ALARM OFF"));

  display.display();
  beep = 50000 / ppm1;
  if (beep < 10)
    beep = 10;
  if (ppm1 > beep) {
    if (alarm) {
      digitalWrite(BUZZ, 1);
      digitalWrite(LED, 1);
    }
    delay(100);
    digitalWrite(BUZZ, 0);
    digitalWrite(LED, 0);
  }
  delay(100);
}


