#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const char* THINGSBOARD_SERVER = "thingsboard.cloud";
const char* ACCESS_TOKEN = "your_access_token";
WiFiClient espClient;
PubSubClient client(espClient);
#define DHT_PIN 32
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
#define LED_PIN 2
void callback(char* topic, byte* payload, unsigned int length) {
String topicStr = String(topic);
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Topic: "); Serial.println(topicStr);
Serial.print("Message: "); Serial.println(message);
if (topicStr.startsWith("v1/devices/me/rpc/request/")) {
if (message.indexOf("true") > 0) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED ON (RPC)");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF (RPC)");
}
String responseTopic = topicStr;
responseTopic.replace("request", "response");
client.publish(responseTopic.c_str(), message.c_str());
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dht.begin();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Đang kết nối WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n Đã kết nối WiFi!");
// Kết nối MQTT ThingsBoard
client.setServer(THINGSBOARD_SERVER, 1883);
client.setCallback(callback);
while (!client.connected()) {
if (client.connect("ESP32", ACCESS_TOKEN, NULL)) {
Serial.println("Connected to ThingsBoard");
client.subscribe("v1/devices/me/rpc/request/+");
} else {
Serial.print(".");
delay(500);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
Serial.printf("Temperature: %.2f°C, Humidity: %.2f%%\n",
temperature, humidity);
// Gửi dữ liệu lên ThingsBoard
String payload = "{";
payload += "\"temperature\":" + String(temperature) + ",";
payload += "\"humidity\":" + String(humidity);
payload += "}";
Serial.print("Gửi dữ liệu: ");
Serial.println(payload);
client.publish("v1/devices/me/telemetry", payload.c_str());
delay(5000);
}
// Hàm kết nối lại MQTT nếu bị mất kết nối
void reconnect() {
while (!client.connected()) {
Serial.print("Đang kết nối MQTT...");
if (client.connect("ESP32_Client", ACCESS_TOKEN, "")) {
Serial.println("Kết nối MQTT thành công!");
client.subscribe("v1/devices/me/rpc/request/+");
} else {
Serial.print("Thất bại, mã lỗi: ");
Serial.println(client.state());
delay(2000);
}
}
}