#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
// Wi-Fi credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Firebase project URL and API Key
#define DATABASE_URL "https://hantu-815c4-default-rtdb.asia-southeast1.firebasedatabase.app"
#define API_KEY "AIzaSyBRS2GWYraVW0XVHibGg5EQe1zx7r-5fWU"
#define LEDBUZ 27
#define TRIG 5
#define ECHO 17
#define BUZZER 26
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define LED 2
unsigned long previousMillis = 0;
unsigned long intervalClose = 1; // 1 ms interval for close distance alert
unsigned long intervalMedium = 3000; // 3 seconds interval for medium distance alert
bool ledState = LOW;
bool buzzerState = LOW;
void setup() {
Serial.begin(115200);
Serial.println("BARISANJUANG!");
pinMode(LEDBUZ, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED, OUTPUT);
lcd.backlight();
lcd.init();
lcd.setCursor(0, 0);
lcd.print("BARISANJUANG");
// Connect to Wi-Fi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
int distance = measureDistance();
sendDataToFirebase("/JARAK", distance);
int value = getDataFromFirebase("/JARAK");
lcd.setCursor(0, 1);
lcd.print("Jarak: ");
lcd.print(distance);
lcd.print(" cm");
if (distance >= 100) {
stopAlert();
} else if (distance > 50 && distance < 100) {
alertMedium();
} else if (distance <= 50) {
alertClose();
}
delay(50); // Delay for debounce
}
void sendDataToFirebase(String path, int value) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(DATABASE_URL) + path + ".json?auth=" + API_KEY;
http.begin(url);
http.addHeader("Content-Type", "application/json");
String payload = String("{\"value\":") + value + "}";
int httpResponseCode = http.PUT(payload);
http.end();
} else {
Serial.println("WiFi Disconnected");
}
}
int getDataFromFirebase(String path) {
int value = 0;
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(DATABASE_URL) + path + ".json?auth=" + API_KEY;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println(payload);
value = payload.toInt();
} else {
Serial.printf("Error code: %d\n", httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi Disconnected");
}
return value;
}
void alertClose() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervalClose) {
previousMillis = currentMillis;
ledState = !ledState;
buzzerState = !buzzerState;
digitalWrite(LEDBUZ, ledState);
if (buzzerState) {
tone(BUZZER, 1000); // Frequency 1000 Hz
} else {
noTone(BUZZER);
}
}
}
void alertMedium() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervalMedium) {
previousMillis = currentMillis;
ledState = !ledState;
buzzerState = !buzzerState;
digitalWrite(LEDBUZ, ledState);
if (buzzerState) {
tone(BUZZER, 1000, 500); // Frequency 1000 Hz, Duration 500 ms
} else {
noTone(BUZZER);
}
}
}
void stopAlert() {
digitalWrite(LEDBUZ, LOW);
noTone(BUZZER);
}
int measureDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
int duration = pulseIn(ECHO, HIGH);
int distance = duration / 58.2; // Convert to centimeters
return distance;
}