#include <DHT.h>
#include <LiquidCrystal.h>
#include <Arduino_FreeRTOS.h>
#define DHTPIN A4 // Chân kết nối cảm biến DHT22
#define DHTTYPE DHT22 // Loại cảm biến là DHT22
#define LCD_RS 9 // Chân RS của màn hình LCD
#define LCD_ENABLE 10 // Chân ENABLE của màn hình LCD
#define LCD_D4 11 // Chân D4 của màn hình LCD
#define LCD_D5 12 // Chân D5 của màn hình LCD
#define LCD_D6 13 // Chân D6 của màn hình LCD
#define LCD_D7 8 // Chân D7 của màn hình LCD
#define SAMPLE_COUNT 10 // Số lượng mẫu để tính trung bình
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(LCD_RS, LCD_ENABLE, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
void TaskDHT(void *pvParameters);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // Khởi tạo màn hình LCD 16x2
dht.begin(); // Khởi động cảm biến DHT22
xTaskCreate(TaskDHT, "DHT_Task", 128, NULL, 1, NULL); // Tạo task đọc dữ liệu từ cảm biến DHT22
}
void loop() {
// Không có code ở hàm loop khi sử dụng FreeRTOS
}
void TaskDHT(void *pvParameters) {
(void)pvParameters;
for (;;) {
float temp = 0;
float hum = 0;
// Đọc dữ liệu từ cảm biến DHT22 và tính trung bình
for (int i = 0; i < SAMPLE_COUNT; i++) {
temp += dht.readTemperature();
hum += dht.readHumidity();
delay(1000); // Chờ 1 giây giữa các lần đọc
}
temp /= SAMPLE_COUNT;
hum /= SAMPLE_COUNT;
// Hiển thị thông tin lên màn hình LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print("%");
// Hiển thị thông tin trên Serial Monitor
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print("°C, Humidity: ");
Serial.print(hum);
Serial.println("%");
vTaskDelay(5000 / portTICK_PERIOD_MS); // Chờ 5 giây trước khi đọc dữ liệu tiếp theo
}
}