#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Firebase configuration
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// DHT Sensor Configuration
#define DHTPIN 22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pin Definitions
#define PIR_PIN 23
#define RELAY_LIVINGROOM 2
#define RELAY_BEDROOM1 4
#define RELAY_BEDROOM2 16
#define LIGHT_LIVINGROOM 12
#define LIGHT_BEDROOM1 14
#define LIGHT_BEDROOM2 26
#define LIGHT_KITCHEN 27
// LCD Configuration
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables
bool motionNotificationEnabled = true;
bool lastMotionDetected = false;
// Function Prototypes
void setupWiFi();
void setupFirebase();
void setupPins();
void updateLCD(String message);
void updateTemperatureToFirebase();
void controlLightsAndFans();
void handleMotionDetection();
void setup() {
Serial.begin(115200);
// Setup Functions
setupWiFi();
setupFirebase();
setupPins();
dht.begin();
lcd.init();
lcd.backlight();
updateLCD("System Ready");
}
void loop() {
// Update Temperature to Firebase every 5 minutes
static unsigned long lastTempUpdate = 0;
if (millis() - lastTempUpdate >= 300000) { // 5 minutes
updateTemperatureToFirebase();
lastTempUpdate = millis();
}
// Handle Controls
controlLightsAndFans();
// Motion Detection and Notification
handleMotionDetection();
delay(100);
}
// Function Definitions
void setupWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void setupFirebase() {
config.host = ""; // Replace with your Firebase project host
config.api_key = ""; // Replace with your Firebase API key
// Optional: Authentication (if required)
auth.user.email = ""; // Replace with Firebase email
auth.user.password = ""; // Replace with Firebase password
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
Serial.println("Connected to Firebase");
}
void setupPins() {
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_LIVINGROOM, OUTPUT);
pinMode(RELAY_BEDROOM1, OUTPUT);
pinMode(RELAY_BEDROOM2, OUTPUT);
pinMode(LIGHT_LIVINGROOM, OUTPUT);
pinMode(LIGHT_BEDROOM1, OUTPUT);
pinMode(LIGHT_BEDROOM2, OUTPUT);
pinMode(LIGHT_KITCHEN, OUTPUT);
}
void updateLCD(String message) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(message);
}
void updateTemperatureToFirebase() {
float temperature = dht.readTemperature();
if (!isnan(temperature)) {
if (Firebase.RTDB.setFloat(&fbdo, "/temperature", temperature)) {
Serial.println("Temperature updated in Firebase");
String tempDisplay = "Temp: " + String(temperature) + "C";
updateLCD(tempDisplay);
} else {
Serial.println("Failed to update temperature: " + fbdo.errorReason());
}
} else {
Serial.println("Failed to read temperature");
}
}
void controlLightsAndFans() {
// Lights
if (Firebase.RTDB.getBool(&fbdo, "/lights/livingroom")) {
digitalWrite(LIGHT_LIVINGROOM, fbdo.boolData());
}
if (Firebase.RTDB.getBool(&fbdo, "/lights/bedroom1")) {
digitalWrite(LIGHT_BEDROOM1, fbdo.boolData());
}
if (Firebase.RTDB.getBool(&fbdo, "/lights/bedroom2")) {
digitalWrite(LIGHT_BEDROOM2, fbdo.boolData());
}
if (Firebase.RTDB.getBool(&fbdo, "/lights/kitchen")) {
digitalWrite(LIGHT_KITCHEN, fbdo.boolData());
}
// Fans
if (Firebase.RTDB.getBool(&fbdo, "/fans/livingroom")) {
digitalWrite(RELAY_LIVINGROOM, fbdo.boolData());
}
if (Firebase.RTDB.getBool(&fbdo, "/fans/bedroom1")) {
digitalWrite(RELAY_BEDROOM1, fbdo.boolData());
}
if (Firebase.RTDB.getBool(&fbdo, "/fans/bedroom2")) {
digitalWrite(RELAY_BEDROOM2, fbdo.boolData());
}
}
void handleMotionDetection() {
bool motionDetected = digitalRead(PIR_PIN);
if (motionDetected != lastMotionDetected) {
lastMotionDetected = motionDetected;
if (motionDetected && motionNotificationEnabled) {
Firebase.RTDB.setBool(&fbdo, "/motionDetected", true);
Serial.println("Motion detected");
updateLCD("Motion Detected!");
} else {
Firebase.RTDB.setBool(&fbdo, "/motionDetected", false);
}
}
// Allow app to toggle motion notifications
if (Firebase.RTDB.getBool(&fbdo, "/motionNotification")) {
motionNotificationEnabled = fbdo.boolData();
}
}