#include "DHTesp.h"
#include <NusabotSimpleTimer.h>
#include <MQTT.h>
#include <WiFi.h>
const int PIR_PIN = 2;
const int LAMP_PIN = 12;
const int FAN_PIN = 13;
const int DHT_PIN = 15;
int PIR_status;
float suhu,kelembaban;
DHTesp dhtSensor;
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
NusabotSimpleTimer timer;
void publishData() {
//publish data sensor PIR dan DHT22 (suhu dan kelembaban)
client.publish("nusabot/PIR", String(digitalRead(PIR_PIN)), false, 1);
client.publish("nusabot/suhu", String(suhu, 2), false, 1);
client.publish("nusabot/kelembaban", String(kelembaban, 1), false, 1);
Serial.println("Data sudah dipublish");
}
void connect() {
//tunggu sampai dengan terhubung ke WiFi
Serial.print("Memeriksa WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
//Tunggu sampai dengan terhubung ke Broker
Serial.print("Menghubungkan ke Broker");
while (!client.connect("dadasdawfbsrvergv")) {
Serial.print(".");
delay(1000);
}
Serial.println("Terhubung!");
//Subscribe semua data di nusabot
client.subscribe("nusabot/#");
}
void pesanDiterima(String &topic, String &payload) {
//Tampilkan topik dan payload yang diterima
Serial.println("Data masuk:" + topic + " - " + payload);
//kendalikan lampu berdasarkan isi payload pada topik nusabot/lamp
if(topic == "nusabot/lamp" && payload=="1"){
digitalWrite(LAMP_PIN, HIGH);
} else if(topic == "nusabot/lamp" && payload=="0"){
digitalWrite(LAMP_PIN, LOW);
}
//kendalikan fan berdasarkan isi payload pada topik nusabot/fan
if(topic == "nusabot/fan" && payload=="1"){
digitalWrite(FAN_PIN, HIGH);
} else if(topic == "nusabot/fan" && payload=="0"){
digitalWrite(FAN_PIN, LOW);
}
}
void setup() {
//setting pin mode
pinMode(PIR_PIN, INPUT);
pinMode(LAMP_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
Serial.begin(115200);
//start sensor suhu dan kelembaban
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
//Setting koneksi ke WiFi
WiFi.begin(ssid, pass);
//Setting koneksi ke broke MQTT
client.begin("broker.emqx.io", net);
client.onMessage(pesanDiterima);
//set supaya publish data setiap 1000ms
timer.setInterval(1000, publishData);
connect();
}
void loop() {
//baca data suhu dan kelembaban dari DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu = data.temperature;
kelembaban = data.humidity;
client.loop();
timer.run();
delay(1000);
}