#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
/* LED GPIO Pin Assignments */
#define LED_RED GPIO_NUM_5
#define LED_GREEN GPIO_NUM_2
#define LED_BLUE GPIO_NUM_4
#define LED_YELLOW GPIO_NUM_18 // Optional 4th LED
/* Parameters passed to each task */
typedef struct {
gpio_num_t led_gpio;
TickType_t blink_time;
} led_task_parameters_t;
/* LED configurations */
static led_task_parameters_t red_led = {LED_RED, 2000};
static led_task_parameters_t blue_led = {LED_BLUE, 1000};
static led_task_parameters_t green_led = {LED_GREEN, 500};
static led_task_parameters_t yellow_led = {LED_YELLOW, 3000}; // 4th task
/* Task function */
void led_task(void *pvParameter)
{
led_task_parameters_t *params = (led_task_parameters_t *)pvParameter;
gpio_num_t led_gpio = params->led_gpio;
TickType_t blink_time = params->blink_time;
uint8_t led_value = 0;
int count = 0;
// Configure GPIO
gpio_reset_pin(led_gpio);
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
// Blink only 10 times
while (count < 10) {
gpio_set_level(led_gpio, led_value);
led_value = !led_value;
count++;
vTaskDelay(blink_time / portTICK_PERIOD_MS);
}
// Print message before deleting
printf("Task %s finished after 10 blinks\n", pcTaskGetName(NULL));
// Delete task
vTaskDelete(NULL);
}
/* Main function */
void app_main(void)
{
xTaskCreate(&led_task, "Red LED Task", 2048, &red_led, 5, NULL);
xTaskCreate(&led_task, "Blue LED Task", 2048, &blue_led, 5, NULL);
xTaskCreate(&led_task, "Green LED Task", 2048, &green_led, 5, NULL);
xTaskCreate(&led_task, "Yellow LED Task", 2048, &yellow_led, 5, NULL); // Optional
}