#include "pico/stdlib.h"
#include "hardware/timer.h"
#include <stdio.h>
// Definição dos pinos
const uint LED_PIN = 13; // Pino do LED
const uint BUTTON_PIN = 5; // Pino do botão A
// Variáveis globais voláteis (compartilhadas entre interrupção e programa principal)
volatile int button_press_count = 0; // Contador de pressões do botão
volatile bool is_blinking = false; // Indica se o LED está no modo piscante
volatile bool led_state = false; // Estado atual do LED (para piscar)
volatile absolute_time_t blink_start_time; // Momento que o pisca-pisca começou
// Variáveis para debounce
static absolute_time_t last_press_time = 0;
static bool button_last_state = false;
// Variável para controle do pisca-pisca (será usada no loop principal)
struct repeating_timer blink_timer;
// Função de callback para desligar o LED após 10 segundos
int64_t stop_blinking_callback(alarm_id_t id, void *user_data) {
is_blinking = false; // Desativa o modo pisca-pisca
gpio_put(LED_PIN, false); // Garante que o LED fique apagado
printf("LED desligado após 10 segundos\n");
return 0; // Não repetir o alarme
}
// Função que faz o LED piscar (será chamada pelo temporizador)
bool blink_callback(struct repeating_timer *t) {
if (is_blinking) {
led_state = !led_state; // Inverte o estado
gpio_put(LED_PIN, led_state); // Atualiza o LED
}
return true; // Continua repetindo
}
// Função de callback do temporizador repetitivo (verifica o botão)
bool button_check_callback(struct repeating_timer *t) {
// Se o LED já está piscando, ignora novas pressões de botão
if (is_blinking) {
return true;
}
// Leitura do botão com debounce
bool button_pressed = !gpio_get(BUTTON_PIN); // Botão pressionado = LOW
if (button_pressed && !button_last_state) {
uint64_t time_diff = absolute_time_diff_us(last_press_time, get_absolute_time());
if (time_diff > 200000) { // Debounce de 200ms
last_press_time = get_absolute_time();
button_press_count++;
printf("Botão pressionado! Contagem: %d/5\n", button_press_count);
// Verifica se atingiu 5 pressões
if (button_press_count == 5) {
// Inicia o modo pisca-pisca
is_blinking = true;
led_state = true;
gpio_put(LED_PIN, true); // Acende na primeira vez
printf("LED começou a piscar! (10Hz por 10 segundos)\n");
// Configura alarme para parar após 10 segundos
add_alarm_in_ms(10000, stop_blinking_callback, NULL, false);
// Reseta o contador
button_press_count = 0;
}
}
}
button_last_state = button_pressed;
return true; // Continua repetindo
}
int main() {
stdio_init_all();
// Inicialização do LED
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, false);
// Inicialização do botão
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN); // Pull-up interno
// Configura temporizador para verificar botão a cada 100ms
struct repeating_timer button_timer;
add_repeating_timer_ms(100, button_check_callback, NULL, &button_timer);
// Configura temporizador para fazer o LED piscar a 10Hz (100ms por ciclo)
// 10Hz = 10 piscadas/segundo = 1 piscada a cada 100ms (50ms ligado, 50ms desligado)
add_repeating_timer_ms(50, blink_callback, NULL, &blink_timer);
printf("Sistema iniciado. Pressione o botão 5 vezes para acionar o LED por 10 segundos!\n");
// Loop principal vazio (tudo é gerenciado pelos temporizadores)
while (true) {
tight_loop_contents();
}
}