#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Sensor and Actuator Pins
const int gasSensorPin = A0; // MQ-2 analog pin
const int buzzerPin = 11; // Buzzer digital pin
const int ledPin = 2; // Warning LED pin
// Thresholds
const int gasThreshold = 300; // Adjust based on your sensor calibration
// Alarm timing variables
unsigned long previousAlarmMillis = 0;
const long alarmInterval = 500; // 0.5 second interval for beep/blink
bool alarmState = false;
void setup() {
// Initialize serial for debugging
Serial.begin(9600);
// Set pin modes
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
// Initialize OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED init failed");
while(1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Gas Monitor Ready");
display.display();
delay(2000);
}
void loop() {
// Read gas sensor
int gasValue = analogRead(gasSensorPin);
// Clear display and show readings
display.clearDisplay();
display.setCursor(0,0);
display.print("Gas Level: ");
display.print(gasValue);
// Check threshold and trigger alarms
if(gasValue > gasThreshold) {
unsigned long currentMillis = millis();
// Toggle alarm state every interval
if(currentMillis - previousAlarmMillis >= alarmInterval) {
previousAlarmMillis = currentMillis;
alarmState = !alarmState;
// Beep buzzer and blink LED
digitalWrite(buzzerPin, alarmState ? HIGH : LOW);
digitalWrite(ledPin, alarmState ? HIGH : LOW);
}
// Display warning
display.setCursor(0,20);
display.print("WARNING! GAS LEAK");
display.setCursor(0,40);
display.print("EVACUATE AREA!");
} else {
// Normal operation - turn off alarms
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, LOW);
alarmState = false;
display.setCursor(0,20);
display.print("Air Quality: Normal");
}
display.display();
delay(100); // Short delay for display stability
}