#include <LiquidCrystal.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
// Cấu hình LCD, DHT22, LED, và MQTT
LiquidCrystal lcd(21, 22, 16, 17, 18, 19);
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define LED_PIN 13
#define BUTTON_PIN 14
#define MQTT_CLIENT_ID "clientidweather"
#define MQTT_BROKER "broker.mqttdashboard.com"
#define MQTT_PORT 1883
#define MQTT_TOPIC "dht22oled"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
TaskHandle_t TaskReadSensorHandle, TaskDisplayLCDHandle, TaskMQTTHandle, TaskButtonHandle;
// Biến toàn cục để lưu giá trị nhiệt độ và độ ẩm
float temperature = 0.0;
float humidity = 0.0;
bool lastButtonState = HIGH, currentButtonState, ledState = false;
void connectWiFi() {
Serial.print("Dang ket noi WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\nWiFi da ket noi!");
}
void connectMQTT() {
while (!mqttClient.connected()) {
if (mqttClient.connect(MQTT_CLIENT_ID)) {
Serial.println("Da ket noi MQTT!");
} else {
Serial.print("Loi ket noi: ");
Serial.println(mqttClient.state());
delay(2000);
}
}
}
void TaskReadSensor(void *pvParameters) {
while (1) {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Loi cam bien DHT22!");
} else {
Serial.printf("Nhiet do: %.1f°C, Do am: %.1f%%\n", temperature, humidity);
}
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
void TaskDisplayLCD(void *pvParameters) {
while (1) {
lcd.setCursor(0, 0);
lcd.print("Nhiet do: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Do am: ");
lcd.print(humidity, 1);
lcd.print(" %");
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void TaskMQTT(void *pvParameters) {
while (1) {
if (!mqttClient.connected()) connectMQTT();
mqttClient.loop();
String payload = "{\"temperature\":" + String(temperature, 2) + ",\"humidity\":" + String(humidity, 2) + "}";
mqttClient.publish(MQTT_TOPIC, payload.c_str());
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
void TaskButton(void *pvParameters) {
while (1) {
currentButtonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && currentButtonState == LOW) {
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
Serial.printf("LED %s\n", ledState ? "ON" : "OFF");
}
lastButtonState = currentButtonState;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
connectWiFi();
mqttClient.setServer(MQTT_BROKER, MQTT_PORT);
lcd.begin(16, 2);
xTaskCreate(TaskReadSensor, "TaskReadSensor", 2048, NULL, 1, &TaskReadSensorHandle);
xTaskCreate(TaskDisplayLCD, "TaskDisplayLCD", 2048, NULL, 1, &TaskDisplayLCDHandle);
xTaskCreate(TaskMQTT, "TaskMQTT", 4096, NULL, 1, &TaskMQTTHandle);
xTaskCreate(TaskButton, "TaskButton", 2048, NULL, 1, &TaskButtonHandle);
}
void loop() {}