The circuit in question is designed to monitor air quality using an MQ135 gas sensor and to alert users of gas leaks via visual indicators (LEDs), an audible alarm (Piezo Buzzer), and GSM communication (SIM800L module). The Arduino UNO serves as the central microcontroller, interfacing with the MQ135 sensor, LEDs, buzzer, and SIM800L module. An I2C module is used to facilitate communication between the Arduino and a 16x2 LCD display for real-time air quality readings. The circuit is powered by a 3.7V battery.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#define MQ135_PIN A0
#define RED_LED_PIN 4
#define GREEN_LED_PIN 5
#define BUZZER_PIN 2
#define GSM_RX_PIN 1
#define GSM_TX_PIN 0
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial gsm(GSM_RX_PIN, GSM_TX_PIN);
const int threshold = 310;
const unsigned long smsInterval = 60000;
const unsigned long callInterval = 180000;
unsigned long lastSmsTime = 0;
unsigned long lastCallTime = 0;
// Timer variables for LED blinking and buzzer activation
unsigned long ledBlinkTimer = 0;
unsigned long buzzerTimer = 0;
void setup() {
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
lcd.begin();
lcd.backlight();
gsm.begin(9600);
digitalWrite(GREEN_LED_PIN, HIGH);
}
void loop() {
int mq135Value = analogRead(MQ135_PIN);
lcd.setCursor(0, 0);
if (mq135Value > threshold) {
lcd.print("Gas Detected");
digitalWrite(GREEN_LED_PIN, LOW);
startBlinkingRedLed();
startBuzzer();
sendAlert();
} else {
lcd.print("No Gas Detected");
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
noTone(BUZZER_PIN);
}
lcd.setCursor(0, 1);
lcd.print("AQI: ");
lcd.print(mq135Value);
handleLedBlinking();
handleBuzzer();
delay(1000);
}
void startBlinkingRedLed() {
ledBlinkTimer = millis();
}
void handleLedBlinking() {
if (millis() - ledBlinkTimer >= 500) {
digitalWrite(RED_LED_PIN, !digitalRead(RED_LED_PIN));
ledBlinkTimer = millis();
}
}
void startBuzzer() {
buzzerTimer = millis();
tone(BUZZER_PIN, 325);
}
void handleBuzzer() {
if (millis() - buzzerTimer >= 5000) {
noTone(BUZZER_PIN);
}
}
void sendAlert() {
sendSms();
makeCall();
}
void sendSms() {
unsigned long currentTime = millis();
if (currentTime - lastSmsTime >= smsInterval) {
gsm.print("AT+CMGF=1\r");
delay(100);
gsm.print("AT+CMGS=\"+918446656933\"\r");
delay(100);
gsm.print("Gas leakage detected");
delay(100);
gsm.write(26);
lastSmsTime = currentTime;
}
}
void makeCall() {
unsigned long currentTime = millis();
if (currentTime - lastCallTime >= callInterval) {
gsm.print("ATD+918446656933;\r");
delay(30000);
gsm.print("ATH\r");
lastCallTime = currentTime;
}
}
This code is responsible for reading the MQ135 sensor data, controlling the LEDs and buzzer based on the gas levels, and using the SIM800L module to send SMS alerts and make calls when gas is detected. The LCD displays the current air quality index and status messages.