#include <WiFi.h>
#include <MQTT.h>
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
#define ledGreen 27
#define ledYellow 26
#define ledRed 25
#define trigPin 23
#define echoPin 22
long duration;
int distance;
unsigned long lastMillis = 0;
void connect(){
// Menghubungkan ke WiFi
Serial.print("Cek WiFi");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke WiFi");
// Menghubungkan ke Broker
Serial.print("Cek Broker");
while(!client.connect("")){ // Client ID boleh dikosongkan
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke Server");
client.subscribe("tugas12/iot/#", 1); // subscribe dengan QoS 1
}
void ultrasonic(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
}
void publishStatus() {
client.publish("tugas12/iot/ledGreen/status", digitalRead(ledGreen) ? "1" : "0", true, 1);
client.publish("tugas12/iot/ledYellow/status", digitalRead(ledYellow) ? "1" : "0", true, 1);
client.publish("tugas12/iot/ledRed/status", digitalRead(ledRed) ? "1" : "0", true, 1);
}
void setup() {
Serial.begin(115200);
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
WiFi.begin(ssid, pass);
client.begin("broker.emqx.io", net);
connect();
}
void loop() {
client.loop();
ultrasonic();
if (distance <= 50) {
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
} else if (distance <= 100) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
} else if (distance <= 200) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
} else {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
}
publishStatus(); // Publish status of all LEDs
if (millis() - lastMillis > 1000) {
lastMillis = millis();
client.publish("tugas12/iot/water/level", String(distance), true, 1); // publish water level
}
delay(1000);
}