/* MQ-4 Methane Sensor module and HC-SR04 distance sensor with Arduino */
//afisaza cate un un mesaj in functie de activarea celor doi senzori//

#include <LiquidCrystal.h> //afiseaza mesajele pe un lcd 16*2//

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const int trigPin=8;
const int echoPin=9;
int triggerDistance = 5;
long durata;
int distanta;

const int AO_Pin=0; // Connect AO of MQ4 with Analog channel 0 pin (A0) of Arduino
const int DO_Pin=7; // Connect DO of MQ4 with Digital pin 8 (D8) of Arduino
const int difuzor_Pin=6; // Connect an speaker with D6 pin of Arduino
int threshold_value; // A variable to store digital output of MQ4
int AO_Out; // stores analog output of MQ4 sensor

static uint32_t oldtime; // variabla globala pentru program 
const unsigned long intarziere_afisare = 3000; // durata intarzierii

void setup() {
  lcd.begin(16, 2);
  pinMode(DO_Pin, INPUT); // Configure D7 pin as a digital input pin
  pinMode(difuzor_Pin, OUTPUT); //Configure D2 pin as a digital output pin
    
  pinMode (trigPin, OUTPUT);
  pinMode (echoPin, INPUT);
  
  lcd.print("Bine ati venit");
  delay(500);
  lcd.clear();
  oldtime=millis();
}
void loop() {
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  durata = pulseIn(echoPin, HIGH);
  distanta = durata*0.034/2;   
  threshold_value= digitalRead(DO_Pin); //Read digital output of MQ4 sensor
  AO_Out= analogRead(AO_Pin); // Take Analog output measurement sample from AO pin of MQ4 sensor
  threshold_value= digitalRead(DO_Pin); //Read digital output of MQ4 sensor//
 // lcd.clear();
    if ((threshold_value== HIGH)&&(distanta>5))// dispare obiectul plasat la o distanta mai mica de 5cm
      {    
      if  ( (millis()-oldtime) > intarziere_afisare) // intarziem afisarea noilor conditii si emiterea tonului de avertizare
           {
            tone(6,1000);
            lcd.setCursor(8,1);//gaz
            lcd.print("1");
            lcd.setCursor(8,1);//distanta
            lcd.print("0");
            oldtime = millis();
           }
      }
   else
   if ((threshold_value== HIGH)&&(distanta<=5))//reapare obiectul plasat la o distanta mai mica de 5cm
   {
            noTone(6);
            lcd.setCursor(8,0);
            lcd.print("1");
            lcd.setCursor(8,1);
            lcd.print("1");
            oldtime = millis();
          
   }
   else
   if ((threshold_value== LOW)&&(distanta<=5))//senzorul nu mai detecteaza gazul
   {
     if  ( (millis()-oldtime) > intarziere_afisare)// intarziem afisarea noilor conditii si emiterea tonului de avertizare
      {    
        tone(6,1000);
        lcd.setCursor(8,0);
        lcd.print("0");
        lcd.setCursor(8,1);
        lcd.print("1");
        oldtime=millis();
      }                  
}
else 
if ((threshold_value== HIGH)&&(distanta<=5)) // senzorul detecteaza gazul
   {
       
            noTone(6);
            lcd.setCursor(8,0);
            lcd.print("1");
            lcd.setCursor(8,1);
            lcd.print("1");
            oldtime = millis();
          
           
   }
  if ((millis()-oldtime)>4)
  {
  lcd.setCursor(0,0);
  lcd.print("       ");
  lcd.setCursor(0,0);
  lcd.print(millis()-oldtime); 
  }
  else {
  lcd.setCursor(0,0);
  lcd.print("       ");  
  }
}