//Aluno: ANTONIO JOSÉ PORTELA DE JESUS SANTOS
//UNIT04 - Cap. 05 a 08 - ATIVIDADE: TAREFA DE ENVIO - Clock e temporizador
/* Tarefa 2 - Questão 2 - Na questão anterior, implemente o botão B,
para mudar a frequência do LED para 1 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_A = 5;
const uint BUTTON_PIN_B = 28;
int 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();
void controle_led(bool led_piscar);
//Função main
void main() {
setup();
struct repeating_timer timer;
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);
while (true){
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");
PERIODO=100; //Restaura o período inicial de 100ms, para a frequência de 10 Hz
return 0;
}
bool repeating_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time = 0;
static bool button_a_last_state = false;
static bool button_b_last_state = false;
bool button_a_pressed = !gpio_get(BUTTON_PIN_A);
bool button_b_pressed = !gpio_get(BUTTON_PIN_B);
/**/
if (button_a_pressed && !button_a_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000) {
last_press_time = get_absolute_time();
button_a_last_state = true;
button_press_count++;
printf("Botao pressionado %d vez(es)!\n",button_press_count);
/*Se o botão A 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;
}
}
/*Verifica se o botão B foi pressionado somente após o LED começar a piscar.
Se pressionado, muda o PERIODO para 1000ms, que é equivalente a frequência de
1 Hz*/
if(led_piscar==true && !button_b_last_state && button_b_pressed && absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000){
last_press_time = get_absolute_time();
button_b_last_state = true;
PERIODO=1000;
}
else if (!button_a_pressed){
button_a_last_state = false;
}
else if (!button_b_pressed){
button_b_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_A);
gpio_set_dir(BUTTON_PIN_A, GPIO_IN);
gpio_pull_up(BUTTON_PIN_A);
gpio_init(BUTTON_PIN_B);
gpio_set_dir(BUTTON_PIN_B, GPIO_IN);
gpio_pull_up(BUTTON_PIN_B);
}
void controle_led(bool led_piscar){
if (led_piscar) {
printf("LED piscando na frequência de %d Hz (Led Liga e Desliga %d vez(es) em 1 segundo)\n",(1000/PERIODO),(1000/PERIODO));
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 o funcionamento ocioso da CPU, QUE FAZ O WOKWI FICAR LENTO
}
}