#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/semphr.h>
const int relayPin = 2; // Change this to the appropriate pin for the relay
const int led1Pin = 13; // Change this to the appropriate pin for the first LED
const int led2Pin = 14; // Change this to the appropriate pin for the second LED
SemaphoreHandle_t relaySemaphore;
SemaphoreHandle_t led1Semaphore;
SemaphoreHandle_t led2Semaphore;
void relayTask(void *pvParameters) {
while (1) {
xSemaphoreTake(relaySemaphore, portMAX_DELAY);
digitalWrite(relayPin, !digitalRead(relayPin)); // Toggle relay state
xSemaphoreGive(relaySemaphore);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Adjust delay as needed
}
}
void led1Task(void *pvParameters) {
while (1) {
xSemaphoreTake(led1Semaphore, portMAX_DELAY);
digitalWrite(led1Pin, !digitalRead(led1Pin)); // Toggle LED1 state
xSemaphoreGive(led1Semaphore);
vTaskDelay(500 / portTICK_PERIOD_MS); // Adjust delay as needed
}
}
void led2Task(void *pvParameters) {
while (1) {
xSemaphoreTake(led2Semaphore, portMAX_DELAY);
digitalWrite(led2Pin, !digitalRead(led2Pin)); // Toggle LED2 state
xSemaphoreGive(led2Semaphore);
vTaskDelay(700 / portTICK_PERIOD_MS); // Adjust delay as needed
}
}
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
Serial.begin(115200);
Serial.println("ESP32 Simultaneous Blinking LEDs and Relay FreeRTOS Example");
relaySemaphore = xSemaphoreCreateMutex();
led1Semaphore = xSemaphoreCreateMutex();
led2Semaphore = xSemaphoreCreateMutex();
xTaskCreatePinnedToCore(relayTask, "RelayTask", 10000, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(led1Task, "Led1Task", 10000, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(led2Task, "Led2Task", 10000, NULL, 1, NULL, 1);
}
void loop() {
// The loop is not used for tasks; it's just to satisfy the Arduino framework
vTaskDelay(1000 / portTICK_PERIOD_MS);
}