#include <WiFi.h>
#include <ThingSpeak.h>
#include <HTTPClient.h>
#include <FirebaseESP32.h>
#define gasPin 34
#define buzzerPin 25
#define RL 10000.0
#define R0 3050.0
#define trigPin 5
#define echoPin 18
#define RELAY_PIN 27
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient client;
unsigned long channelID = 2869806;
const char* writeAPIKey = "6Y3JTFY09CMPEMNC";
#define FIREBASE_HOST "https://your-project-id.firebaseio.com"
#define FIREBASE_AUTH "your-database-secret"
FirebaseData fbdo;
FirebaseConfig config;
FirebaseAuth auth;
bool doorLock = false;
unsigned long unlockTime = 0;
bool isUnlocked = false;
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("\nWi-Fi Connected");
ThingSpeak.begin(client);
config.api_key = FIREBASE_AUTH;
config.database_url = FIREBASE_HOST;
Firebase.reconnectWiFi(true);
Firebase.begin(&config, &auth);
}
void loop() {
reconnectWiFi();
gasSensorTask();
ultrasonicSensorTask();
smartLockTask();
checkLockTimeout();
delay(15000);
}
void gasSensorTask() {
int adcValue = analogRead(gasPin);
float voltage = adcValue * (3.3 / 4095.0);
if (voltage == 0) voltage = 0.0001;
float Rs = (3.3 - voltage) * RL / voltage;
float ratio = Rs / R0;
float ppm = 100 * pow(ratio, -2.6);
digitalWrite(buzzerPin, LOW);
Serial.print("Gas Concentration: ");
Serial.print(ppm);
Serial.println(" ppm");
if (ppm > 500) {
digitalWrite(buzzerPin, HIGH);
delay(1000);
Serial.println("WARNING! High Gas Concentration Detected!");
} else {
digitalWrite(buzzerPin, LOW);
}
ThingSpeak.setField(3, ppm);
int statusCode = ThingSpeak.writeFields(channelID, writeAPIKey);
if (statusCode == 200) {
Serial.println("ThingSpeak (Gas) update successful.");
} else {
Serial.print("ThingSpeak (Gas) update failed, Error code: ");
Serial.println(statusCode);
}
}
void ultrasonicSensorTask() {
long duration;
float distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) {
Serial.println("Ultrasonic sensor timeout");
return;
}
distance = duration * 0.0343 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
String dockStatus = (distance < 100) ? "OCCUPIED" : "AVAILABLE";
Serial.print("Dock Status: ");
Serial.println(dockStatus);
ThingSpeak.setField(2, distance);
int statusCode = ThingSpeak.writeFields(channelID, writeAPIKey);
if (statusCode == 200) {
Serial.println("ThingSpeak (Distance) update successful.");
} else {
Serial.print("ThingSpeak (Distance) update failed, Error code: ");
Serial.println(statusCode);
}
}
void smartLockTask() {
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);
if (!Firebase.setInt(fbdo, "/lock/button", 0)) {
Serial.println("Firebase write failed: " + fbdo.errorReason());
}
isUnlocked = false;
}
}
void sendDataToThingSpeak(bool lockStatus) {
ThingSpeak.setField(1, lockStatus);
int statusCode = ThingSpeak.writeFields(channelID, writeAPIKey);
if (statusCode == 200) {
Serial.println("ThingSpeak (Lock) update successful.");
} else {
Serial.print("ThingSpeak (Lock) update failed, Error code: ");
Serial.println(statusCode);
}
}
void reconnectWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Reconnecting to WiFi...");
WiFi.reconnect();
}
}