#include <WiFi.h>
#include <MQTT.h>
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
#define ledRed 27
#define ledYellow 26
#define ledGreen 25
#define buzzer 33
const int trigPin = 23;
const int 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("labskitoo/iot/#", 1); // subcribe dengan QoS 1
}
void broconnect(){
client.begin("broker.emqx.io", net);
client.onMessage(subscribeData);
Serial.print("Connect Broker");
while(!client.connect("")){ // Client ID boleh dikosongkan
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke Server");
client.subscribe("labkite/iot/#", 1);
}
void subscribeData(String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(data);
if(topic == "labskitoo/iot/led1"){
digitalWrite(ledRed, data.toInt()); //control led 1
if(data=="1"){
client.publish("labskitoo/iot/led1/status", "ON", true, 1);
}client.publish("labskitoo/iot/led1/status", "OFF", true, 1);
}
if(topic == "labskitoo/iot/led2"){
digitalWrite(ledYellow, data.toInt()); //control led 2
if(data=="1"){
client.publish("labskitoo/iot/led2/status", "ON", true, 1);
}client.publish("labskitoo/iot/led2/status", "OFF", true, 1);
}
if(topic == "labskitoo/iot/led3"){
digitalWrite(ledGreen, data.toInt()); //control led 2
if(data=="1"){
client.publish("labskitoo/iot/led3/status", "ON", true, 1);
}client.publish("labskitoo/iot/led3/status", "OFF", true, 1);
}
}
void publish(){
ultrasonic();
client.publish("labskitoo/iot/us/cm", String(distance), true, 1); // publish variabel humidity ke topic labskite/iot/dht/humi 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);
if(distance >= 0 && distance <= 50){
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
client.publish("labskitoo/iot/led1/status", "ON", true, 1);
tone(buzzer, 1000); // Mengaktifkan buzzer
delay(1); // Suara buzzer setiap 0.1 detik
noTone(buzzer); // Mematikan buzzer
delay(1); // Waktu jeda
}else if (distance > 50 && distance <= 100) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
client.publish("labskitoo/iot/led2/status", "ON", true, 1);
tone(buzzer, 1000); // Mengaktifkan buzzer
delay(2); // Suara buzzer setiap 0.2 detik
noTone(buzzer); // Mematikan buzzer
delay(2);
}else if (distance > 100 && distance <= 200) {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
client.publish("labskitoo/iot/led3/status", "ON", true, 1);
tone(buzzer, 1000); // Mengaktifkan buzzer
delay(3); // Suara buzzer setiap 0,3 detik
noTone(buzzer); // Mematikan buzzer
delay(3);
}else {
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
client.publish("labskitoo/iot/led1/status", "OFF", true, 1);
client.publish("labskitoo/iot/led2/status", "OFF", true, 1);
client.publish("labskitoo/iot/led3/status", "OFF", true, 1);
noTone(buzzer);
}
//delay(20);
}
void setup() {
Serial.begin(115200);
pinMode(ledRed,OUTPUT);
pinMode(ledYellow,OUTPUT);
pinMode(ledGreen,OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
WiFi.begin(ssid, pass);
client.begin("broker.emqx.io", net);
client.onMessage(subscribeData);
connect();
}
void loop() {
client.loop();
// publish a message roughly every second.
if (millis() - lastMillis > 1000) {
lastMillis = millis();
//publish();
// broconnect();
ultrasonic();
}
delay(10);
}