#include <Arduino.h>
#include <FreeRTOS.h>
#include <task.h>
// Pin Definitions
#define RED_LED_PIN 2
#define BLUE_LED_PIN 3
#define RED_BUTTON_PIN 4
#define BLUE_BUTTON_PIN 5
#define RED_ACK_BUTTON_PIN 6
#define BLUE_ACK_BUTTON_PIN 7
// Task handles
TaskHandle_t controlTaskRedHandle;
TaskHandle_t controlTaskBlueHandle;
TaskHandle_t blinkTaskRedHandle;
TaskHandle_t blinkTaskBlueHandle;
TaskHandle_t ackTaskHandle;
// Task priorities
#define CONTROL_TASK_RED_PRIORITY 2
#define CONTROL_TASK_BLUE_PRIORITY 2
#define BLINK_TASK_RED_PRIORITY 1
#define BLINK_TASK_BLUE_PRIORITY 1
#define ACK_TASK_PRIORITY 3
// Task periods (in milliseconds)
#define BLINK_TASK_RED_PERIOD 500
#define BLINK_TASK_BLUE_PERIOD 1000
// Task stack sizes (in words)
#define TASK_STACK_SIZE 128
// Global variables for alarm state and acknowledgment state
volatile bool redAlarm = false;
volatile bool blueAlarm = false;
volatile bool redAck = false;
volatile bool blueAck = false;
// Function prototypes
void controlTaskRed(void* pvParameters);
void controlTaskBlue(void* pvParameters);
void blinkTaskRed(void* pvParameters);
void blinkTaskBlue(void* pvParameters);
void ackTask(void* pvParameters);
void setup() {
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
pinMode(RED_BUTTON_PIN, INPUT_PULLUP);
pinMode(BLUE_BUTTON_PIN, INPUT_PULLUP);
pinMode(RED_ACK_BUTTON_PIN, INPUT_PULLUP);
pinMode(BLUE_ACK_BUTTON_PIN, INPUT_PULLUP);
// Create tasks
xTaskCreate(controlTaskRed, "ControlTaskRed", TASK_STACK_SIZE, NULL, CONTROL_TASK_RED_PRIORITY, &controlTaskRedHandle);
xTaskCreate(controlTaskBlue, "ControlTaskBlue", TASK_STACK_SIZE, NULL, CONTROL_TASK_BLUE_PRIORITY, &controlTaskBlueHandle);
xTaskCreate(blinkTaskRed, "BlinkTaskRed", TASK_STACK_SIZE, NULL, BLINK_TASK_RED_PRIORITY, &blinkTaskRedHandle);
xTaskCreate(blinkTaskBlue, "BlinkTaskBlue", TASK_STACK_SIZE, NULL, BLINK_TASK_BLUE_PRIORITY, &blinkTaskBlueHandle);
xTaskCreate(ackTask, "AckTask", TASK_STACK_SIZE, NULL, ACK_TASK_PRIORITY, &ackTaskHandle);
}
void loop() {
// Empty loop as everything is done in tasks
}
void controlTaskRed(void* pvParameters) {
while (1) {
// Read red button state
bool redButtonState = digitalRead(RED_BUTTON_PIN) == LOW;
if (redButtonState) {
// Set red alarm
redAlarm = true;
}
// Delay for debouncing
vTaskDelay(pdMS_TO_TICKS(50));
}
}
void controlTaskBlue(void* pvParameters) {
while (1) {
// Read blue button state
bool blueButtonState = digitalRead(BLUE_BUTTON_PIN) == LOW;
if (blueButtonState) {
// Set blue alarm
blueAlarm = true;
}
// Delay for debouncing
vTaskDelay(pdMS_TO_TICKS(50));
}
}
void blinkTaskRed(void* pvParameters) {
while (1) {
if (redAlarm && !redAck) {
// Toggle red LED state
digitalWrite(RED_LED_PIN, !digitalRead(RED_LED_PIN));
}
Loading
franzininho-wifi
franzininho-wifi