//Aluno: ANTONIO JOSÉ PORTELA DE JESUS SANTOS
//UNIT04 - Cap. 05 a 08 - ATIVIDADE: TAREFA DE ENVIO - Clock e temporizador
/* Tarefa 2 - Questão 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
por 10 segundos na frequência de 10 Hz.
*/
//Declaração das bibliotecas
#include "pico/stdlib.h"
#include "hardware/timer.h"
#include <stdio.h>
//Definição das variáveis globais, GPIO e constantes
const uint LED_PIN = 13;
const uint BUTTON_PIN = 5;
const uint PERIODO = 100; //Periodo = 1 / Frequencia(10 Hz) = 1/10 s = 100 ms
volatile int button_press_count = 0;
bool led_piscar = false;
//Definição dos protótipos de funções
int64_t turn_off_callback(alarm_id_t id, void *user_data);
bool repeating_timer_callback(struct repeating_timer *t);
void setup(); //Configuração das GPIOs utilizadas.
void controle_led(bool led_piscar); //Função que controla o LED
//Função main
void main() {
setup();
struct repeating_timer timer;
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer); //Callback que lê o botão a cada 100ms
while (true){
/*Controle dos LED's. Variavel led_piscar em true liga o
LED de acordo com a frequencia. Em false desliga o LED.*/
controle_led(led_piscar);
}
}
//Funções implementadas
int64_t turn_off_callback(alarm_id_t id, void *user_data) {
led_piscar = false;
printf("LED desligado\n");
return 0;
}
bool repeating_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time = 0;
static bool button_last_state = false;
bool button_pressed = !gpio_get(BUTTON_PIN);
if (button_pressed && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000) {
last_press_time = get_absolute_time();
button_last_state = true;
button_press_count++;
printf("Botao pressionado %d vez(es)\n",button_press_count);
/*Se o botão for pressionado 5 vezes, variável led_piscar é setada em nivel
alto e iniciada contagem de 10s para chamar o callback que desativa o led*/
if (button_press_count == 5){
led_piscar = true;
add_alarm_in_ms(10000, turn_off_callback, NULL, false);
button_press_count = 0;
}
}
else if (!button_pressed){
button_last_state = false;
}
return true;
}
void setup(){
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN);
}
void controle_led(bool led_piscar){
//Na frequência de 10 Hz, o led liga e desliga 10 vezes em 1 segundo, o que dificulta a percepção dele piscando no Wokwi
if (led_piscar) {
printf("LED piscando na frequência de %d Hz (Led Liga e Desliga %d vezes em 1 segundo)\n",(1000/PERIODO),(1000/PERIODO));
//No período, metade do tempo o LED fica ligado e a outra metade desligado.
gpio_put(LED_PIN, true);
sleep_ms(PERIODO/2);
gpio_put(LED_PIN, false);
sleep_ms(PERIODO/2);
}
else{
sleep_ms(1);//Delay para reduzir uso da CPU e evitar travamentos na simulação do Wokwi
}
}