#include "stdio.h"
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#define BUTTON_PIN 5
#define LED_RED 11
#define BLINK_DURATION 10000 // Duração total do LED piscando (10 segundos)
volatile uint counter = 0;
void init_gpio()
{
// Botão
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN);
// Led
gpio_set_function(LED_RED, GPIO_FUNC_PWM);
}
void led_blink(uint hertz)
{
uint wrap = (125000000 / hertz) - 1; // Fórmula para calcular o Wrap
uint slice = pwm_gpio_to_slice_num(LED_RED);
pwm_set_wrap(slice, wrap);
pwm_set_gpio_level(LED_RED, wrap / 2);
pwm_set_clkdiv(slice, 1.0);
pwm_set_enabled(slice, true);
}
void stop_blink()
{
uint slice = pwm_gpio_to_slice_num(LED_RED);
pwm_set_enabled(slice, false);
gpio_put(LED_RED, 0);
}
void button_callback(uint gpio, uint32_t events)
{
static absolute_time_t last_time = 0;
absolute_time_t now = get_absolute_time();
if (absolute_time_diff_us(last_time, now) > 200000 && events == GPIO_IRQ_EDGE_RISE) // Debouncing
{
if(gpio == BUTTON_PIN){
last_time = now;
counter++;
}
}
}
int main()
{
stdio_init_all();
init_gpio();
gpio_set_irq_enabled_with_callback(BUTTON_PIN, GPIO_IRQ_EDGE_RISE, true, &button_callback);
while (true)
{
if (counter >= 1 && counter < 5)
{
printf("O contador é: %d \n", counter);
sleep_ms(100);
}
else if (counter >= 5) // Quando o botão é pressionado 5 vezes
{
printf("LED piscando por 10 segundos a 10 Hz\n");
led_blink(10); // Inicia o PWM para piscar o LED
absolute_time_t start_time = get_absolute_time();
while (absolute_time_diff_us(start_time, get_absolute_time()) < BLINK_DURATION * 1000) // Conta 10 segundos
{
uint seconds = absolute_time_diff_us(start_time, get_absolute_time()) / 1000000.0;
printf("Segundos: %d !\n", seconds);
sleep_ms(100);
}
stop_blink();
counter = 0;
printf("Tempo parou !");
}
sleep_ms(100);
}
return 0;
}