/*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 "pico/stdlib.h"
#include <stdio.h>
// Definições dos pinos
#define BOTAO_PIN 5 // Pino onde o botão A está conectado
#define LED_PIN 13 // Pino onde o LED está conectado
// Variáveis para o botão
int contador_pressao = 0; // Contador de pressões
const uint8_t leituras_necessarias = 5; // Leituras consistentes para debounce
uint8_t contador_leituras = 0; // Contador para leituras consistentes
bool estado_botao_anterior = true; // Botão começa como "não pressionado"
// Tempo de piscada
const uint32_t tempo_piscada = 10000; // 10 segundos em milissegundos
const uint32_t frequencia_piscada = 100; // Frequência de 10 Hz (100ms ciclo)
// Função para inicializar os pinos
void setup() {
gpio_init(BOTAO_PIN);
gpio_set_dir(BOTAO_PIN, GPIO_IN);
gpio_pull_up(BOTAO_PIN);
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
stdio_init_all();
printf("Sistema inicializado!\n");
}
// Função para verificar o estado do botão e atualizar o contador
void verificar_botao() {
bool botao_atual = !gpio_get(BOTAO_PIN); // Invertido porque está com pull-up
if (botao_atual != estado_botao_anterior) {
contador_leituras++;
if (contador_leituras >= leituras_necessarias) {
estado_botao_anterior = botao_atual;
contador_leituras = 0;
if (botao_atual) {
contador_pressao++;
printf("Botão pressionado! Contagem: %d\n", contador_pressao);
}
}
} else {
contador_leituras = 0;
}
sleep_ms(5); // Delay para estabilidade do debounce
}
// Função para piscar o LED usando contador de tempo
void piscar_led() {
printf("Piscar LED por 10 segundos...\n");
uint32_t tempo_inicio = to_ms_since_boot(get_absolute_time());
while ((to_ms_since_boot(get_absolute_time()) - tempo_inicio) < tempo_piscada) {
gpio_put(LED_PIN, 1); // Acende o LED
sleep_ms(frequencia_piscada / 2); // Meio ciclo ON (50ms para 10 Hz)
gpio_put(LED_PIN, 0); // Apaga o LED
sleep_ms(frequencia_piscada / 2); // Meio ciclo OFF
}
}
int main() {
setup();
while (true) {
verificar_botao();
// Se o botão foi pressionado 5 vezes, piscar o LED
if (contador_pressao >= 5) {
piscar_led();
contador_pressao = 0; // Reseta o contador após a piscada
}
sleep_ms(10); // Delay para evitar sobrecarga de CPU
}
return 0;
}