This circuit is designed to monitor air quality using an MQ135 gas sensor and alert the user through visual indicators (LEDs), an audible alarm (Piezo Buzzer), and communication via the SIM800L GSM module. The Arduino UNO serves as the central microcontroller, interfacing with the MQ135 sensor, LEDs, buzzer, and SIM800L module. The circuit also includes an I2C module connected to a 16x2 LCD for displaying air quality information. The system 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 and make calls in case of high gas levels detected. The LCD displays the current air quality index (AQI) and alerts.