#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
const uint LED_PIN = 13; //Pino do LED
const uint BUTTON_PIN = 5; //Pino do botao
volatile int button_press_count = 0; //Contador de pressões do botão
volatile bool led_active = false; //Flag para estouto do button_press_count
bool repeating_timer_callback(struct repeating_timer *t){
static absolute_time_t last_press_time = 0;
static bool button_last_state = false;
bool button_pressed = !gpio_get(BUTTON_PIN); //Pressionado = LOW
if(button_pressed && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000){//200 ms
last_press_time = get_absolute_time();
button_last_state = true;
button_press_count++;
printf("Botão pressionado: %d \n",button_press_count);
if(button_press_count==5){//Verifica se o contador de aperto do
//botão ja estourou
button_press_count=0;//Zera contador
led_active = true; //Seta nível lógico true na flag
}
}else if(!button_pressed){
button_last_state = false;//Resetar estado quando o botão é liberado
}
return true; //Continuar o temporizador de repetição
}
//Função responsável por piscar o LED na fequência de 10 Hz por
//10 segundos
void pisca_LED_10_Hz(){
volatile absolute_time_t inicio_10_Hz = 0;
volatile absolute_time_t fim_10_Hz = 0;
uint64_t inicio = to_us_since_boot(get_absolute_time());
uint64_t fim = to_us_since_boot(get_absolute_time()+10000000);
int64_t diferenca = (fim-inicio)/1000000;
while(get_absolute_time() <= fim){
gpio_put(LED_PIN, true);
sleep_ms(10);//10 ms segundos led ligado
gpio_put(LED_PIN,false);
sleep_ms(90);//90 ms segundos led desligado
}
printf("LED apagado!\n");
led_active = false;
}
//Função responsável por configurar o os pinos do microcontrolador
void setup(){
//Configurar o pino do LED como saída
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0); //LED começa apagado
//Configurar o pino do botão como entrada com pull-up interno
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN);//Aciona o pull-up interno do microcontrolador
}
int main(){
stdio_init_all();
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);
while(true){//O loop principal fica livre para outras tarefas
//O temporizador cuida do controle do botão e do LED
tight_loop_contents();
if(led_active == true){//Verifica se a contador do botao já atingiu o valor
printf("LED piscando na frequência de 10 Hz por 10 segundos\n");
pisca_LED_10_Hz();
}
}
}