#include "pico/stdlib.h"
#include "hardware/timer.h"
#include <stdio.h>
const uint LED_PIN = 13;
const uint BUTTON_A_PIN = 5;
const uint BUTTON_B_PIN = 16;
volatile int button_a_press_count = 0;
volatile int button_b_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_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_PIN, led_on);
}
return led_active;
}
bool button_a_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time_a = 0;
static bool button_last_state_a = false;
static struct repeating_timer blink_timer_a;
bool button_pressed = !gpio_get(BUTTON_A_PIN);
if (button_pressed && !button_last_state_a &&
absolute_time_diff_us(last_press_time_a, get_absolute_time()) > 200000) { // button debounce
last_press_time_a = get_absolute_time();
button_last_state_a = true;
button_a_press_count++;
if (button_a_press_count == 5) {
printf("Blink 10hz LED ligado\n");
led_active = true;
// blink 10hz
add_repeating_timer_ms(100, blink_led_callback, NULL, &blink_timer_a); // 10hz
// turn off 10s
add_alarm_in_ms(10000, turn_off_callback, NULL, false); // 10s
button_a_press_count = 0;
}
} else if (!button_pressed) {
button_last_state_a = false;
}
return true;
}
bool button_b_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time_b = 0;
static bool button_last_state_b = false;
static struct repeating_timer blink_timer_b;
bool button_pressed = !gpio_get(BUTTON_B_PIN);
if (button_pressed && !button_last_state_b &&
absolute_time_diff_us(last_press_time_b, get_absolute_time()) > 200000) { // button debounce
last_press_time_b = get_absolute_time();
button_last_state_b = true;
button_b_press_count++;
if (button_b_press_count == 5) {
printf("Blink 1hz LED ligado\n");
led_active = true;
// blink 1hz
add_repeating_timer_ms(1000, blink_led_callback, NULL, &blink_timer_b); // 10hz
// turn off 10s
add_alarm_in_ms(10000, turn_off_callback, NULL, false); // 10s
button_b_press_count = 0;
}
} else if (!button_pressed) {
button_last_state_b = false;
}
return true;
}
int main() {
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_up(BUTTON_B_PIN);
struct repeating_timer timer_a;
add_repeating_timer_ms(100, button_a_timer_callback, NULL, &timer_a);
struct repeating_timer timer_b;
add_repeating_timer_ms(100, button_b_timer_callback, NULL, &timer_b);
while (true) {
tight_loop_contents(); // Função que otimiza o loop vazio para evitar consumo excessivo de CPU.
}
}