#include "pico/stdlib.h"
#include <stdio.h>
// Definições de pinos
#define BUTTON_PIN 4
#define LED_PIN 9
// Variáveis globais
volatile int press_count = 0; // Contador de pressões do botão
volatile bool led_state = false; // Estado do LED
// Callback para tratar o evento de botão
void button_callback(uint gpio, uint32_t events) {
static absolute_time_t last_interrupt_time = {0};
absolute_time_t current_time = get_absolute_time();
// Debounce simples
if (absolute_time_diff_us(last_interrupt_time, current_time) > 200000) { // 200 ms
press_count++;
printf("Botão pressionado %d vez(es)\n", press_count);
}
last_interrupt_time = current_time;
}
// Função para piscar o LED
void blink_led(int duration_ms, int frequency_hz) {
int interval_ms = 1000 / (frequency_hz * 2); // Tempo para cada estado ON/OFF
int elapsed_time = 0;
while (elapsed_time < duration_ms) {
gpio_put(LED_PIN, 1); // Liga o LED
sleep_ms(interval_ms);
gpio_put(LED_PIN, 0); // Desliga o LED
sleep_ms(interval_ms);
elapsed_time += (2 * interval_ms);
}
}
int main() {
// Inicialização do GPIO
stdio_init_all();
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN); // Habilita resistor pull-up interno
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
// Configuração da interrupção do botão
gpio_set_irq_enabled_with_callback(BUTTON_PIN, GPIO_IRQ_EDGE_FALL, true, &button_callback);
while (true) {
// Verifica se o botão foi pressionado 5 vezes
if (press_count >= 5) {
printf("Iniciando o piscar do LED por 10 segundos\n");
blink_led(10000, 10); // Piscar por 10 segundos a 10 Hz
press_count = 0; // Reseta o contador
printf("Piscar do LED concluído\n");
}
}
return 0;
}