// Bibliotecas necessárias para o funcionamento do código
// stdio.h: Biblioteca padrão de entrada e saída
#include <stdio.h>
// stdlib.h: Biblioteca padrão
#include "pico/stdlib.h"
// hardware/gpio.h: Biblioteca de controle dos pinos GPIO
#include "hardware/timer.h"
//Pino do LED
const uint LED_PIN = 13;
//Pino do botão
const uint BUTTON_PIN = 5;
//tempo de debounce em us
const uint DEBOUNCE = 200000;
//Variáveis globais
volatile int button_press_count = 0; //Contador de pressões do botão
volatile bool led_active = false; //Indica se o LED está aceso
//Função de callback do temporizador
bool repeating_timer_callback(struct repeating_timer *t){
//Variáveis locais
static absolute_time_t last_press_time = 0; //Tempo da última pressão
static bool button_last_state = false; //Estado do botão
bool button_pressed = !gpio_get(BUTTON_PIN); //Pressionado = LOW
//Verifica se o botão foi pressionado e debounce
if(button_pressed && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time())
> DEBOUNCE){//200 ms
// Armazena o tempo da última pressão
last_press_time = get_absolute_time();
//Atualiza o estado do botão
button_last_state = true;
//Incrementa o contador de pressões
button_press_count++;
//Printa o valor da contagem do apeto do botão
printf("Aperto botão: %d\n", button_press_count);
//Veriifica a contagem do botão
if(button_press_count==5){
//Reseta o contador
button_press_count=0;
//Ativa o LED por 10 segundos
led_active = true;
printf("LED piscando em 10 Hz por 10s!\n");
}
}else if(!button_pressed){
//Resetar estado quando o botão é liberado
button_last_state = false;
}
//Continuar o temporizador de repetição
return true;
}
//Função responsável por piscar o LED na fequência de 10 Hz por
//10 segundos
void pisca_LED_10_Hz(){
//Tempo inicial dos 10s em microssegundos
absolute_time_t time_freq = 10000000;
//Tempo final de 10 segundos
absolute_time_t fim = to_us_since_boot(get_absolute_time() + time_freq);
//Pisca o LED por 10 segundos
while(get_absolute_time() <= fim){
gpio_put(LED_PIN, true);
sleep_ms(1);
gpio_put(LED_PIN,false);
sleep_ms(99);
}
//Desativa o LED
led_active = false;
printf("LED OFF!\n");
}
// Função responsável por configurar
// os pinos GPIO do microcontrolador
void setup(){
//Configura o GPIO 13 como output
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
//LED começa off
gpio_put(LED_PIN, false);
//Configura o GPIO 5 como input
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
//Aciona o pull-up interno do microcontrolador
gpio_pull_up(BUTTON_PIN);
}
int main(){
// Inicializa a biblioteca stdio
// interfaces de comunicação padrão
stdio_init_all();
//Inicializa os pinos GPIO's
setup();
// Configurar o temporizador para verificar
// o estado do botão a cada 100 ms
struct repeating_timer timer;
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);
//O loop principal fica livre para outras tarefas
while(true){
//Verifica se a contador do botao já atingiu o valor de 5
if(led_active){
pisca_LED_10_Hz();
}
}
}