#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.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 GAS_PIN A0

#define GREEN_LED 6
#define ORANGE_LED 7

int smoothedGas = 0;

const int SAFE_LEVEL = 300;
const int DANGER_LEVEL = 600;

void setup() {

  Serial.begin(9600);

  pinMode(GREEN_LED, OUTPUT);
  pinMode(ORANGE_LED, OUTPUT);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  // STARTUP SCREEN
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  display.setTextSize(2);
  display.setCursor(30,20);
  display.print("GAS");

  display.display();
  delay(1000);

  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(10,20);
  display.print("MONITOR");

  display.display();
  delay(1200);
}

void loop() {

  int raw = analogRead(GAS_PIN);

  Serial.println(raw);

  int gasPercent = map(raw, 200, 800, 0, 100);
  gasPercent = constrain(gasPercent, 0, 100);

  smoothedGas = (smoothedGas * 0.8) + (gasPercent * 0.2);

  drawUI(smoothedGas);

  delay(200);
}

void drawUI(int gasLevel) {

  display.clearDisplay();

  display.setTextColor(SSD1306_WHITE);

  // HEADER
  display.setTextSize(1);
  display.setCursor(20,2);
  display.print("LIVE GAS LEVEL");

  // STATUS
  display.setCursor(0,20);
  display.print("STATUS:");

  display.setCursor(50,20);

  if(gasLevel < 30)
  {
    display.print("SAFE");

    digitalWrite(GREEN_LED, HIGH);
    digitalWrite(ORANGE_LED, LOW);
  }
  else if(gasLevel < 60)
  {
    display.print("WARNING");

    digitalWrite(GREEN_LED, LOW);

    digitalWrite(ORANGE_LED, HIGH);
    delay(200);
    digitalWrite(ORANGE_LED, LOW);
  }
  else
  {
    display.print("DANGER");

    digitalWrite(GREEN_LED, LOW);

    digitalWrite(ORANGE_LED, HIGH);
    delay(100);
    digitalWrite(ORANGE_LED, LOW);
  }

  // PERCENT VALUE
  display.setTextSize(2);
  display.setCursor(88,16);
  display.print(gasLevel);
  display.print("%");

  // SLIDER BAR
  display.drawRect(0,40,128,12,SSD1306_WHITE);

  int barWidth = map(gasLevel,0,100,0,124);
  display.fillRect(2,42,barWidth,8,SSD1306_WHITE);

  // SCALE
  display.setTextSize(1);

  display.setCursor(0,56);
  display.print("0");

  display.setCursor(28,56);
  display.print("25");

  display.setCursor(56,56);
  display.print("50");

  display.setCursor(84,56);
  display.print("75");

  display.setCursor(108,56);
  display.print("100");

  display.display();
}