#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/queue.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Khai báo hàng đợi
QueueHandle_t sendingQueue;
// Khai báo hàm Task1
void Task1(void *par);
void Task2(void *par);
void Task3(void *par);
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
// Tạo hàng đợi
sendingQueue = xQueueCreate(1, sizeof(float));
if (sendingQueue == NULL) {
Serial.println("Tạo hàng đợi thất bại");
while (1); // Dừng chương trình nếu không tạo được hàng đợi
}
// Tạo tác vụ
xTaskCreatePinnedToCore(Task1, "Task1", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(Task2, "Task2", 2048, NULL, 2, NULL, 0);
xTaskCreatePinnedToCore(Task3, "Task3", 1024, NULL, 3, NULL, 0);
}
void loop() {
// Vòng lặp rỗng
}
float tmp = 0;
void Task1(void *par) {
(void) par;
while (1) {
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
// Gửi dữ liệu vào hàng đợi
if(t != tmp){
if (xQueueSend(sendingQueue, &t, 0) != pdTRUE) {
Serial.println("Gửi dữ liệu vào hàng đợi thất bại");
}else{
tmp = t;
}
}
vTaskDelay(30000);
}
}
void Task2(void *par) {
(void) par;
while (1) {
// Gửi dữ liệu vào hàng đợi
float t;
if (xQueueReceive(sendingQueue, &t, portMAX_DELAY) == pdTRUE) {
lcd.setCursor(0, 0);
lcd.print("Nhiet do: ");
lcd.print(t);
}
vTaskDelay(30000);
}
}
void Task3(void *par){
(void) par;
pinMode(18, OUTPUT);
pinMode(13, INPUT);
while(1){
if(analogRead(13) > 1000){
digitalWrite(18, HIGH);
}else{
digitalWrite(18, LOW);
}
Serial.println(analogRead(13));
vTaskDelay(5000);
}
}