// IFMA - Embarcatech - jan-fev/2025
// Atividade Capítulos 05 a 08 - Clock e Temporizador
// Nome: Alberto Carlos de Oliveira Andrade
// Tarefa 2:
// 01 - Elabore um programa para acionar um LED quando o botão A for pressionado 5 vezes,
// utilizando o temporizador como contador. Quando o valor da contagem atingir 5 vezes,
// um LED deve ser piscar por 10 segundos na frequência de 10 Hz.
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/cyw43_arch.h"
const uint LED_PIN = 12; // Pino do LED
const uint BUTTON_PIN = 4; // Pino do botão
volatile int button_press_count = 0; // Contador de pressões do botão
volatile bool led_blinking = false; // Estado de piscar do LED
// Função para inicializar os GPIOs
void init_gpio();
// Função de callback para desligar o LED após 10 segundos
int64_t turn_off_callback(alarm_id_t id, void *user_data) {
gpio_put(LED_PIN, false); // Desliga o LED
led_blinking = false; // Para o piscar
return 0;
}
// Função de callback para piscar o LED a 10Hz (a cada 100ms)
int64_t led_blink_callback(alarm_id_t id, void *user_data) {
static bool led_on = false;
if (led_blinking) {
gpio_put(LED_PIN, led_on); // Alterna o estado do LED
led_on = !led_on; // Alterna a variável led_on
}
return 100; // Define o intervalo do callback para 100ms (10Hz)
}
// Lógica principal para detectar pressões do botão e controlar o piscar do LED
void logic() {
static bool button_last_state = false; // Para controlar o último estado do botão
bool button_pressed = !gpio_get(BUTTON_PIN); // Lê o estado do botão (pressionado é LOW)
// Detecta a pressão do botão (detecção de borda)
if (button_pressed && !button_last_state) {
button_press_count++; // Incrementa o contador de pressões
printf("Botão pressionado: %d vez(es)\n", button_press_count);
// Se o botão for pressionado 5 vezes, começa a piscar o LED
if (button_press_count == 5) {
led_blinking = true; // Começa o piscar do LED
printf("Botão pressionado 5 vezes! LED acenderá.\n");
add_alarm_in_ms(500, led_blink_callback, NULL, true); // Começa a piscar a 10Hz
add_alarm_in_ms(10000, turn_off_callback, NULL, false); // Para após 10 segundos
button_press_count = 0; // Reseta o contador de pressões após acionar a ação
}
}
button_last_state = button_pressed; // Atualiza o último estado do botão
}
int main() {
stdio_init_all(); // Inicializa a entrada/saída padrão
clocks_init(); // Inicializa os clocks
init_gpio(); // Inicializa os GPIOs para o botão e o LED
while (true) {
logic(); // Executa a lógica para detectar pressões do botão e controlar o LED
sleep_ms(250); // Aguarda 250ms antes de verificar novamente o botão
}
}
// Função para inicializar os GPIOs para o LED e o botão
void init_gpio() {
gpio_init(LED_PIN); // Inicializa o pino do LED
gpio_set_dir(LED_PIN, GPIO_OUT); // Define o pino do LED como saída
gpio_put(LED_PIN, 0); // Inicializa o LED apagado
gpio_init(BUTTON_PIN); // Inicializa o pino do botão
gpio_set_dir(BUTTON_PIN, GPIO_IN); // Define o pino do botão como entrada
gpio_pull_up(BUTTON_PIN); // Habilita o resistor pull-up interno para o botão
}