#include <WiFi.h>
#include <Firebase_ESP_Client.h>
//Provide the token generation process info.
#include "addons/TokenHelper.h"
//Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"
// Firebase credentials and database URL
#define API_KEY "AIzaSyDCAJOTaydUVlnCaAcp36ek-DvExwxFmmk"
#define DATABASE_URL "https://adityainfosys-950c6-default-rtdb.asia-southeast1.firebasedatabase.app/"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
int intValue;
float floatValue;
bool signupOK = false;
#define TRIG_PIN 5
#define ECHO_PIN 4
#define RED_LED 16
#define YELLOW_LED 17
#define GREEN_LED 27
void setup(){
Serial.begin(115200);
WiFi.begin("Wokwi-GUEST","");
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
/* Assign the api key (required) */
config.api_key = API_KEY;
/* Assign the RTDB URL (required) */
config.database_url = DATABASE_URL;
/* Sign up */
if (Firebase.signUp(&config, &auth, "", "")){
Serial.println("ok");
signupOK = true;
}
else{
Serial.printf("%s Adityasharma\n", config.signer.signupError.message.c_str());
}
/* Assign the callback function for the long running token generation task */
config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Setup traffic light pins
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
}
void loop() {
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)) {
sendDataPrevMillis = millis();
if (Firebase.RTDB.getInt(&fbdo, "/test/int")) {
if (fbdo.dataType() == "int") {
intValue = fbdo.intData();
Serial.println(intValue);
}
}}
int distance = getDistance(TRIG_PIN, ECHO_PIN);
Serial.println("distance:");
Serial.println(distance);
updateTrafficLights(distance);
delay(1000); // Delay for 1 second before updating Firebase again
}
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
return pulseIn(echoPin, HIGH) / 58;
}
void updateTrafficLights(int distance) {
if (distance < 20) {
// Obstacle detected, update Firebase and turn on red light
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
if(Firebase.RTDB.setInt(&fbdo, "/traffic_light/red", 1)){
Serial.println("PASSED");
Serial.println("PATH: " + fbdo.dataPath());
Serial.println("TYPE: " + fbdo.dataType());
}
else{
Serial.println("FAILED");
Serial.println("REASON: " + fbdo.errorReason());
}
if(Firebase.RTDB.setInt(&fbdo, "/traffic_light/yellow", 0)){
Serial.println("PASSED");
Serial.println("PATH: " + fbdo.dataPath());
Serial.println("TYPE: " + fbdo.dataType());
}
else{
Serial.println("FAILED");
Serial.println("REASON: " + fbdo.errorReason());
}
if(Firebase.RTDB.setInt(&fbdo, "/traffic_light/green", 0)){
Serial.println("PASSED");
Serial.println("PATH: " + fbdo.dataPath());
Serial.println("TYPE: " + fbdo.dataType());
}
else{
Serial.println("FAILED");
Serial.println("REASON: " + fbdo.errorReason());
}
} else if (distance < 50) {
// Prepare to stop, update Firebase and turn on yellow light
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/red", 0);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/yellow", 1);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/green", 0);
} else {
// Safe to go, update Firebase and turn on green light
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/red", 0);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/yellow", 0);
Firebase.RTDB.setInt(&fbdo, "/traffic_light/green", 1);
}
}