#include "pico/stdlib.h"
// Definições de pinos
#define BUTTON_A_PIN 4
#define BUTTON_B_PIN 5
#define LED_PIN 16
// Variáveis globais
volatile int press_count = 0; // Contador de pressões do botão A
volatile bool led_state = false; // Estado do LED
volatile int led_frequency = 10; // Frequência inicial do LED (10 Hz)
// Callback para tratar eventos dos botões
void button_callback(uint gpio, uint32_t events) {
static absolute_time_t last_interrupt_time_a = {0};
static absolute_time_t last_interrupt_time_b = {0};
absolute_time_t current_time = get_absolute_time();
if (gpio == BUTTON_A_PIN) {
// Debounce do Botão A
if (absolute_time_diff_us(last_interrupt_time_a, current_time) > 200000) { // 200 ms
press_count++;
printf("Botão A pressionado %d vez(es)\n", press_count);
}
last_interrupt_time_a = current_time;
} else if (gpio == BUTTON_B_PIN) {
// Debounce do Botão B
if (absolute_time_diff_us(last_interrupt_time_b, current_time) > 200000) { // 200 ms
led_frequency = (led_frequency == 10) ? 1 : 10; // Alterna entre 10 Hz e 1 Hz
printf("Frequência do LED alterada para %d Hz\n", led_frequency);
}
last_interrupt_time_b = 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_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN); // Habilita resistor pull-up interno
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_up(BUTTON_B_PIN); // Habilita resistor pull-up interno
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
// Configuração das interrupções dos botões
gpio_set_irq_enabled_with_callback(BUTTON_A_PIN, GPIO_IRQ_EDGE_FALL, true, &button_callback);
gpio_set_irq_enabled_with_callback(BUTTON_B_PIN, GPIO_IRQ_EDGE_FALL, true, &button_callback);
while (true) {
// Verifica se o botão A foi pressionado 5 vezes
if (press_count >= 5) {
printf("Iniciando o piscar do LED por 10 segundos\n");
blink_led(10000, led_frequency); // Piscar com a frequência atual
press_count = 0; // Reseta o contador
printf("Piscar do LED concluído\n");
}
}
return 0;
}