Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino-Based Gas Detection and Alert System with GSM Notification

View and Edit Project In Cirkit DesignerImage of Arduino-Based Gas Detection and Alert System with GSM Notification

Circuit Documentation

Summary

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.

Component List

Resistor

Piezo Buzzer

LED: Two Pin (red)

LED: Two Pin (green)

SIM800L

3.7V Battery

MQ135

16X2 LCD

I2C Module

Arduino UNO

Wiring Details

Resistor

Piezo Buzzer

LED: Two Pin (red)

LED: Two Pin (green)

SIM800L

3.7V Battery

MQ135

16X2 LCD

I2C Module

Documented Code

#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.