#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
#define ledRed 26
#define ledYellow 27
#define ledGreen 14
#define dht22pin 5
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
DHT dht(dht22pin, DHT22);
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("labskite/iot/#", 1); // subcribe dengan QoS 1
}
void reconnect(){
Serial.println("Koneksi terputus. Menghubungkan ke broker");
while(!client.connect("")){ //client ID tidak boleh sama
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke Server");
client.subscribe("labskite/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 == "labskite/iot/led1"){
digitalWrite(ledRed, data.toInt()); //control led 1
//client.publish("labskite/iot/led1/status", "ON", true, 1);
}
if(topic == "labskite/iot/led2"){
digitalWrite(ledYellow, data.toInt()); //control led 2
//client.publish("labskite/iot/led2/status", "ON",true, 1);
}
if(topic == "labskite/iot/led3"){
digitalWrite(ledYellow, data.toInt()); //control led 2
//client.publish("labskite/iot/led3/status", "ON",true, 1);
}
if(topic == "labskite/iot/onsemua"){
digitalWrite(ledRed, HIGH);
//client.publish("labskite/iot/led1/status", "ON", true, 1);
digitalWrite(ledYellow, HIGH);
//client.publish("labskite/iot/led2/status", "ON", true, 1);
digitalWrite(ledGreen, HIGH);
//client.publish("labskite/iot/led3/status", "ON", true, 1);
}
if(topic == "labskite/iot/offsemua"){
digitalWrite(ledRed, LOW);
//client.publish("labskite/iot/led1/status", "OFF", true, 1);
digitalWrite(ledYellow, LOW );
//client.publish("labskite/iot/led2/status", "OFF", true, 1);
digitalWrite(ledGreen, LOW);
//client.publish("labskite/iot/led3/status", "OFF", true, 1);
}
}
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(" % ");
if (temp == 0){
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, LOW);
}
else if (temp < 28){
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, LOW);
//client.publish("labskite/iot/led1", "OFF", true, 1);
//client.publish("labskite/iot/led2", "OFF", true, 1);
//client.publish("labskite/iot/led3", "OFF", true, 1);
}
else if ((temp >= 28) && (temp <= 45)){
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
//client.publish("labskite/iot/led1", "OFF", true, 1);
//client.publish("labskite/iot/led2", "OFF", true, 1);
//client.publish("labskite/iot/led3", "ON", true, 1);
}
else if ((temp > 45) && (temp <= 75)) {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledGreen, LOW);
//client.publish("labskite/iot/led1", "OFF", true, 1);
//client.publish("labskite/iot/led2", "ON", true, 1);
//client.publish("labskite/iot/led3", "OFF", true, 1);
}
else if ((temp > 75) && (hum > 75)) {
digitalWrite(ledRed, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, LOW);
//client.publish("labskite/iot/led1", "ON", true, 1);
//client.publish("labskite/iot/led2", "OFF", true, 1);
//client.publish("labskite/iot/led3", "OFF", true, 1);
}
client.publish("labskite/iot/dht/temp", String(temp), true, 1); // publish variabel pot ke topic labskite/iot/pot1 dengan QoS 1
client.publish("labskite/iot/dht/hum", String(hum), true, 1); // publish variabel pot ke topic labskite/iot/pot1 dengan QoS 1
}
void setup() {
pinMode(ledRed,OUTPUT);
pinMode(ledYellow,OUTPUT);
pinMode(ledGreen,OUTPUT);
dht.begin();
Serial.begin(9600);
WiFi.begin(ssid, pass);
client.begin("broker.emqx.io", net);
client.onMessage(subscribeData);
connect();
}
void loop() {
if (!client.connected()){
reconnect();
}
client.loop();
// publish a message roughly every second.
if (millis() - lastMillis > 1000) {
lastMillis = millis();
publish();
}
delay(100);
}