#include <WiFi.h>
#include <HTTPClient.h>
#include <ThingSpeak.h>
#include <FirebaseESP32.h> // Firebase library
#define RELAY_PIN 27 // Connected to LED or Lock
// WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Firebase details
#define FIREBASE_HOST "https://your-project-id.firebaseio.com" // ✅ Add full URL with https://
#define FIREBASE_AUTH "your-database-secret"
// Firebase objects
FirebaseData fbdo;
FirebaseConfig config;
FirebaseAuth auth;
// ThingSpeak
WiFiClient client;
unsigned long channelID = 2869806;
const char* writeAPIKey = "6Y3JTFY09CMPEMNC";
// Variables
bool doorLock = false;
unsigned long unlockTime = 0;
bool isUnlocked = false;
void sendDataToThingSpeak(bool lockStatus) {
if (WiFi.status() == WL_CONNECTED) {
ThingSpeak.setField(1, lockStatus);
int statusCode = ThingSpeak.writeFields(channelID, writeAPIKey);
if (statusCode == 200) {
Serial.println("Channel update successful.");
} else {
Serial.print("Error sending data: ");
Serial.println(statusCode);
}
} else {
Serial.println("WiFi not connected. Data not sent.");
}
}
void reconnectWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Reconnecting to WiFi...");
WiFi.reconnect();
}
}
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("\nConnected to WiFi");
ThingSpeak.begin(client);
// ✅ Firebase Initialization (corrected)
config.api_key = FIREBASE_AUTH; // use legacy token as API key
config.database_url = FIREBASE_HOST;
Firebase.reconnectWiFi(true);
Firebase.begin(&config, &auth);
}
void loop() {
reconnectWiFi();
checkLockTimeout();
// Read virtual button state from Firebase
if (Firebase.getInt(fbdo, "/lock/button")) {
int buttonState = fbdo.intData();
if (buttonState == 1 && !isUnlocked) {
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Door Unlocked");
sendDataToThingSpeak(true);
unlockTime = millis();
isUnlocked = true;
}
} else {
Serial.println("Firebase read failed: " + fbdo.errorReason());
}
}
void checkLockTimeout() {
if (isUnlocked && millis() - unlockTime >= 10000) {
digitalWrite(RELAY_PIN, LOW);
Serial.println("Door Locked");
sendDataToThingSpeak(false);
Firebase.setInt(fbdo, "/lock/button", 0); // Reset button to 0
isUnlocked = false;
}
}