#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqtt_broker = "broker.emqx.io";
const char* topic = "esp32/section";
const int mqtt_port = 1883;
// MQTT and DHT configuration
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(4, DHT22); // DHT sensor on GPIO 4
// LCD configuration
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adjust 0x27 to your LCD I2C address
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Initialize LCD
lcd.init();
lcd.backlight();
// Show "Connecting..." on LCD while connecting to WiFi
lcd.setCursor(0, 0);
lcd.print("Connecting...");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi!");
lcd.clear();
lcd.print("WiFi Connected");
// Connect to MQTT Broker
client.setServer(mqtt_broker, mqtt_port);
while (!client.connected()) {
String client_id = "esp32-" + String(WiFi.macAddress());
if (client.connect(client_id.c_str())) {
Serial.println("Connected to MQTT Broker!");
lcd.setCursor(0, 1);
lcd.print("MQTT Connected");
} else {
Serial.println("MQTT connection failed. Retrying...");
delay(2000);
}
}
// Initialize DHT sensor
dht.begin();
delay(2000); // Delay to stabilize
lcd.clear();
lcd.print("Setup Complete");
delay(2000); // Show setup complete message for a short time
}
void loop() {
client.loop(); // Handle MQTT client connection
// Read temperature and humidity
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Check if readings are valid
if (!isnan(temperature) && !isnan(humidity)) {
// Publish data to MQTT
String payload = String("{\"temperature\":") + temperature + ",\"humidity\":" + humidity + "}";
client.publish(topic, payload.c_str());
Serial.println("Data published: " + payload);
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(temperature) + " C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + String(humidity) + " %");
} else {
// Handle sensor error
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
}
// Delay before the next reading
delay(5000); // 5 seconds
}