#include <stdio.h>
#include <stdbool.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
/* ===================== GPIO CONFIG ===================== */
#define LED_RED_PIN GPIO_NUM_16
#define LED_GREEN_PIN GPIO_NUM_17
#define LED_BLUE_PIN GPIO_NUM_18
/* ===================== ENUM MODE ===================== */
typedef enum {
LED_MODE_BLINK = 0
} led_mode_t;
/* ===================== STRUCT LED ===================== */
typedef struct {
const char *name;
gpio_num_t pin;
bool active_high;
float frequency;
led_mode_t mode;
} led_t;
/* ===================== GLOBAL LED ===================== */
static led_t led_red;
static led_t led_green;
static led_t led_blue;
/* ===================== LED TASK ===================== */
static void led_task(void *param)
{
led_t *led = (led_t *)param;
uint32_t delay_ms = (uint32_t)(500.0 / led->frequency);
while (1) {
int64_t time_ms = esp_timer_get_time() / 1000;
gpio_set_level(led->pin, led->active_high);
printf("[%lld ms] [%s] ON | GPIO %d = %d\n",
time_ms, led->name, led->pin, led->active_high);
fflush(stdout);
vTaskDelay(pdMS_TO_TICKS(delay_ms));
time_ms = esp_timer_get_time() / 1000;
gpio_set_level(led->pin, !led->active_high);
printf("[%lld ms] [%s] OFF | GPIO %d = %d\n",
time_ms, led->name, led->pin, !led->active_high);
fflush(stdout);
vTaskDelay(pdMS_TO_TICKS(delay_ms));
}
}
/* ===================== INIT LED ===================== */
static void led_init(led_t *led)
{
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << led->pin),
.mode = GPIO_MODE_OUTPUT
};
gpio_config(&io_conf);
}
/* ===================== MAIN ===================== */
void app_main(void)
{
led_red = (led_t){
.name = "RED",
.pin = LED_RED_PIN,
.active_high = true,
.frequency = 10.0
};
led_green = (led_t){
.name = "GREEN",
.pin = LED_GREEN_PIN,
.active_high = true,
.frequency = 5.0
};
led_blue = (led_t){
.name = "BLUE",
.pin = LED_BLUE_PIN,
.active_high = true,
.frequency = 2.0
};
led_init(&led_red);
led_init(&led_green);
led_init(&led_blue);
xTaskCreate(led_task, "LED_RED", 2048, &led_red, 1, NULL);
xTaskCreate(led_task, "LED_GREEN", 2048, &led_green, 1, NULL);
xTaskCreate(led_task, "LED_BLUE", 2048, &led_blue, 1, NULL);
}