#include "WiFi.h"
#include <PubSubClient.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingsBoard credentials
const char* thingsboardServer = "thingsboard.cloud"; // Ganti dengan alamat server ThingsBoard Anda jika berbeda
const char* token = "ROIS2M55TYcnOqoRJigi";
// Pin configurations
const int redPin = 15;
const int yellowPin = 2;
const int greenPin = 4;
const int trigPin = 13;
const int echoPin = 12;
WiFiClient espClient;
PubSubClient client(espClient);
long duration;
int distance;
void setup() {
Serial.begin(115200);
delay(10); // Beri waktu untuk serial monitor terbuka
Serial.println("Connecting to WiFi..");
WiFi.begin(ssid, password);
// Coba koneksi WiFi hingga berhasil
int attempts = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
attempts++;
if (attempts >= 60) { // Coba selama 30 detik
Serial.println("Failed to connect to WiFi. Restarting...");
ESP.restart();
}
}
Serial.println("");
Serial.println("Connected to the WiFi network");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(thingsboardServer, 1883);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
connectToThingsBoard();
}
void loop() {
if (!client.connected()) {
connectToThingsBoard();
}
client.loop();
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distance = (duration * 0.034 / 2) + 1;
// Prints the distance in the Serial Monitor
Serial.print("Distance (Tingkat air): ");
Serial.println(distance);
// Sending data to ThingsBoard
String payload = "{";
payload += "\"distance\":"; payload += distance; payload += ",";
payload += "\"status\":\"";
if (distance <= 50) {
digitalWrite(greenPin, HIGH); // turn on the LED
Serial.println("Status Aman");
payload += "Aman";
} else {
digitalWrite(greenPin, LOW);
}
if (distance > 50 && distance <= 150) {
digitalWrite(yellowPin, HIGH); // turn on the LED
Serial.println("Status Waspada");
payload += "Waspada";
} else {
digitalWrite(yellowPin, LOW);
}
if (distance > 150) {
digitalWrite(redPin, HIGH); // turn on the LED
Serial.println("Status Bahaya");
payload += "Bahaya";
} else {
digitalWrite(redPin, LOW);
}
payload += "\"}";
client.publish("v1/devices/me/telemetry", (char*) payload.c_str());
delay(1000);
}
void connectToThingsBoard() {
while (!client.connected()) {
Serial.print("Connecting to ThingsBoard... ");
if (client.connect("ESP32_Device", token, NULL)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}