#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <time.h>
#define DHTPIN 26
#define DHTTYPE DHT22
#define BUTTON_PIN 14
#define LED_PIN 19
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const char* mqtt_topic_pub = "IoT/XP/LED/sensor";
const char* mqtt_topic_time = "IoT/XP/LED/time";
const char* mqtt_topic_sub = "IoT/XP/LED/led";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool ledState = false;
unsigned long lastMsg = 0;
char msg[100];
void setup_wifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWiFi connected successfully!");
}
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = 0;
String command = String((char*)payload);
command.toUpperCase();
Serial.print("Received command: ");
Serial.println(command);
if (command == "ON") {
digitalWrite(LED_PIN, HIGH);
ledState = true;
} else if (command == "OFF") {
digitalWrite(LED_PIN, LOW);
ledState = false;
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32ClientDevice")) {
Serial.println("MQTT connected successfully");
client.subscribe(mqtt_topic_sub);
} else {
Serial.print("MQTT connection failed, status=");
Serial.print(client.state());
Serial.println(", retrying in 2 seconds");
delay(2000);
}
}
}
void syncTime() {
Serial.println("Syncing time...");
configTime(8 * 3600, 0, "pool.ntp.org");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.println("Waiting for time sync...");
delay(1000);
}
Serial.println("Time synchronized");
}
void setup() {
Serial.begin(115200);
Serial.println("Starting setup()...");
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
syncTime();
Serial.println("setup() complete, entering loop()");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.printf("Temperature: %.1fC, Humidity: %.1f%%\n", t, h);
struct tm timeinfo;
getLocalTime(&timeinfo);
char timeStr[30];
strftime(timeStr, sizeof(timeStr), "%H:%M:%S", &timeinfo);
snprintf(msg, sizeof(msg), "{\"temp\": %.1f, \"hum\": %.1f}", t, h);
client.publish(mqtt_topic_pub, msg);
client.publish(mqtt_topic_time, timeStr);
lcd.clear();
lcd.setCursor(0, 0);
lcd.printf("T:%.1fC H:%.1f%%", t, h);
lcd.setCursor(0, 1);
lcd.print(timeStr);
}
if (digitalRead(BUTTON_PIN) == LOW) {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
Serial.print("Button pressed, LED: ");
Serial.println(ledState ? "ON" : "OFF");
delay(300);
}
}