#include <stdio.h>
#include <stdlib.h>
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
#define SD_CS 5
#define BUZZER_PIN 12
#define SMOKE_PIN 34
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define THINGSPEAK_SERVER "http://api.thingspeak.com/update"
#define API_KEY "1MXOAY9RGWR4OOFT"
#define TEMP_THRESHOLD 50.0
#define HUMIDITY_THRESHOLD 60.0
#define SMOKE_THRESHOLD 300
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);
void connect_to_wifi();
void log_data_to_sd(float temp, float humidity, int smoke_level);
void send_data_to_thingspeak(float temp, float humidity, int smoke_level);
void trigger_alarm(float temp, float humidity, int smoke_level);
void update_oled_display(float temp, float humidity, int smoke_level);
void setup() {
Serial.begin(115200);
dht.begin();
delay(2000);
Serial.println("DHT22 Initialized!");
if (!SD.begin(SD_CS)) {
Serial.println("SD card initialization failed!");
} else {
Serial.println("SD card initialized successfully.");
}
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
Serial.println("OLED initialization failed!");
while (1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.display();
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
// Connect to WiFi
connect_to_wifi();
}
void loop() {
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
int smoke_level = analogRead(SMOKE_PIN);
if (isnan(temp) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.printf("Temperature: %.2f °C, Humidity: %.2f %%, Smoke Level: %d\n",
temp, humidity, smoke_level);
update_oled_display(temp, humidity, smoke_level);
log_data_to_sd(temp, humidity, smoke_level);
send_data_to_thingspeak(temp, humidity, smoke_level);
trigger_alarm(temp, humidity, smoke_level);
}
delay(5000);
}
void connect_to_wifi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
}
void update_oled_display(float temp, float humidity, int smoke_level) {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temp);
display.println(" C");
display.setCursor(0, 10);
display.print("Humidity: ");
display.print(humidity);
display.println(" %");
display.setCursor(0, 20);
display.print("Smoke: ");
display.print(smoke_level);
display.display();
}
void log_data_to_sd(float temp, float humidity, int smoke_level) {
File datafile = SD.open("/log.csv", FILE_APPEND);
if (datafile) {
datafile.printf("%.2f,%.2f,%d\n", temp, humidity, smoke_level);
datafile.close();
Serial.println("Data logged to SD card in CSV format.");} else {
Serial.println("Failed to open SD card file for writing!");
}}
void send_data_to_thingspeak(float temp, float humidity, int smoke_level) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
char url[256];
snprintf(url, sizeof(url), "%s?api_key=%s&field1=%.2f&field2=%.2f&field3=%d",
THINGSPEAK_SERVER, API_KEY, temp, humidity, smoke_level);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.println("Data sent to ThingSpeak successfully.");
} else {
Serial.println("Failed to send data to ThingSpeak.");
}
http.end();
} else {
Serial.println("WiFi not connected. Cannot send data!");
}
}
void trigger_alarm(float temp, float humidity, int smoke_level) {
if (temp > TEMP_THRESHOLD || humidity > HUMIDITY_THRESHOLD || smoke_level > SMOKE_THRESHOLD) {
Serial.println("ALARM: Threshold exceeded!");
tone(BUZZER_PIN, 1000, 5000); // 1000 Hz tone for 5 second
} else {
noTone(BUZZER_PIN);
}
}