#include <WiFi.h>
#include "DHT.h"
#include "ThingSpeak.h"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak settings
unsigned long myChannelNumber = 3287246;
const char * myWriteAPIKey = "BEEB0I5OLRUG43TQ";
WiFiClient client;
// DHT Sensor
#define DHTPIN 4
#define DHTTYPE DHT22
// Pin Definitions (ESP32 GPIO)
#define PIR_PIN 15
#define LIGHT_RELAY_PIN 2
#define FAN_RELAY_PIN 5
DHT dht(DHTPIN, DHTTYPE);
// Fan temperature threshold
float fanTempThreshold = 30.0;
// ThingSpeak timer
unsigned long lastThingSpeakUpdate = 0;
const unsigned long updateInterval = 20000;
void connectWiFi()
{
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi Connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void setup()
{
Serial.begin(115200);
dht.begin();
pinMode(PIR_PIN, INPUT);
pinMode(LIGHT_RELAY_PIN, OUTPUT);
pinMode(FAN_RELAY_PIN, OUTPUT);
// Relays OFF initially
digitalWrite(LIGHT_RELAY_PIN, HIGH);
digitalWrite(FAN_RELAY_PIN, HIGH);
connectWiFi();
ThingSpeak.begin(client);
Serial.println("Smart Fan and Light Control Started");
}
void loop()
{
// reconnect WiFi if disconnected
if (WiFi.status() != WL_CONNECTED)
{
connectWiFi();
}
// Read DHT Sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Read PIR
int motion = digitalRead(PIR_PIN);
// Check sensor error
if (isnan(temperature) || isnan(humidity))
{
Serial.println("DHT Sensor Error!");
delay(2000);
return;
}
// Light Control using PIR
if (motion == HIGH)
{
digitalWrite(LIGHT_RELAY_PIN, LOW); // Light ON
}
else
{
digitalWrite(LIGHT_RELAY_PIN, HIGH); // Light OFF
}
// Fan Control using Temperature
if (temperature > fanTempThreshold)
{
digitalWrite(FAN_RELAY_PIN, LOW); // Fan ON
}
else
{
digitalWrite(FAN_RELAY_PIN, HIGH); // Fan OFF
}
int lightStatus = (digitalRead(LIGHT_RELAY_PIN) == LOW) ? 1 : 0;
int fanStatus = (digitalRead(FAN_RELAY_PIN) == LOW) ? 1 : 0;
Serial.println("------ SYSTEM STATUS ------");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Motion: ");
Serial.println(motion ? "Detected" : "Not Detected");
Serial.print("Light: ");
Serial.println(lightStatus ? "ON" : "OFF");
Serial.print("Fan: ");
Serial.println(fanStatus ? "ON" : "OFF");
// Send data to ThingSpeak every 20 seconds
if (millis() - lastThingSpeakUpdate >= updateInterval)
{
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, motion);
ThingSpeak.setField(4, lightStatus);
ThingSpeak.setField(5, fanStatus);
int response = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (response == 200)
{
Serial.println("ThingSpeak Update Successful");
}
else
{
Serial.print("ThingSpeak Error Code: ");
Serial.println(response);
}
lastThingSpeakUpdate = millis();
}
delay(2000);
}