#include <Arduino_FreeRTOS.h> // Thư viện cho FreeRTOS trên Arduino
#include <queue.h> // Thư viện cho hàng đợi (queue) trong FreeRTOS
QueueHandle_t xQueue; // Khai báo handle của hàng đợi
void setup() {
// Hàm thiết lập, chạy một lần khi khởi động
pinMode(8, OUTPUT); // Cấu hình chân 8 làm chân xuất tín hiệu (OUTPUT)
pinMode(9, OUTPUT); // Cấu hình chân 9 làm chân xuất tín hiệu (OUTPUT)
Serial.begin(9600); // Khởi động giao tiếp Serial với tốc độ 9600 baud
digitalWrite(8, HIGH); // Đặt mức điện áp cao (HIGH) cho chân 8
digitalWrite(9, LOW); // Đặt mức điện áp thấp (LOW) cho chân 9
xQueue = xQueueCreate(5, sizeof(int)); // Tạo hàng đợi với kích thước 5 và mỗi phần tử có kích thước int
if (xQueue != NULL) { // Kiểm tra xem hàng đợi có được tạo thành công không
xTaskCreate(
SendTask, // Tên hàm task gửi dữ liệu
"Sender", // Tên task
240, // Kích thước stack cho task (240 byte)
NULL, // Tham số truyền cho task (NULL)
1, // Ơn định độ ưu tiên của task
NULL // Handle của task (NULL)
);
xTaskCreate(
ReceiveTask, // Tên hàm task nhận dữ liệu
"Receiver", // Tên task
240, // Kích thước stack cho task (240 byte)
NULL, // Tham số truyền cho task (NULL)
1, // Ơn định độ ưu tiên của task
NULL // Handle của task (NULL)
);
vTaskStartScheduler(); // Bắt đầu scheduler của FreeRTOS
} else {
// Hàng đợi không thể được tạo thành công
}
}
void loop() {
// Hàm chính, chạy liên tục
}
void SendTask(void* pvParameters) {
int value = 0; // Biến lưu giá trị ngẫu nhiên
int i = 1; // Biến đếm số lượng giá trị đã gửi
for(;;) { // Vòng lặp vô hạn cho task gửi dữ liệu
delay(1000); // Dừng 1 giây
value = GetRandom(0, 15); // Lấy giá trị ngẫu nhiên từ 0 đến 15
xQueueSend(xQueue, &value, portMAX_DELAY == pdPASS); // Gửi giá trị vào hàng đợi, chờ không giới hạn nếu hàng đợi đầy
Serial.print("Value"); // In ra "Value"
Serial.print(i); // In ra số thứ tự giá trị
Serial.print(" = ");
Serial.println(value); // In ra giá trị
i++; // Tăng số thứ tự giá trị
}
}
int GetRandom(int min, int max) {
return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX)); // Hàm sinh giá trị ngẫu nhiên trong khoảng từ min đến max
}
void ReceiveTask(void *pvParameters) {
int ReceivedValue = 0; // Biến lưu giá trị nhận được từ hàng đợi
for (;;) { // Vòng lặp vô hạn cho task nhận dữ liệu
delay(500); // Dừng 0.5 giây
if(xQueueReceive(xQueue, &ReceivedValue, 1) == pdPASS) { // Nhận giá trị từ hàng đợi, chờ 1 tick nếu hàng đợi trống
if(ReceivedValue <= 4 || ReceivedValue >= 10) { // Nếu giá trị nhận được <= 4 hoặc >= 10
Serial.print("Received Value: "); // In ra "Received Value: "
Serial.println(ReceivedValue); // In ra giá trị nhận được
digitalWrite(8, HIGH); // Đặt mức điện áp cao (HIGH) cho chân 8
digitalWrite(9, LOW); // Đặt mức điện áp thấp (LOW) cho chân 9
} else {
Serial.print("Received Value: "); // In ra "Received Value: "
Serial.println(ReceivedValue); // In ra giá trị nhận được
digitalWrite(8, LOW); // Đặt mức điện áp thấp (LOW) cho chân 8
digitalWrite(9, HIGH); // Đặt mức điện áp cao (HIGH) cho chân 9
}
}
}
}