/*
Programa de Capacitação em Sistemas Embarcados - Embarcatech 2024
Nome: Bryan Santos Sousa
Mentora: Gabriela
Turma 02 - MICROCODE
Unidade 04 - Q2 - MOODLE
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
#include "hardware/gpio.h"
#define BUTTON_A_PIN 5 // Define o Pino GP do botão
#define BUTTON_B_PIN 6 // Botão que alter a frequência
#define LED_PIN 11 // Define o Pino do LED.
// Define as frequências e a duração
#define FREQUENCIA_A_HZ 10 // Frequência padrão (usada para o Botão A)
#define FREQUENCIA_B_HZ 1 // Frequência alternativa (usada para o Botão B)
#define DURACAO_SECUNDOS 10 // Duração do blinking
// Variáveis globais voláteis
volatile bool led_ativo = false; // Flag para controlar o estado do blinking
volatile int led_contagem = 0; // Contador de blinks
volatile int button_contagem = 0; // Contador de pressionamentos do Botão A
volatile int frequencia_atual_hz = FREQUENCIA_A_HZ; // Frequência atual do blinking
// Variável para armazenar a estrutura do temporizador
struct repeating_timer timer;
// Protótipo da função de callback
bool repeating_timer_callback(struct repeating_timer *t);
// Função para iniciar ou reiniciar o timer com uma dada frequência
void start_timer(int frequencia) {
// Cancela o timer existente
cancel_repeating_timer(&timer);
// Calcula o intervalo em milissegundos
int intervalo_ms = 1000 / (2 * frequencia);
// Inicia o timer com o novo intervalo e frequência
add_repeating_timer_ms(intervalo_ms, repeating_timer_callback, NULL, &timer);
}
// Função de callback do timer
bool repeating_timer_callback(struct repeating_timer *t) {
static int segundos_restantes = DURACAO_SECUNDOS; // Contagem regressiva dos segundos
if (led_ativo) {
// Inverte o estado do LED
gpio_put(LED_PIN, !gpio_get(LED_PIN));
led_contagem++;
// Verifica se a duração foi atingida
if (led_contagem >= DURACAO_SECUNDOS * frequencia_atual_hz * 2) {
// Desativa o blinking
led_ativo = false;
gpio_put(LED_PIN, 0);
led_contagem = 0;
button_contagem = 0; // Reseta a contagem dos botões
segundos_restantes = DURACAO_SECUNDOS; // Reseta a contagem dos segundos
// Cancela o timer
cancel_repeating_timer(&timer);
printf("Contagem zerada e LED desligado.\n\nPressione o Botão A ou B:\n");
} else if (led_contagem % (frequencia_atual_hz * 2) == 0) {
// Imprime o tempo restante
segundos_restantes = DURACAO_SECUNDOS - (led_contagem / (frequencia_atual_hz * 2));
printf("Contagem é %d e LED ligado por %d segundos...\n", 5, segundos_restantes);
}
}
return true;
}
int main() {
stdio_init_all(); // Inicialização padrão
// Inicializa os botões
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_up(BUTTON_B_PIN);
// Inicializa o LED
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
printf("Pressione o Botão A para iniciar a contagem ou o Botão B para alterar a frequência.\n");
printf("(Frequência inicial: 10Hz)\n");
// Loop principal
while (true) {
// Se o LED não está ativo, verifica o Botão A para iniciar a contagem
if (!led_ativo && !gpio_get(BUTTON_A_PIN)) {
sleep_ms(50); // Debounce
if (!gpio_get(BUTTON_A_PIN)) {
button_contagem++; // Incrementa a contagem dos botões
if (button_contagem == 1) {
printf("\n-> Botão A foi pressionado:\n");
}
if (button_contagem >= 5) {
led_ativo = true;
start_timer(frequencia_atual_hz); // Inicia o timer
printf("Contagem é %d e LED ligado por %d segundos...\n", 5, DURACAO_SECUNDOS);
button_contagem = 0; // Reseta a contagem dos botões
} else {
printf("Contagem é %d e LED desligado.\n", button_contagem);
}
while (!gpio_get(BUTTON_A_PIN)) sleep_ms(10); //Aguarda a liberação do botão
}
}
// Botão B: Altera a frequência e interrompe a contagem
if (!gpio_get(BUTTON_B_PIN)) {
sleep_ms(50); // Debounce
if (!gpio_get(BUTTON_B_PIN)) {
// Interrompe o processo
gpio_put(LED_PIN, 0);
cancel_repeating_timer(&timer); //Para o timer
//Altera a frequência
frequencia_atual_hz = (frequencia_atual_hz == FREQUENCIA_A_HZ) ? FREQUENCIA_B_HZ : FREQUENCIA_A_HZ;
printf("⚠️ Botão B pressionado. Frequência alterada para %d Hz e contagem resetada.\n", frequencia_atual_hz);
//Reseta contagens
led_ativo = false;
led_contagem = 0;
button_contagem = 0;
while (!gpio_get(BUTTON_B_PIN)) sleep_ms(10); //Aguarda a liberação do botão
}
}
sleep_ms(10); // Evita ocupação excessiva da CPU
}
return 0;
}Loading
pi-pico-w
pi-pico-w