#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define FIREBASE_HOST "libritrack-55c60-default-rtdb.firebaseio.com"
#define FIREBASE_AUTH "1FCMsdskRdw58NhGgnmfC2QfRtqvVh0XAHZM7BQ9"
#define TRIG_PIN 5
#define ECHO_PIN 18
#define LED_RED 2
#define LED_GREEN 15
#define OCCUPIED_THRESHOLD_CM 30
long readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
return duration * 0.034 / 2;
}
void sendToFirebase(bool occupied, int distance) {
HTTPClient http;
String url = "https://" + String(FIREBASE_HOST) + "/seats/1.json?auth=" + FIREBASE_AUTH;
String payload = "{\"occupied\":" + String(occupied ? "true" : "false") +
",\"distance_cm\":" + String(distance) + "}";
http.begin(url);
http.addHeader("Content-Type", "application/json");
int responseCode = http.PATCH(payload);
Serial.printf("Firebase response: %d\n", responseCode);
http.end();
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println(" connected!");
}
void loop() {
long dist = readDistance();
bool occupied = (dist > 0 && dist < OCCUPIED_THRESHOLD_CM);
digitalWrite(LED_RED, occupied ? HIGH : LOW);
digitalWrite(LED_GREEN, occupied ? LOW : HIGH);
Serial.printf("Distance: %ldcm → %s\n", dist, occupied ? "OCCUPIED" : "FREE");
sendToFirebase(occupied, (int)dist);
delay(2000);
}