#include <Arduino_FreeRTOS.h>
#include <queue.h>
QueueHandle_t queue;
// Task gửi dữ liệu
void TaskSendData(void *pvParameters) {
int valueToSend = 0;
while (1) {
valueToSend = random(0, 15); // Sinh ra giá trị ngẫu nhiên từ 0 đến 14
xQueueSend(queue, &valueToSend, portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Gửi dữ liệu mỗi giây
}
}
// Task nhận dữ liệu
void TaskReceiveData(void *pvParameters) {
int receivedValue;
while (1) {
if (xQueueReceive(queue, &receivedValue, 1000 / portTICK_PERIOD_MS) == pdPASS) {
if (receivedValue >= 4 && receivedValue <= 10) {
digitalWrite(8, LOW); // Tắt LED 8
digitalWrite(9, HIGH); // Bật LED 9
} else {
digitalWrite(8, HIGH); // Bật LED 8
digitalWrite(9, LOW); // Tắt LED 9
}
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Đọc hàng đợi mỗi 500 ms
}
}
void setup() {
// Khởi tạo các chân LED
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
// Tạo hàng đợi với chiều dài 10 và kích thước của một phần tử là int
queue = xQueueCreate(10, sizeof(int));
if (queue != NULL) {
// Tạo hai task
xTaskCreate(TaskSendData, "TaskSendData", 128, NULL, 1, NULL);
xTaskCreate(TaskReceiveData, "TaskReceiveData", 128, NULL, 1, NULL);
// Bắt đầu hệ điều hành đa nhiệm FreeRTOS
vTaskStartScheduler();
}
}
void loop() {
// Không sử dụng hàm loop() khi sử dụng FreeRTOS
}