/*
Tugas 12 :
2. Membuat 3 kondisi led akan menyala sesuai ketinggian air :
#. Led Hijau on : 0 - 50 cm
#. Led kuning on : 51 - 100 cm
#. Led Merah on : 101 - 200 cm
*/
#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
#define DHT22Pin 5
#define ledRed 27
#define ledBlue 26
DHT dht(DHT22Pin, DHT22);
const int trigPin = 23;
const int echoPin = 22;
long duration;
int distance;
unsigned long lastMillis = 0;
String _statusLed1 = "OFF";
String _statusLed2 = "OFF";
int L_statusLed1 = 0;
int L_statusLed2 = 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("ben/iot/#", 1); // subcribe dengan QoS 1
}
void subscribeData(String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(data);
if(topic == "ben/iot/led1"){
if(data == "1"){
_statusLed1 = "ON";
L_statusLed1 = 1;
} else {
_statusLed1 = "OFF";
L_statusLed1 = 0;
}
digitalWrite(ledRed, data.toInt()); //control led 1
}
if(topic == "ben/iot/led2"){
if(data == "1"){
_statusLed2 = "ON";
L_statusLed2 = 1;
} else {
_statusLed2 = "OFF";
L_statusLed2 = 0;
}
digitalWrite(ledBlue, data.toInt()); //control led 2
}
if(topic == "ben/iot/allLedOn"){
digitalWrite(ledRed, 1);
digitalWrite(ledBlue, 1);
L_statusLed1 = 1;
L_statusLed2 = 1;
}
if(topic == "ben/iot/allLedOff"){
digitalWrite(ledRed, 0);
digitalWrite(ledBlue, 0);
L_statusLed1 = 0;
L_statusLed2 = 0;
}
}
void publish(){
float hum = dht.readHumidity();
float temp = dht.readTemperature();
Serial.print("Temperature : ");
Serial.print(temp);
Serial.print(" C ");
Serial.print("Humidity : ");
Serial.print(hum);
Serial.println(" % ");
ultrasonic();
client.publish("ben/iot/dht/temp", String(temp), true, 1); // publish variabel temperatue ke topic ben/iot/dht/temp dengan QoS 1
client.publish("ben/iot/dht/humi", String(hum), true, 1); // publish variabel humidity ke topic ben/iot/dht/humi dengan QoS 1
client.publish("ben/iot/us/cm", String(distance), true, 1); // publish variabel humidity ke topic ben/iot/dht/humi dengan QoS 1
client.publish("ben/iot/led1/kondisi", String(L_statusLed1), true, 1); // publish variabel humidity ke topic ben/iot/led1/status dengan QoS 1
client.publish("ben/iot/led2/kondisi", String(L_statusLed2), true, 1); // publish variabel humidity ke topic ben/iot/led2/status dengan QoS 1
client.publish("ben/iot/led1/status", String(_statusLed1), true, 1); // publish variabel humidity ke topic ben/iot/led1/status dengan QoS 1
client.publish("ben/iot/led2/status", String(_statusLed2), true, 1); // publish variabel humidity ke topic ben/iot/led2/status dengan QoS 1
// variabel kondisi LED
int jarak_hijau = 0;
int jarak_kuning = 0;
int jarak_merah = 0;
// Set Level ke LED
if(distance <= 50){
jarak_hijau = 1;
} else if(distance <= 100){
jarak_kuning = 1;
} else if(distance < 200){
jarak_merah = 1;
}
// Publish kondisi LED sesuai Level
client.publish("ben/iot/us/cm/hijau", String(jarak_hijau), true, 1);
client.publish("ben/iot/us/cm/kuning", String(jarak_kuning), true, 1);
client.publish("ben/iot/us/cm/merah", String(jarak_merah), true, 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 setup() {
Serial.begin(115200);
pinMode(ledRed,OUTPUT);
pinMode(ledBlue,OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin();
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 > 500) {
lastMillis = millis();
publish();
}
delay(10);
}