#include <Arduino_FreeRTOS.h>
#include <queue.h>
// Khai báo queue
QueueHandle_t xQueue;
const int ledPin1 = 8; // LED 1 nối với chân 8
const int ledPin2 = 9; // LED 2 nối với chân 9
void taskSendData(void *pvParameters) {
int value = 0;
while (1) {
// Gửi giá trị vào queue
xQueueSend(xQueue, &value, portMAX_DELAY);
// Tăng giá trị và reset nếu vượt quá 15
value = (value + 1) % 16;
// Delay 1 giây
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void taskReceiveData(void *pvParameters) {
int receivedValue;
while (1) {
// Nhận giá trị từ queue, đợi tối đa 1 giây nếu queue rỗng
if (xQueueReceive(xQueue, &receivedValue, pdMS_TO_TICKS(1000)) == pdTRUE) {
// In giá trị nhận được
Serial.print("Received value: ");
Serial.println(receivedValue);
// Điều khiển LED dựa trên giá trị nhận được
if (receivedValue >= 4 && receivedValue <= 10) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
} else {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
}
// Delay 500 ms trước khi kiểm tra lại
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void setup() {
Serial.begin(9600);
// Thiết lập chân LED
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// Bật LED 1 và tắt LED 2 ban đầu
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
// Tạo queue với 10 phần tử, mỗi phần tử là một số nguyên
xQueue = xQueueCreate(10, sizeof(int));
if (xQueue != NULL) {
// Tạo các task
xTaskCreate(taskSendData, "Send Data", 128, NULL, 1, NULL);
xTaskCreate(taskReceiveData, "Receive Data", 128, NULL, 1, NULL);
// Bắt đầu scheduler
vTaskStartScheduler();
}
}
void loop() {
// Không cần làm gì trong loop vì FreeRTOS sẽ quản lý các task
}