#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
// Define o pino GPIO 4 para controlar o LED.
const uint LED_PIN = 4;
// Define o pino GPIO 8 para ler o estado do botão.
const uint BTN_PIN = 8;
// Determina a frequência em que o LED ficará piscando (10Hz / 100 milissegundos)
int freq = 100;
// controla o acionamento do LED (true = ligado / false = desligado)
bool control_led_1 = true;
// Variáveis utilizadas para determinar o tempo em que o LED ficará piscando (10 segundos)
static volatile int time = 100;
int control_led_2 = 0;
// Contador de pressões do botão.
static volatile int contador_button = 0;
// Variáveis utilizadas para evitar o bounce do botão
static volatile int control_button_1 = 0;
static volatile int control_button_2 = 0;
static volatile int control_button_3 = 0;
// Declaração da função de callback da interruupçao
static void gpio_irq_handler(uint gpio, uint32_t events);
// Função que detecta se o botão foi pressionado
static void gpio_irq_handler(uint gpio, uint32_t events) {
// Controle de bounce do botão
if (control_button_3 == control_button_2) {
control_button_1++;
}
}
// Função de callback que será chamada repetidamente pelo temporizador
// O tipo bool indica que a função deve retornar verdadeiro ou falso para continuar ou parar o temporizador.
bool repeating_timer_callback(struct repeating_timer *t) {
// Verifica se o botão foi pressionado 5 vezes para acionar o LED
if (contador_button >= 5) {
// Faz o controle para que o LED fique piscando
if (control_led_1) {
gpio_put(LED_PIN, true);
control_led_1 = false;
} else {
gpio_put(LED_PIN, false);
control_led_1 = true;
}
// Faz o controle do tempo em que o LED fica ligado (10 segundos)
control_led_2++;
if (control_led_2 >= time) {
// Inicioaliza todas as variáveis
contador_button = 0;
control_button_1 = 0;
control_button_2 = 0;
control_button_3 = 0;
control_led_1 = true;
control_led_2 = 0;
time = 100;
}
}
// Retorna true para manter o temporizador repetindo. Se retornar false, o temporizador para.
return true;
}
int main() {
// Inicializa a comunicação serial
stdio_init_all();
// Configura o pino do LED como saída.
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
// Configura o pino do botão como entrada
gpio_init(BTN_PIN);
gpio_set_dir(BTN_PIN, GPIO_IN);
// Habilita o resistor pull-up interno para evitar leituras incorretas.
gpio_pull_up(BTN_PIN);
// Configuração da interrupção da borda de subida
gpio_set_irq_enabled_with_callback(BTN_PIN, GPIO_IRQ_EDGE_RISE, true, &gpio_irq_handler);
// Declaração da estrutura do temporizador.
// Estrutura que armazena informações sobre o temporizador configurado.
struct repeating_timer timer;
// Configura o temporizador para chamar a função de callback a cada 1 segundo.
// Parâmetros:
// freq: Intervalo de tempo em milissegundos (100 milissegundos).
// repeating_timer_callback: Função de callback que será chamada a cada intervalo.
// NULL: Dados adicionais passados para a função de callback (não utilizados neste caso).
// &timer: Ponteiro para a estrutura que armazenará informações do temporizador.
add_repeating_timer_ms(freq, repeating_timer_callback, NULL, &timer);
while (true) {
// Aguarda o tempo de 500 milissegundos para evitar o bounce do botão
sleep_ms(500);
// Conta quantas vezes o botão foi pressionado.
if (control_button_1 > 0) {
control_button_1 = 0;
control_button_3++;
} else if (control_button_3 > 0) {
contador_button++;
control_button_3 = 0;
}
}
return 0;
}