#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define DHTPIN 15
#define DHTTYPE DHT22
#define GAS_PIN 34
#define AIR_QUALITY_PIN 35
#define BUZZER_PIN 25
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPIN, DHTTYPE);
bool buzzerOn = false;
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
delay(500); // Let sensors power up
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("OLED init failed");
while (true); // Stop if OLED fails
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("System Ready...");
display.display();
delay(1000);
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gasLevel = analogRead(GAS_PIN);
int airQuality = analogRead(AIR_QUALITY_PIN);
String tempStatus = (temp < 18) ? "Cold" : (temp > 28) ? "Hot" : "Comfortable";
String airStatus = (airQuality < 400) ? "Good" : (airQuality < 700) ? "Moderate" : "Bad";
Serial.printf("Temp: %.1f°C (%s), Humidity: %.1f%%, Gas: %d, Air Quality: %d (%s)\n",
temp, tempStatus.c_str(), hum, gasLevel, airQuality, airStatus.c_str());
display.clearDisplay();
display.setCursor(0, 0);
display.printf("Temp: %.1f C (%s)\n", temp, tempStatus.c_str());
display.printf("Hum: %.1f %%\n", hum);
display.printf("Gas: %d\n", gasLevel);
display.printf("Air: %d (%s)\n", airQuality, airStatus.c_str());
if (airQuality > 700 || (temp > 45 || temp < 0)) {
display.printf("\nAlert: Dangerous!");
if (!buzzerOn) {
tone(BUZZER_PIN, 1000);
buzzerOn = true;
}
} else {
if (buzzerOn) {
noTone(BUZZER_PIN);
buzzerOn = false;
}
}
display.display();
delay(2000);
}