#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED1_GPIO 4
#define LED2_GPIO 5
#define LED3_GPIO 6
#define LED4_GPIO 7
static void leds_init(void) {
gpio_config_t cfg = {
.pin_bit_mask = (1ULL << LED1_GPIO) |
(1ULL << LED2_GPIO) |
(1ULL << LED3_GPIO) |
(1ULL << LED4_GPIO),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&cfg);
// começa tudo apagado
gpio_set_level(LED1_GPIO, 0);
gpio_set_level(LED2_GPIO, 0);
gpio_set_level(LED3_GPIO, 0);
gpio_set_level(LED4_GPIO, 0);
}
static void set_binary_0_to_15(uint8_t v) {
// bit0->LED1, bit1->LED2, bit2->LED3, bit3->LED4
gpio_set_level(LED1_GPIO, (v >> 0) & 1);
gpio_set_level(LED2_GPIO, (v >> 1) & 1);
gpio_set_level(LED3_GPIO, (v >> 2) & 1);
gpio_set_level(LED4_GPIO, (v >> 3) & 1);
}
static void all_off(void) {
gpio_set_level(LED1_GPIO, 0);
gpio_set_level(LED2_GPIO, 0);
gpio_set_level(LED3_GPIO, 0);
gpio_set_level(LED4_GPIO, 0);
}
static void phase1_binary_counter(void) {
// 0..15, atualiza a cada 500 ms
for (uint8_t v = 0; v < 16; v++) {
set_binary_0_to_15(v);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
static void light_only(int idx /*1..4*/) {
all_off();
switch (idx) {
case 1: gpio_set_level(LED1_GPIO, 1); break;
case 2: gpio_set_level(LED2_GPIO, 1); break;
case 3: gpio_set_level(LED3_GPIO, 1); break;
case 4: gpio_set_level(LED4_GPIO, 1); break;
default: break;
}
}
static void phase2_scan_back_and_forth(void) {
// LED1->LED4
for (int i = 1; i <= 4; i++) {
light_only(i);
vTaskDelay(pdMS_TO_TICKS(200));
}
// LED4->LED1
for (int i = 4; i >= 1; i--) {
light_only(i);
vTaskDelay(pdMS_TO_TICKS(200));
}
}
void app_main(void) {
leds_init();
while (1) {
phase1_binary_counter();
phase2_scan_back_and_forth();
}
}