/**
Copyright (c) 2025 Raspberry Pi Pico W - ACFA.
Autoria: ACFA...
Tarefa 1 - Unidade 4 - Cap. 5
Exercício 01
*/
#include "pico/stdlib.h"
#include "hardware/timer.h"
#include "hardware/clocks.h"
#include "hardware/pll.h"
// Definição dos pinos
#define BUTTON_PIN 15 // Pino do botão
#define LED_PIN 19 // Pino do LED
// Variáveis globais
volatile int button_press_count = 0;
volatile bool led_blinking = false;
absolute_time_t last_press_time;
// Callback do temporizador para verificar o estado do botão
bool timer_callback(repeating_timer_t *rt) {
static bool last_button_state = true; // Estado anterior do botão (puxado para HIGH por padrão)
bool current_button_state = gpio_get(BUTTON_PIN); // Leitura atual do botão
if (!current_button_state && last_button_state) { // Detectar borda de descida
absolute_time_t now = get_absolute_time();
int64_t time_since_last_press = absolute_time_diff_us(last_press_time, now);
// Debounce: ignorar múltiplos eventos em menos de 200 ms
if (time_since_last_press > 200000) {
button_press_count++;
last_press_time = now; // Atualizar o tempo do último pressionamento
}
}
last_button_state = current_button_state; // Atualizar o estado anterior do botão
if (button_press_count >= 5) {
button_press_count = 0; // Resetar contagem
led_blinking = true; // Ativar o comportamento do LED
}
return true; // Repetir o temporizador
}
// Função para piscar o LED com precisão
void blink_led_with_precision(int frequency_hz, int duration_seconds) {
int total_blinks = frequency_hz * duration_seconds; // Total de piscadas
int64_t delay_us = 1000000 / (2 * frequency_hz); // Tempo de espera em microssegundos
for (int i = 0; i < total_blinks; i++) {
gpio_put(LED_PIN, 1); // Liga o LED
sleep_us(delay_us); // Aguarda metade do período
gpio_put(LED_PIN, 0); // Desliga o LED
sleep_us(delay_us); // Aguarda metade do período
}
}
// Função de configuração do botão e LED
void config_botton_led() {
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN); // Configura o botão como entrada
gpio_pull_up(BUTTON_PIN); // Habilita pull-up interno para o botão
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT); // Configura o LED como saída
gpio_put(LED_PIN, 0); // Garante que o LED comece apagado
}
int main() {
// Inicialização dos pinos
stdio_init_all();
// Função de inicialização do botão e LED.
config_botton_led();
// Configuração de interrupção para o botão
last_press_time = get_absolute_time();
// Inicializar um temporizador repetitivo para monitorar o botão
repeating_timer_t timer;
add_repeating_timer_ms(10, timer_callback, NULL, &timer); // Temporizador repetitivo a cada 10ms
while (true) {
if (led_blinking) {
blink_led_with_precision(10, 10); // Piscar LED a 10 Hz por 10 segundos
led_blinking = false; // Desativar o comportamento do LED
}
sleep_ms(100); // Evitar consumo excessivo de CPU
}
}