#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(13, DHT22);
// WiFi settings
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingsBoard settings
const char* mqtt_server = "demo.thingsboard.io";
const char* token = "V9xzVMrXzxJkL5eizRny"; // Token của bạn
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setupWiFi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", token, "")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(9600);
pinMode(19, OUTPUT); //relay
pinMode(23, INPUT); //chuyendong
pinMode(15, OUTPUT); //buzzer
pinMode(14, OUTPUT); //trig
pinMode(12, INPUT); //echo
dht.begin();
setupWiFi(); // Thêm hàm setupWiFi vào đây
client.setServer(mqtt_server, mqtt_port);
lcd.init();
lcd.backlight();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float nhietdo = dht.readTemperature();
float doam = dht.readHumidity();
int cd = digitalRead(23);
// Đọc cảm biến siêu âm
digitalWrite(14, HIGH);
delay(10);
digitalWrite(14, LOW);
float duration_us = pulseIn(12, HIGH);
float distance_cm = 0.034 * (duration_us / 2);
// Xử lý relay và buzzer
if (nhietdo > 50) {
digitalWrite(19, HIGH);
} else {
digitalWrite(19, LOW);
}
if (cd == 1) {
tone(15, 200);
} else {
noTone(15);
}
// Hiển thị lên LCD
lcd.setCursor(0, 0);
lcd.print("ND: ");
lcd.setCursor(4, 0);
lcd.print(nhietdo);
lcd.setCursor(0, 1);
lcd.print("DA: ");
lcd.setCursor(4, 1);
lcd.print(doam);
lcd.setCursor(0, 2);
lcd.print("KC: ");
lcd.setCursor(4, 2);
lcd.print(distance_cm);
lcd.setCursor(0, 3);
lcd.print("CD: ");
lcd.setCursor(4, 3);
lcd.print(cd);
// Gửi dữ liệu lên ThingsBoard
StaticJsonDocument<200> doc;
doc["temperature"] = nhietdo;
doc["humidity"] = doam;
doc["motion"] = cd;
doc["distance"] = distance_cm;
char jsonBuffer[256];
serializeJson(doc, jsonBuffer);
client.publish("v1/devices/me/telemetry", jsonBuffer);
// In ra Serial để debug
Serial.print("Sending message to ThingsBoard: ");
Serial.println(jsonBuffer);
delay(2000); // Gửi dữ liệu mỗi 2 giây
}