#include <Arduino_FreeRTOS.h>
#include <queue.h>
#define LED1_PIN 9
#define LED2_PIN 10
#define LED3_PIN 11
// #define LED4_PIN 12
// #define LED5_PIN 13
#define ANALOG_PIN A2
QueueHandle_t integerQueue;
// Task Function Prototypes
void TaskBlink(void *pvParameters);
void TaskAnalogRead(void *pvParameters);
void TaskIdentitas(void *pvParameters);
void TaskBlinkLED1(void *pvParameters);
void TaskBlinkLED2(void *pvParameters);
void TaskBlinkLED3(void *pvParameters);
// 旋钮控制可变电阻(线性电位器)
int analogValue = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
// pinMode(LED4_PIN, OUTPUT);
// pinMode(LED5_PIN, OUTPUT);
integerQueue = xQueueCreate(10, sizeof(int));
// Task 1:
xTaskCreate(
TaskBlinkLED1,
"Blink LED1",
64,
NULL,
1,
NULL);
// Task 2:
xTaskCreate(
TaskBlinkLED2,
"Blink LED2",
64,
NULL,
1,
NULL);
// Create Task 3:
xTaskCreate(
TaskBlinkLED3,
"Blink LED3",
64,
NULL,
1,
NULL);
}
void loop() {
// put your main code here, to run repeatedly:
// for (int i = 9; i <= 13; i++) {
// digitalWrite(i, HIGH);
// delay(200);
// digitalWrite(i, LOW);
// delay(200);
// }
}
// 任务1 - 控制LED1,闪烁频率为500ms
void TaskBlinkLED1(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount(); //获取系统当前运行的时钟节拍数
const TickType_t xFrequency = 500 / portTICK_PERIOD_MS;
for(;;) {
digitalWrite(LED1_PIN, HIGH);
Serial.println("LED1 ON");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // 绝对延时
digitalWrite(LED1_PIN, LOW);
Serial.println("LED1 OFF");
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
// 任务2 - 控制LED2,闪烁频率为1000ms
void TaskBlinkLED2(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount(); //获取系统当前运行的时钟节拍数
const TickType_t xFrequency = 1000 / portTICK_PERIOD_MS;
for(;;) {
digitalWrite(LED2_PIN, HIGH);
Serial.println("LED2 ON");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // 绝对延时
digitalWrite(LED2_PIN, LOW);
Serial.println("LED2 OFF");
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
// 任务3 - 控制LED3,闪烁频率为2000ms
void TaskBlinkLED3(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount(); //获取系统当前运行的时钟节拍数
const TickType_t xFrequency = 2000 / portTICK_PERIOD_MS;
for(;;) {
digitalWrite(LED3_PIN, HIGH);
Serial.println("LED3 ON");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // 绝对延时
digitalWrite(LED3_PIN, LOW);
Serial.println("LED3 OFF");
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
// Task 1 - LED Blink
void TaskBlink(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount(); //获取系统当前运行的时钟节拍数
// Periode delay task (2000 ms)定时
const TickType_t xFrequency = 2000 / portTICK_PERIOD_MS;
for(;;) {
digitalWrite(LED1_PIN, HIGH);
Serial.println("LED ON");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // 绝对延时
digitalWrite(LED1_PIN, LOW);
Serial.println("LED OFF");
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
// Task 2 -
void TaskAnalogRead(void *pvParameters) {
// potentiometer可变电阻
TickType_t xLastWakeTime = xTaskGetTickCount();
// Periode delay task (500 ms)
const TickType_t xFrequency = 500 / portTICK_PERIOD_MS;
for(;;) {
analogValue = analogRead(ANALOG_PIN); // read pin A2
xQueueSend(integerQueue, &analogValue, portMAX_DELAY);
Serial.print("可变电阻值为 : ");
Serial.println(analogValue);
vTaskDelayUntil(&xLastWakeTime, xFrequency); // Delay
}
}
// Task 3 - Serial Monitor
void TaskSendInfo(void *pvParameters) {
//
int receivedADCValue;
TickType_t xLastWakeTime = xTaskGetTickCount();
// Periode delay task (5000 ms)
const TickType_t xFrequency = 5000 / portTICK_PERIOD_MS;
for(;;) {
if (xQueueReceive(integerQueue, &receivedADCValue, portMAX_DELAY) == pdPASS) {
Serial.print("SendInfo-传输数据:");
Serial.println(receivedADCValue);
}
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}