#include "pico/stdlib.h"
#include "stdio.h"
#include "hardware/gpio.h"
#define btnA_pin 9
#define btnB_pin 28
int pressCount = 0; // Contador de pressionamentos de botão
uint32_t ciclo;
static uint64_t now = 0;
static uint64_t time_last_press_btn = 0;
uint32_t newHertz=10;
void gpio_callback(uint gpio, uint32_t events) {
if(gpio == 28) //Se o pino 28 acionou a interrupção
{
newHertz = 1;
}
}
if(btnB_pin == 0){
hertz=1
led_hertz(hertz)
} else if btnB_pin == 0
// Configura o LED para piscar em uma frequência específica usando contador
void led_hertz(int frequency )
{
int start_time = to_ms_since_boot(get_absolute_time()); // pega o tempo em ms desde o inicio
frequency = frequency * 2; // x2 para considerar todas transiçoes do led
while (to_ms_since_boot(get_absolute_time()) - start_time < 1000)//enquanto dentro de 1s
{
ciclo = 1000 / frequency ; // tempo de cada estado
gpio_put(3, 1);//liga led
sleep_ms(ciclo);// tempo do estado
gpio_put(3, 0); // desliga
sleep_ms(ciclo); // tempo do estado
}
}
bool debounce() {
uint64_t now = to_ms_since_boot(get_absolute_time());
if ((now - time_last_press_btn) >= 2) // se o tempo de agora menos ultima leitura maior que 2ms
{
time_last_press_btn = now;
return true;
}
return false;
}
void count(newHertz)
{
if (!gpio_get(btnA_pin)) //recebe o oposto do estado do pino, se pressionado=0,logo, recebe 1
{
if (debounce())
{
pressCount++;
printf("Botão A pressionado. Contagem: %d\n", pressCount);
}
while (!gpio_get(btnA_pin))
{
sleep_ms(100);
}
}
if ( pressCount == 5 )
{
for (int i = 0; i <= 9; i++) //pisca 10s
{
printf("Luz vermelha apaga apaga em %d\n", 10-i);
led_hertz(newHertz); //Pisca o LED a 10 Hz por 1s
}
pressCount = 0;// Reseta o contador
}
}
int main()
{
stdio_init_all();
time_last_press_btn = to_us_since_boot(get_absolute_time());
gpio_init(3); // inicia pino 3
gpio_set_dir(3, GPIO_OUT); // define como saida
gpio_init(btnA_pin); // inicia o pino def na linha 5
gpio_set_dir(btnA_pin, GPIO_IN); //setar o pino como entrada
gpio_pull_up(btnA_pin); //resistor interno de pullup(para nao confundir variaçoes na leitura)
gpio_init(btnB_pin); // inicia o pino def na linha 6
gpio_set_dir(btnB_pin, GPIO_IN); //setar o pino como entrada
gpio_pull_up(btnB_pin);
gpio_set_irq_enabled_with_callback(btnB_pin, GPIO_IRQ_EDGE_RISE , true, &gpio_callback); //interrupção associada ao botao B
while (1)
{
count(newHertz);
sleep_ms(1);
}
}