#include <Arduino_FreeRTOS.h>
#include <queue.h>
#define but 2
const int pins1[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4};
const int pins2[] = {31, 30, 29, 28, 27, 26, 25, 24, 23, 22};
const int pins3[] = {41, 40, 39, 38, 37, 36, 35, 34, 33, 32};
const char *taskName[3] = {"1", "2", "3"};
const int *allPins[] = {pins1, pins2, pins3};
int allDelay[3] = {40, 50, 60};
QueueHandle_t MQ;
TaskHandle_t hLed;
void setup() {
Serial.begin(115200);
for (byte i = 0; i < 3; i++) {
xTaskCreate(LedBar, taskName[i], configMINIMAL_STACK_SIZE, i, 0, NULL);
}
xTaskCreate(SerialSend, "Serial Send", configMINIMAL_STACK_SIZE, NULL, 0, NULL);
xTaskCreate(Led, "Serial Send", configMINIMAL_STACK_SIZE, NULL, 0, &hLed);
MQ = xQueueCreate(100, sizeof(String));
}
void LedBar(int i ) {
for (int j = 0; j < 10; j++) {
pinMode(allPins[i][j], OUTPUT);
}
pinMode(but, OUTPUT);
String data;
for (;;) {
int ran = random(1, 11);
if(ran == 10){
xTaskNotifyGive(hLed);
vTaskDelay(pdMS_TO_TICKS(200));
}
for (int8_t j = 0; j < ran; j++) {
digitalWrite(allPins[i][j], HIGH);
vTaskDelay(allDelay[i] / portTICK_PERIOD_MS);
}
data = String(i+1) + " - " + String(ran) + "\n" + "_______________";
xQueueSend(MQ, &data, portMAX_DELAY);
for (int8_t j = ran; 0 <= j; j--) {
digitalWrite(allPins[i][j], LOW);
vTaskDelay(allDelay[i] / portTICK_PERIOD_MS);
}
}
vTaskDelete(NULL);
}
void Led(void *p){
for(;;){
ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
digitalWrite(but, HIGH);
vTaskDelay(pdMS_TO_TICKS(500));
digitalWrite(but, LOW);
vTaskDelay(pdMS_TO_TICKS(250));
}
vTaskDelete(NULL);
}
void SerialSend(void *param){
String data;
for(;;){
xQueueReceive(MQ, &data, portMAX_DELAY);
Serial.println(data);
vTaskDelay(1);
}
vTaskDelete(NULL);
}
void loop() {
}