#include <Arduino.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include "time.h"
// WiFi Credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Firebase things
#define DATABASE_URL "https://reyof1-default-rtdb.firebaseio.com/"
HTTPClient client;
// Define pins
#define trigPin 5
#define echoPin 18
#define ledV 2
#define ledR 4
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
// Variables
int prev = 0;
String tempText = "";
String payload = "";
String sensorID = "HC001";
char timeStringBuff[20];
String ledVBool;
String ledRBool;
String safeDistBool;
bool firebaseInitialized = false;
void setup()
{
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
// Connect to WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
delay(500);
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Connecting to");
LCD.setCursor(0, 1);
LCD.println("Firebase...");
Serial.println("Connecting to Firebase...");
// Connect to Firebase
client.begin(DATABASE_URL);
int httpResponseCode = client.GET();
if (httpResponseCode > 0)
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Connected");
Serial.println("Connected to Firebase, payload:");
payload = client.getString();
Serial.println(payload);
Serial.println();
firebaseInitialized = true;
}
else
{
Serial.print("Failed to connect to Firebase. Error code: ");
Serial.println(httpResponseCode);
// Handle the error as needed
}
// Set up components
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledV, OUTPUT);
pinMode(ledR, OUTPUT);
Serial.println("Green = SAFE DISTANCE");
Serial.println("Red = UNSAFE DISTANCE");
// Indicate the start of Data Transmission
for (int i = 0; i < 5; i++)
{
digitalWrite(ledV, HIGH);
digitalWrite(ledR, HIGH);
delay(200);
digitalWrite(ledV, LOW);
digitalWrite(ledR, LOW);
delay(200);
}
// Time
configTime(-9000, -9000, "1.mx.pool.ntp.org");
}
void loop()
{
long sure, mesafe;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(2);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH);
mesafe = (sure / 2) / 29.1;
if (prev != mesafe || !firebaseInitialized)
{
if (mesafe > 200 || mesafe < 0)
{
digitalWrite(ledV, HIGH);
digitalWrite(ledR, LOW);
tempText = "SAFE DISTANCE: ";
ledVBool = "true";
ledRBool = "false";
safeDistBool = "true";
}
else
{
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
tempText = "UNSAFE DISTANCE: ";
ledVBool = "false";
ledRBool = "true";
safeDistBool = "false";
}
struct tm timeinfo;
if (!getLocalTime(&timeinfo))
{
Serial.println("Time Error");
}
strftime(timeStringBuff, sizeof(timeStringBuff), "%d/%m/%Y %H:%M", &timeinfo);
Serial.println(String(timeStringBuff));
// Sending data to Firebase
sendFirebaseUpdate(mesafe, timeStringBuff);
// Displaying data on LCD and Serial
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(tempText);
LCD.setCursor(0, 1);
LCD.print(mesafe);
Serial.print(tempText);
Serial.print(mesafe);
Serial.println(" cm");
}
prev = mesafe;
delay(500);
}
void sendFirebaseUpdate(long distance, const char* timestamp)
{
// Sending data to Firebase
String jsonPayload = "{\"Sensores\": {";
jsonPayload += "\"time\": \"" + String(timestamp) + "\",";
jsonPayload += "\"Distancia\": " + String(distance) + ",";
jsonPayload += "\"safeDist\": " + safeDistBool + ",";
jsonPayload += "\"id\": \"" + sensorID + "\"";
jsonPayload += "},";
jsonPayload += "\"Led\": {";
jsonPayload += "\"ledV\": " + ledVBool + ",";
jsonPayload += "\"ledR\": " + ledRBool;
jsonPayload += "}}";
int responseCode = client.PATCH(jsonPayload);
if (responseCode > 0)
{
Serial.print("Firebase update successful. Response code: ");
Serial.println(responseCode);
}
else
{
Serial.print("Firebase update failed. Error code: ");
Serial.println(responseCode);
}
}