#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
// пины
#define LED_GPIO_red GPIO_NUM_2
#define LED_GPIO_yellow GPIO_NUM_1
#define LED_GPIO_green GPIO_NUM_0
#define BTN_GPIO GPIO_NUM_10
void delay_with_button_check(int ms, int *count, int *last_btn_state) {
int steps = ms / 50; // шаг 50 мс
for (int i = 0; i < steps; i++) {
int btn_state = gpio_get_level(BTN_GPIO);
if (btn_state == 0 && *last_btn_state == 1) {
(*count)++;
printf("count = %d\n", *count);
*last_btn_state = btn_state;
break; // 👉 сразу выходим из задержки
}
*last_btn_state = btn_state;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
void app_main(void)
{
// LED как выход
gpio_reset_pin(LED_GPIO_red);
gpio_reset_pin(LED_GPIO_green);
gpio_reset_pin(LED_GPIO_yellow);
gpio_set_direction(LED_GPIO_red, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_GPIO_green, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_GPIO_yellow, GPIO_MODE_OUTPUT);
// кнопка как вход с подтяжкой вверх
gpio_reset_pin(BTN_GPIO);
gpio_set_direction(BTN_GPIO, GPIO_MODE_INPUT);
gpio_pullup_en(BTN_GPIO);
int last_btn_state = 1;
int count = 0;
while (1) {
int btn_state = gpio_get_level(BTN_GPIO);
if (btn_state == 0 && last_btn_state == 1) {
count++;
printf("count = %d\n", count);
}
last_btn_state = btn_state; // обновляем состояние кнопки
if (count % 2 == 0) {
gpio_set_level(LED_GPIO_red, 1);
delay_with_button_check(3000, &count, &last_btn_state);
gpio_set_level(LED_GPIO_red, 0);
if (count % 2 != 0) continue; // 👉 проверка, не нажали ли кнопку
gpio_set_level(LED_GPIO_yellow, 1);
delay_with_button_check(1000, &count, &last_btn_state);
gpio_set_level(LED_GPIO_yellow, 0);
if (count % 2 != 0) continue;
gpio_set_level(LED_GPIO_green, 1);
delay_with_button_check(3000, &count, &last_btn_state);
gpio_set_level(LED_GPIO_green, 0);
if (count % 2 != 0) continue;
gpio_set_level(LED_GPIO_yellow, 1);
delay_with_button_check(1000, &count, &last_btn_state);
gpio_set_level(LED_GPIO_yellow, 0);
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}