#include <Arduino.h>
#include <Arduino.FreeRTOS.h>
// Pin definitions
const int LED_PIN = 5; // Using Yellow LED for this example
const int SWITCH_PIN = 2; // Left switch for toggling
// Global variables
volatile bool mode = false; // false = steady, true = blinking
volatile bool switchPressed = false; // Tracks switch state change
// Task Handles
TaskHandle_t blinkTaskHandle = NULL;
TaskHandle_t printTaskHandle = NULL;
// Interrupt Service Routine for the switch
void IRAM_ATTR switchISR() {
switchPressed = true; // Set flag for switch press
}
// Task 1: LED Blinking Task
void blinkTask(void *parameter) {
while (true) {
if (mode) { // Blinking mode
digitalWrite(LED_PIN, HIGH);
vTaskDelay(5000 / portTICK_PERIOD_MS); // 5 seconds ON
digitalWrite(LED_PIN, LOW);
vTaskDelay(5000 / portTICK_PERIOD_MS); // 5 seconds OFF
} else { // Steady mode
digitalWrite(LED_PIN, HIGH);
vTaskDelay(100 / portTICK_PERIOD_MS); // Avoid task blocking
}
}
}
// Task 2: Switch Sensing Task
void switchTask(void *parameter) {
while (true) {
if (switchPressed) {
switchPressed = false; // Reset the flag
mode = !mode; // Toggle mode
xTaskNotifyGive(printTaskHandle); // Notify print task
}
vTaskDelay(50 / portTICK_PERIOD_MS); // Debounce delay
}
}
// Task 3: Serial Monitor Print Task
void printTask(void *parameter) {
while (true) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // Wait for notification
if (mode) {
Serial.println("Mode: Blinking");
} else {
Serial.println("Mode: Steady");
}
}
}
void setup() {
// Initialize serial monitor
Serial.begin(115200);
// Set up LED pin as output
pinMode(LED_PIN, OUTPUT);
// Set up switch pin as input with pull-up resistor
pinMode(SWITCH_PIN, INPUT_PULLUP);
// Attach interrupt to the switch
attachInterrupt(digitalPinToInterrupt(SWITCH_PIN), switchISR, FALLING);
// Create tasks
xTaskCreate(blinkTask, "Blink Task", 1000, NULL, 1, &blinkTaskHandle);
xTaskCreate(switchTask, "Switch Task", 1000, NULL, 1, NULL);
xTaskCreate(printTask, "Print Task", 1000, NULL, 1, &printTaskHandle);
}
void loop() {
// Empty since tasks run independently
}