#include <WiFi.h>
#include <MQTT.h>
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "syahban.cloud.shiftr.io";
const char* mqttUser = "syahban";
const char* mqttPassword = "websitecuy";
const int mqttPort = 1883;
const int DHT_PIN = 16;
float lastTemp = 0.0;
float lastHumidity = 0.0;
DHTesp dhtSensor;
WiFiClient net;
MQTTClient client;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
const int SERVO_PIN = 12;
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
myServo.attach(SERVO_PIN);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
client.begin(mqttServer, mqttPort, net);
client.onMessage(messageReceived);
connectToMQTT();
client.subscribe("home/lcd");
client.subscribe("home/servo");
client.subscribe("home/temp");
client.subscribe("home/humidity");
}
void connectToMQTT() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
} else {
Serial.print("MQTT connection failed! State: ");
Serial.println(client.lastError());
delay(2000);
}
}
}
void messageReceived(String &topic, String &payload) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
Serial.println(payload);
if (topic == "home/lcd") {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(payload.substring(0, 16));
if (payload.length() > 16) {
lcd.setCursor(0, 1);
lcd.print(payload.substring(16, 32));
}
}
else if (topic == "home/servo") {
int angle = payload.toInt();
angle = constrain(angle, 0, 180);
myServo.write(angle);
Serial.println("Servo moved to: " + String(angle));
}
}
void loop() {
if (!client.connected()) {
connectToMQTT();
}
client.loop();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float currentTemp = data.temperature;
float currentHumidity = data.humidity;
if (abs(currentTemp - lastTemp) >= 0.1) {
String tempStr = String(currentTemp, 2);
client.publish("home/temp", tempStr);
Serial.println("Published new temperature: " + tempStr);
lastTemp = currentTemp;
}
if (abs(currentHumidity - lastHumidity) >= 0.1) {
String humidityStr = String(currentHumidity, 1);
client.publish("home/humidity", humidityStr);
Serial.println("Published new humidity: " + humidityStr);
lastHumidity = currentHumidity;
}
delay(2000);
}