/* Embarcatech: 21-01-2025
* Autor: Marcio Barbosa
* 4 - Microcontroladores - Tarefa 1 - Firmware Embarcado
* exerc_1. 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 10 segundos na frequência de 10 Hz.
*
* Para realizar este experimento, foi necessário os seguintes componentes:
* 1 x Raspberry Pi Pico W ,
* 1 x LED (preferencialmente de cor verde)
* 1 x Resistor de 330 ohms
* 1 x Botão de pressão (push button)
*/
#include <stdio.h>
#include "pico/stdlib.h"
// Definições de GPIOs
#define BTN_A 5
#define LEDPIN 13
// Variável global para contar as pressões do botão
// volatile --> https://embarcados.com.br/modificadores-de-acesso-na-linguagem-c/
volatile int count = 0;
volatile bool led_active = false;
// Função para debounce (verifica e ignora oscilações rápidas do botão)
bool debounce(uint gpio) {
static uint32_t last_time = 0;
//https://lorenz-ruprecht.at/docu/pico-sdk/1.4.0/html/group__timestamp.html
uint32_t current_time = to_ms_since_boot(get_absolute_time());
//currente - estado atual
//last - estado anterior
if (current_time - last_time > 200) { // 200 ms para debounce sleep_ms(200) espera
last_time = current_time;
printf("Botão pressionado, %d \n",count+1);
return true; // Botão pressionado validado
}
return false; // Ignora como ruído
}
// Interrupcao para o para o botão A
void interrupcaoBTNA(uint gpio, uint32_t events) {
if (gpio == BTN_A && debounce(gpio)) {
count++;
}
}
int main() {
// Inicialização
stdio_init_all();
gpio_init(LEDPIN);
gpio_set_dir(LEDPIN, GPIO_OUT);
gpio_init(BTN_A);
gpio_set_dir(BTN_A, GPIO_IN);
gpio_pull_up(BTN_A);
// Configura interrupção para o botão A
gpio_set_irq_enabled_with_callback(BTN_A, GPIO_IRQ_EDGE_FALL, true, &interrupcaoBTNA);
while (true) {
if (count >= 5 && !led_active) {
count = 0; // Reseta a contagem
led_active = true; // LED está ativo
printf("## AGUARDE, LED acionado por 10 segundos \n");
// Piscar o LED por 10 segundos a 10 Hz
int delay_ms = 50; // Frequência de 10 Hz (50 ms ligado, 50 ms desligado)
for (int i = 0; i < 100; i++) { // 100 ciclos -> 10 segundos
gpio_put(LEDPIN, 1);
sleep_ms(delay_ms);
gpio_put(LEDPIN, 0);
sleep_ms(delay_ms);
}
led_active = false; // LED não está mais ativo
printf("## ZERANDO AS VARIAVEIS PARA NOVO TESTE, Pressione mais 5 vezes \n");
}
}
return 0;
}