/**
Copyright (c) 2025 Raspberry Pi Pico W - ACFA.
Autoria: ACFA...
Tarefa 1 - Unidade 4 - Cap. 5
Exercício 02
*/
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/timer.h"
// Definição dos pinos
#define BUTTON_PIN_A 15 // Pino do botão A --->>> (button green - verde) esse deve ser pressionado 5X...
#define BUTTON_PIN_B 14 // Pino do botão B --->>> (button blue - azul) esse é o botão de seleção da frequência...
#define LED_PIN 19 // Pino do LED
// Variáveis globais
volatile int button_press_count = 0;
volatile bool led_blinking = false;
volatile int led_frequency = 10; // Frequência padrão do LED: 10 Hz.
// Função para interrupção do botão B (alteração de frequência)
void button_b_isr() {
static absolute_time_t last_b_time = {0};
absolute_time_t now_b = get_absolute_time();
int64_t diff_b = absolute_time_diff_us(last_b_time, now_b);
if (diff_b > 250000) { // Debounce de 250 ms
// Ternário deve alternar a frequência entre 10 Hz e 1 Hz
led_frequency = (led_frequency == 10) ? 1 : 10;
last_b_time = now_b;
}
}
// Contador com uso por tempo (Botão A)
int button_press_timer_callback(repeating_timer_t *rt) {
static bool button_a_state = false;
bool current_button_a_state = gpio_get(BUTTON_PIN_A);
// Verificar se o botão A foi pressionado
if (current_button_a_state && !button_a_state) {
button_press_count++; // Contar cada pressionamento do botão
}
// Se tiver contado 5 cliques, inicie a pisca LED
if (button_press_count >= 5) {
led_blinking = true;
button_press_count = 0; // Resetar a contagem
}
// Atualiza o estado do botão A
button_a_state = current_button_a_state;
return true; // Retorna true para manter a chamada do temporizador
}
// Função para piscar o LED
void blink_led(int frequency_hz, int duration_seconds) {
int delay_ms = 1000 / (2 * frequency_hz); // Delay calculado pela frequência
int total_blinks = frequency_hz * duration_seconds;
for (int i = 0; i < total_blinks; i++) {
gpio_put(LED_PIN, 1); // Liga o LED
sleep_ms(delay_ms);
gpio_put(LED_PIN, 0); // Desliga o LED
sleep_ms(delay_ms);
}
}
// Função de configuração do botão e LED
void config_button_led() {
gpio_init(BUTTON_PIN_A);
gpio_set_dir(BUTTON_PIN_A, GPIO_IN); // Configura o botão como entrada
gpio_pull_up(BUTTON_PIN_A); // Habilita pull-up interno para o botão
gpio_init(BUTTON_PIN_B);
gpio_set_dir(BUTTON_PIN_B, GPIO_IN); // Configura o botão como entrada
gpio_pull_up(BUTTON_PIN_B); // 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_button_led();
// Configuração do temporizador para verificar o botão A
repeating_timer_t timer;
add_repeating_timer_ms(150, button_press_timer_callback, NULL, &timer);
// Configuração de interrupção do botão B para alterar a frequência
gpio_set_irq_enabled_with_callback(BUTTON_PIN_B, GPIO_IRQ_EDGE_FALL, true, &button_b_isr);
while (true) {
if (led_blinking) {
blink_led(led_frequency, 10); // Piscar LED a led_frequency Hz por 10 segundos
led_blinking = false; // Desativar o comportamento do LED
}
sleep_ms(100); // Evitar consumo excessivo de CPU
}
}