#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <ESP32Servo.h>
#define DHTPIN 4
#define DHTTYPE DHT22
#define GAS_PIN 34
#define VIB_PIN 35
#define GREEN_LED 16
#define RED_LED 17
#define BUZZER 19
#define SERVO_PIN 18
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPIN, DHTTYPE);
Servo fan;
float tempThreshold = 35.0;
int gasThreshold = 500;
int vibrationThreshold = 2000;
void setup() {
Serial.begin(115200);
dht.begin();
fan.attach(SERVO_PIN);
pinMode(GAS_PIN, INPUT);
pinMode(VIB_PIN, INPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
Wire.begin(21, 22);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED failed"));
while(true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.print("System Initializing...");
display.display();
delay(2000);
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gasVal = analogRead(GAS_PIN);
int vibVal = analogRead(VIB_PIN);
Serial.print("Temp: "); Serial.print(temp);
Serial.print(" Gas: "); Serial.print(gasVal);
Serial.print(" Vibration: "); Serial.println(vibVal);
bool overTemp = temp > tempThreshold;
bool overGas = gasVal > gasThreshold;
// Default system state
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
// If any threshold exceeded → system shutdown
if (overTemp || overGas) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
}
// If gas is high → activate fan (servo sweep) and buzzer
if (overGas) {
digitalWrite(BUZZER, HIGH);
for (int pos = 0; pos <= 180; pos += 10) {
fan.write(pos);
delay(15);
}
for (int pos = 180; pos >= 0; pos -= 10) {
fan.write(pos);
delay(15);
}
} else {
fan.write(90); // center position
}
// OLED Display Update
display.clearDisplay();
display.setCursor(0, 0);
display.print("Temp: "); display.print(temp); display.println(" C");
display.print("Hum : "); display.print(hum); display.println(" %");
display.print("Gas : "); display.println(gasVal);
display.print("Vib : "); display.println(vibVal);
if (overTemp || overGas) display.println("⚠️ SYSTEM SHUTDOWN");
else display.println("✅ NORMAL");
display.display();
delay(1000);
}