#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <MQTT.h>
#include <NusabotSimpleTimer.h>
#include "DHTesp.h"
#include "ESP32Servo.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiClient net;
MQTTClient client;
NusabotSimpleTimer timer;
DHTesp dhtSensor;
Servo servo;
// WiFi credentials
const char* ssid = "Wokwi-GUEST"; // Nama SSID jaringan WiFi
const char* password = ""; // Kata sandi jaringan WiFi, jika diperlukan
const int pinLED1 = 13;
const int pinLED2 = 12;
const int pinPot = 33;
const int pinDht = 25;
const int pinServo = 18;
int pot, oldPot = 0;
String serial_number = "12345678";
void connect() {
Serial.print("Connecting to ");
Serial.println(ssid);
lcd.setCursor(0, 0);
lcd.print("Connecting to ");
lcd.setCursor(0, 1);
lcd.print(ssid);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi connected");
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP().toString());
client.setWill("rezaskripsi/status/12345678", "offline", true, 1 );
while (!client.connect("clientid-unikreza", "rezaskripsiiotpendaki", "tqFL7reVAQwND53A")) {
Serial.print("*");
delay(500);
}
Serial.println("\nMQTT connected");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BrokerTersambung");
client.publish("rezaskripsi/status/12345678", "online", true, 1);
client.subscribe("rezaskripsi/"+ serial_number +"/led1", 1);
client.subscribe("rezaskripsi/"+ serial_number +"/led2", 1);
client.subscribe("rezaskripsi/"+ serial_number +"/servo", 1); // Subscribe to servo topic
}
void setup() {
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
pinMode(pinPot, INPUT);
servo.attach(pinServo, 500, 2400);
dhtSensor.setup(pinDht, DHTesp::DHT22); // Inisialisasi sensor DHT22 pada pin GPIO 25
Serial.begin(115200);
lcd.init();
lcd.backlight();
WiFi.begin(ssid, password);
client.begin("rezaskripsiiotpendaki.cloud.shiftr.io", net);
client.onMessage(subscribe);
timer.setInterval(500, publishPot);
timer.setInterval(1000, publishDht);
connect();
}
void loop() {
client.loop();
timer.run();
if (WiFi.status() != WL_CONNECTED || !client.connected()) {
connect();
}
delay(1000); // Update delay
}
void subscribe(String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(data);
if(topic == "rezaskripsi/"+ serial_number +"/led1"){
if(data == "nyala"){
digitalWrite(pinLED1, HIGH);
} else if(data == "mati"){
digitalWrite(pinLED1, LOW);
}
} else if(topic == "rezaskripsi/"+ serial_number +"/led2"){
if(data == "nyala"){
digitalWrite(pinLED2, HIGH);
} else if(data == "mati"){
digitalWrite(pinLED2, LOW);
}
}
if(topic == "rezaskripsi/"+ serial_number +"/servo"){
int posServo = data.toInt();
if(posServo >= 0 && posServo <= 180) {
Serial.print("Moving servo to position: ");
Serial.println(posServo);
servo.write(posServo);
} else {
Serial.println("Invalid servo position");
}
}
}
void publishPot(){
pot = analogRead(pinPot);
if(pot != oldPot){
client.publish("rezaskripsi/"+ serial_number +"/potentiometer", String(pot), false, 1);
oldPot = pot;
}
Serial.println(pot);
}
void publishDht(){
// Membaca data dari sensor DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
client.publish("rezaskripsi/"+ serial_number +"/suhu", String(data.temperature, 2), true, 1);
client.publish("rezaskripsi/"+ serial_number +"/kelembaban", String(data.humidity, 1), true, 1);
}