#include <Arduino.h>
#include "hardware/gpio.h"
#include "hardware/timer.h"
#define LED_PIN 15
#define BUTTON_PIN 14
volatile int pressCount = 0;
volatile bool isBlinking = false;
struct repeating_timer blinkTimer;
volatile uint32_t lastPressTime = 0;
// Interrupção do botão com debounce
void button_callback(uint gpio, uint32_t events) {
if ((to_ms_since_boot(get_absolute_time()) - lastPressTime) > 100) { // Debounce de 100ms
pressCount++;
Serial.printf("Pressionamentos: %d\n", pressCount);
if (pressCount >= 5) {
pressCount = 0;
isBlinking = true;
}
lastPressTime = to_ms_since_boot(get_absolute_time());
}
}
// Callback para piscar o LED
bool blink_led_callback(struct repeating_timer *t) {
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Usando funções Arduino
return true;
}
// Callback para parar o piscar após 10 segundos
int64_t stop_blink(alarm_id_t id, void *user_data) {
cancel_repeating_timer(&blinkTimer);
digitalWrite(LED_PIN, LOW);
Serial.println("LED desligado");
return 0;
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Configura o botão com pull-up e interrupção
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN);
gpio_set_irq_enabled_with_callback(BUTTON_PIN, GPIO_IRQ_EDGE_FALL, true, &button_callback);
}
void loop() {
if (isBlinking) {
isBlinking = false;
Serial.println("Iniciando piscar do LED");
add_repeating_timer_ms(50, blink_led_callback, NULL, &blinkTimer); // 10 Hz
add_alarm_in_ms(10000, stop_blink, NULL, false); // Para após 10s
}
delay(10);
}