#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <semphr.h>
#define BUTTON_PIN 2
#define LED_PIN 13
#define FLASHING_LED_PIN 9
#define INCREMENT_PIN 19
#define DECREMENT_PIN 18
// global Variables
bool button_pressed = false;
bool increment_flag = false;
bool decrement_flag = false;
bool led_on = false; // Track LED state
int led_frequency = 0; // Default LED frequency
int led_period = 0; // Number of iterations for LED on/off
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
SemaphoreHandle_t xSemaphore;
void staticLedTask(void *pvParameters) {
for (;;) {
if (digitalRead(BUTTON_PIN)){
led_on = !led_on;
}
if (led_on == false) {
digitalWrite(LED_PIN, HIGH); // Turn on LED if it is off
} else {
digitalWrite(LED_PIN, LOW); // Turn off LED if it is on
}
vTaskDelay(100);
}
}
void incrementationTask(void *pvParameters) {
for (;;) {
if (digitalRead(INCREMENT_PIN) == HIGH) {
led_period++;
}
if (digitalRead(DECREMENT_PIN) == HIGH) {
led_period--;
if (led_period < 0) led_period = 0;
}
vTaskDelay(100);
}
}
void blinkingLedTask(void *pvParameters) {
for (;;) {
if (led_period > 0 && led_on) {
// First LED is off, blink the second LED
for (int i = 0; i < led_period; i++) {
digitalWrite(FLASHING_LED_PIN, HIGH);
delay(led_period);
digitalWrite(FLASHING_LED_PIN, LOW);
delay(led_period);
}
} else {
// First LED is on, turn off the second LED
digitalWrite(FLASHING_LED_PIN, LOW);
}
vTaskDelay(100);
}
}
void idleTask(void *pvParameters) {
for(;;) {
Serial.print("Led on:");
Serial.println(led_on);
Serial.print(", LED Period: ");
Serial.println(led_period);
vTaskDelay(100);
}
}
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(FLASHING_LED_PIN, OUTPUT);
pinMode(INCREMENT_PIN, INPUT);
pinMode(DECREMENT_PIN, INPUT);
xSemaphore = xSemaphoreCreateMutex();
xSemaphoreGive(xSemaphore);
xTaskCreate(staticLedTask, "staticLedTask", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(blinkingLedTask, "blinkingLedTask", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
xTaskCreate(incrementationTask, "incrementationTask", configMINIMAL_STACK_SIZE, NULL, 3, NULL);
xTaskCreate(idleTask, "idleTask", configMINIMAL_STACK_SIZE, NULL, 4, NULL);
vTaskStartScheduler();
}
void loop() {}