#include <WiFi.h>
#include <MQTT.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <NusabotSimpleTimer.h>
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const int pinRed = 25;
const int pinGreen = 26;
const int pinBlue = 27;
const int pinServo = 18;
const int pinDHT = 15;
WiFiClient net;
MQTTClient client;
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16,2);
DHTesp dht;
NusabotSimpleTimer timer;
void connect() {
rgb(1,0,0);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
rgb(0,1,0);
while (!client.connect("123456789", "kelasiot", "passwordkelasiot")) {
delay(1000);
}
rgb(0,0,1);
client.subscribe("kelasiot/#", 1);
client.publish("kelasiot/status/123456789", "Online", true, 1);
}
void setup() {
WiFi.begin(ssid, pass);
client.begin("kelasiot.cloud.shiftr.io", net);
lcd.init();
lcd.backlight();
timer.setInterval(1000, publish);
pinMode(pinRed, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(pinBlue, OUTPUT);
servo.attach(pinServo, 500, 2400);
dht.setup(pinDHT, DHTesp::DHT22);
client.onMessage(subscribe);
client.setWill("kelasiot/status/123456789", "Offline", true, 1);
connect();
}
void loop() {
client.loop();
timer.run();
if (!client.connected()) {
connect();
}
delay(10);
}
void publish(){
TempAndHumidity data = dht.getTempAndHumidity();
client.publish("kelasiot/suhu", String(data.temperature, 2), true, 1);
client.publish("kelasiot/kelembapan", String(data.humidity, 1), true, 1);
}
void subscribe(String &topic, String &data){
if(topic == "kelasiot/servo"){
servo.write(data.toInt());
}
if(topic == "kelasiot/lcd"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(data);
}
}
void rgb(bool red, bool green, bool blue){
digitalWrite(pinRed, red);
digitalWrite(pinGreen, green);
digitalWrite(pinBlue, blue);
}