#include <Arduino_FreeRTOS.h>
#include <queue.h>
// Định nghĩa chân LED
const int ledPin1 = 8;
const int ledPin2 = 9;
// Tạo hàng đợi có kích thước 5, mỗi phần tử là kiểu int
QueueHandle_t xQueue;
void setup() {
// Khởi tạo Serial Monitor
Serial.begin(9600);
// Khởi tạo chân LED
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// Tạo hàng đợi
xQueue = xQueueCreate(5, sizeof(int));
if (xQueue != NULL) {
// Tạo task gửi dữ liệu
xTaskCreate(SenderTask, "Sender", 128, NULL, 1, NULL);
// Tạo task nhận dữ liệu
xTaskCreate(ReceiverTask, "Receiver", 128, NULL, 1, NULL);
// Bắt đầu scheduler
vTaskStartScheduler();
} else {
Serial.println("Khong the tao hang doi!");
}
}
void loop() {
// Hàm loop() không cần thiết trong trường hợp này
}
// Hàm task gửi dữ liệu
void SenderTask(void *pvParameters) {
int data = 0;
for (;;) {
// Tăng giá trị data mỗi giây
data++;
// Gửi giá trị data vào hàng đợi
xQueueSend(xQueue, &data, portMAX_DELAY);
Serial.print("Da gui gia tri: ");
Serial.println(data);
// Tạm dừng 1 giây
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// Hàm task nhận dữ liệu
void ReceiverTask(void *pvParameters) {
int receivedData;
for (;;) {
// Đọc giá trị từ hàng đợi, timeout sau 1 giây
if (xQueueReceive(xQueue, &receivedData, 1000 / portTICK_PERIOD_MS) == pdTRUE) {
Serial.print("Da nhan gia tri: ");
Serial.println(receivedData);
// Kiểm tra giá trị nhận được và điều khiển LED
if (receivedData >= 4 && receivedData <= 10) {
digitalWrite(ledPin1, LOW); // Tắt LED 8
digitalWrite(ledPin2, HIGH); // Bật LED 9
} else {
digitalWrite(ledPin1, HIGH); // Bật LED 8
digitalWrite(ledPin2, LOW); // Tắt LED 9
}
} else {
Serial.println("Timeout: Khong co du lieu trong hang doi!");
}
// Tạm dừng 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}