#include <stdio.h>
#include <Wire.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <ArduinoJson.h>
#include <string.h>
#include <stdlib.h>
#include <PubSubClient.h>
#define LED_PIN 32
#define DHT_PIN 15
#define PIR_SENSOR 12
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
// Thông tin MQTT Broker
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "20205013";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
DHTesp dhtSensor;
void reconnect() {
while (!client.connected()) {
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.print("Connected to MQTT broker as ");
Serial.println(clientId);
client.subscribe(mqtt_topic);
} else {
Serial.print("Failed to connect to MQTT broker, rc=");
Serial.print(client.state());
Serial.println(" Trying again in 5 seconds...");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
// Convert payload to string
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Received message: " + message);
Serial.println(message.charAt(0));
// Check if the message topic matches mqtt_topic
if (strcmp(topic, mqtt_topic) == 0) {
if (message.charAt(0) == '{') {
// Bật đèn LED
digitalWrite(LED_PIN, HIGH);
Serial.println("LED turned ON");
} else {
// Tắt đèn LED
digitalWrite(LED_PIN, LOW);
Serial.println("LED turned OFF");
}
}
else{
Serial.println("Wrong topic");
}
delay(5000);
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(9600);
Serial.println("ESP32 collecting sensor data");
// Connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("WiFi Connected!");
// Setup MQTT client
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// Setup LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// Setup pins
pinMode(LED_PIN, OUTPUT);
pinMode(PIR_SENSOR, INPUT);
// Setup DHT sensor
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
void loop() {
// Read DHT22 sensor data
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int temp = data.temperature;
int humid = data.humidity;
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(temp) + "C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + String(humid) + "%");
// Send data via Serial
Serial.println("Temp: " + String(temp) + "C");
Serial.println("Humidity: " + String(humid) + "%");
// Read PIR motion sensor status
int pir_value = digitalRead(PIR_SENSOR);
// Handle PIR motion sensor status
if (pir_value == HIGH) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Motion detected");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("Motion ended");
}
// Reconnect to MQTT broker if necessary
if (!client.connected()) {
reconnect();
}
// Send JSON data to MQTT broker
if (WiFi.status() == WL_CONNECTED) {
StaticJsonDocument<200> root;
root["temperature"] = temp;
root["humidity"] = humid;
String json;
serializeJson(root, json);
Serial.println(json);
if (client.publish(mqtt_topic, json.c_str())) {
Serial.println("Message published successfully");
} else {
Serial.println("Failed to publish message");
}
delay(2000);
}
// Listen for messages from MQTT broker
client.loop();
}