#include <WiFi.h>
#include <DHT.h>
#include <ThingsBoard.h>
#include <LiquidCrystal_I2C.h>
// ===== CẤU HÌNH PIN (Theo ảnh mạch của bạn) =====
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_RED 25 // LED sưởi
#define LED_BLUE 26 // LED quạt
#define LED_YELLOW 27 // LED độ ẩm
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* token = "bveRK4xbYhTjhuGNQcPw"; // DÁN TOKEN TỪ DASHBOARD VÀO ĐÂY
const char* server = "thingsboard.cloud";
WiFiClient espClient;
ThingsBoard tb(espClient);
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD 20x4 như trong ảnh
// Hàm xử lý lệnh từ Dashboard
RPC_Response processSetLedMode(const RPC_Data &data) {
int state = data;
digitalWrite(LED_RED, state); // Điều khiển LED Đỏ làm mẫu
return RPC_Response("setLedMode", state);
}
const std::array<RPC_Callback, 1> callbacks = {
RPC_Callback{ "setLedMode", processSetLedMode }
};
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
}
void loop() {
if (!tb.connected()) {
if (tb.connect(server, token)) {
tb.RPC_Subscribe(callbacks.cbegin(), callbacks.cend());
} else { delay(5000); return; }
}
// Đọc cảm biến mỗi 5 giây
static unsigned long lastSend = 0;
if (millis() - lastSend > 5000) {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)) {
lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C");
lcd.setCursor(0, 1); lcd.print("Humi: "); lcd.print(h); lcd.print(" %");
tb.sendTelemetryData("temperature", t);
tb.sendTelemetryData("humidity", h);
}
lastSend = millis();
}
tb.loop();
}