#include <Arduino.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://upcpre202401si572sandbox-default-rtdb.firebaseio.com/.json"
HTTPClient client;
//Pin Setup
#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;
void setup()
{
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
// 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...");
// Make Firebase Request
client.begin(DATABASE_URL);
int httpResponseCode=client.GET();
if (httpResponseCode>0) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Connected");
Serial.println("connected, Firebase payload:");
payload = client.getString();
Serial.println(payload);
Serial.println();
}
// Components
// Distance Sensor setup
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// LED Actuators setup
pinMode(ledV, OUTPUT);
pinMode(ledR, OUTPUT);
Serial.println("Green = Safe");
Serial.println("Red = Unsafe");
// User-oriented Activity Start
for (int i=0; i<5; i++) {
digitalWrite(ledV, HIGH);
digitalWrite(ledR, HIGH);
delay(200);
digitalWrite(ledV, LOW);
digitalWrite(ledR, LOW);
delay(200);
}
// Time Provider setup
configTime(-9000, -9000, "1.south-america.pool.ntp.org");
}
void loop()
{
// Setup initial state
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;
// Check Distance Safe status
if(prev!=mesafe) {
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";
}
// Build Data Record
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Time Err");
}
strftime(timeStringBuff, sizeof(timeStringBuff), "%d/%m/%Y %H:%M", &timeinfo);
Serial.println(String(timeStringBuff));
// Make Update Status Request
client.PATCH("{\"Status/Sensors/time\":\"" + String(timeStringBuff) + "\"}");
client.PATCH("{\"Status/Led/ledV\":" + ledVBool + "}");
client.PATCH("{\"Status/Led/ledR\":" + ledRBool + "}");
client.PATCH("{\"Status/Sensors/Distance\":" + String(mesafe) + "}");
client.PATCH("{\"Status/Sensors/safeDist\":" + safeDistBool + "}");
client.PATCH("{\"Status/Sensors/id\":\"" + sensorID + "\"}");
client.POST("{\"Status/Sensors/time\":\"" + String(timeStringBuff) + "\"}");
client.POST("{\"Status/Led/ledV\":" + ledVBool + "}");
client.POST("{\"Status/Led/ledR\":" + ledRBool + "}");
client.POST("{\"Status/Sensors/Distance\":" + String(mesafe) + "}");
client.POST("{\"Status/Sensors/safeDist\":" + safeDistBool + "}");
client.POST("{\"Status/Sensors/id\":\"" + sensorID + "\"}");
// Show Status
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");
}
// Update last Read
prev = mesafe;
delay(500);
}