#include <WiFi.h>
#include <PubSubClient.h>
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const char *mqtt_server = "io.adafruit.com";
const int mqtt_port = 1883;
const char *mqtt_user = "jaki123";
const char *mqtt_password = "aio_DHjC30TvK2eczR469pqAcoYTV7DN";
const int trigPin = 13; // Pin Trig sensor ultrasonik
const int echoPin = 12; // Pin Echo sensor ultrasonik
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Baca tinggi air dari sensor ultrasonik
int waterLevel = readWaterLevel();
// Tentukan ketinggian air relatif terhadap tingkat rendah
int relativeWaterLevel = 400 - waterLevel; // Anggap max jarak sensor 400cm
// Kirim data ke topik MQTT
char topic[50];
sprintf(topic, "jaki123/feeds/monitoring-water-level"); // Ganti dengan feed yang sesuai
client.publish(topic, String(relativeWaterLevel).c_str());
Serial.print("Water Level = ");
Serial.print(relativeWaterLevel);
Serial.println(" CM");
delay(5000); // Kirim data setiap 5 detik
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("Connected to MQTT Broker");
} else {
Serial.print("Failed to connect to MQTT Broker, retrying in 5 seconds...");
delay(5000);
}
}
}
int readWaterLevel() {
// Pengukuran tinggi air dari sensor ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH);
int waterLevel = duration / 29 / 2; // Konversi waktu menjadi ketinggian (dalam cm), karena kecepatan suara adalah 343m/s
Serial.print("Sensor Read: ");
Serial.print(waterLevel);
Serial.println(" cm");
return waterLevel;
}