// IFMA - SISTEMAS EMBARCADOS
// HUGO FELIPE DOS SANTOS ROCHA
// UNIT04 - Cap. 05 a 08 - ATIVIDADE: TAREFA DE ENVIO - Clock e temporizador
/*TAREFA 2:
2. Na questão anterior, implemente o botão B, para mudar a frequência do LED para 1 Hz.
*/
#include "pico/stdlib.h"
#include "hardware/timer.h"
#define BUTTON_A_PIN 2
#define BUTTON_B_PIN 3
#define LED_PIN 4
#define DEFAULT_BLINK_FREQUENCY_HZ 10
#define ALTERNATE_BLINK_FREQUENCY_HZ 1
#define BLINK_DURATION_SEC 10
volatile uint8_t button_a_press_count = 0;
volatile bool led_blinking = false;
volatile uint blink_frequency_hz = DEFAULT_BLINK_FREQUENCY_HZ;
// Callback para verificar o estado dos botões
bool button_callback(repeating_timer_t *rt) {
static bool last_button_a_state = false;
static bool last_button_b_state = false;
bool current_button_a_state = gpio_get(BUTTON_A_PIN);
bool current_button_b_state = gpio_get(BUTTON_B_PIN);
if (current_button_a_state && !last_button_a_state) {
button_a_press_count++;
}
if (current_button_b_state && !last_button_b_state) {
blink_frequency_hz = (blink_frequency_hz == DEFAULT_BLINK_FREQUENCY_HZ) ? ALTERNATE_BLINK_FREQUENCY_HZ : DEFAULT_BLINK_FREQUENCY_HZ;
}
last_button_a_state = current_button_a_state;
last_button_b_state = current_button_b_state;
return true; // Continue chamando o callback
}
// Função para piscar o LED
void blink_led(uint pin, uint frequency_hz, uint duration_sec) {
uint interval_us = 1000000 / frequency_hz;
uint64_t total_blinks = frequency_hz * duration_sec;
for (uint64_t i = 0; i < total_blinks; i++) {
gpio_put(pin, 1);
sleep_us(interval_us / 2);
gpio_put(pin, 0);
sleep_us(interval_us / 2);
}
}
int main() {
stdio_init_all();
// Configuração dos pinos
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_down(BUTTON_A_PIN);
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_down(BUTTON_B_PIN);
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
// Configuração do temporizador repetitivo para monitorar os botões
repeating_timer_t button_timer;
add_repeating_timer_ms(10, button_callback, NULL, &button_timer);
while (true) {
if (button_a_press_count >= 5 && !led_blinking) {
led_blinking = true; // Evita múltiplas execuções simultâneas
button_a_press_count = 0; // Reinicia o contador
blink_led(LED_PIN, blink_frequency_hz, BLINK_DURATION_SEC);
led_blinking = false; // Permite nova contagem após o piscar
}
tight_loop_contents(); // Economiza energia enquanto espera
}
return 0;
}
Botão A
Botão B