#include "pico/stdlib.h"
#include "hardware/timer.h"
#include <stdio.h>
const uint LED_A_PIN = 13;
const uint BUTTON_A_PIN = 5;
volatile int button_press_count = 0;
volatile bool led_on = false;
volatile bool led_active = false;
int64_t turn_off_callback(alarm_id_t id, void *user_data) {
led_active = false;
led_on = false;
gpio_put(LED_A_PIN, false);
printf("Blink LED desligado\n");
return 0;
}
bool blink_led_callback(struct repeating_timer *t) {
if (led_active) {
led_on = !led_on;
gpio_put(LED_A_PIN, led_on);
}
return led_active;
}
bool repeating_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time = 0;
static bool button_last_state = false;
static struct repeating_timer blink_timer;
bool button_pressed = !gpio_get(BUTTON_A_PIN);
if (button_pressed && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000) { // button debounce
last_press_time = get_absolute_time();
button_last_state = true;
button_press_count++;
if (button_press_count == 5) {
printf("Blink LED ligado\n");
led_active = true;
// blink 10hz
add_repeating_timer_ms(100, blink_led_callback, NULL, &blink_timer); // 10hz
// turn off 10s
add_alarm_in_ms(10000, turn_off_callback, NULL, false); // 10s
button_press_count = 0;
}
} else if (!button_pressed) {
button_last_state = false;
}
return true;
}
int main() {
stdio_init_all();
gpio_init(LED_A_PIN);
gpio_set_dir(LED_A_PIN, GPIO_OUT);
gpio_put(LED_A_PIN, 0);
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
struct repeating_timer timer;
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);
while (true) {
tight_loop_contents(); // Função que otimiza o loop vazio para evitar consumo excessivo de CPU.
}
}