//Antonio Sergio Castro de Carvalho Junior
#include "pico/stdlib.h"
#include "hardware/timer.h"
#include <stdio.h>
// Configuração dos pinos
const uint LED_PIN = 13; // LED principal
const uint BUTTON_A_PIN = 5; // (A) Botão de acionamento
const uint BUTTON_B_PIN = 28; // (B) Botão para alterar a frequência para 1Hz
// Estados do sistema
volatile int button_press_count = 0; // Contagem botão A
volatile bool led_blinking = false; // Status do LED
volatile int blink_frequency_ms = 100; // Frequência base (10Hz)
volatile int blink_counter = 0; // Ciclos completos
volatile int current_blink_frequency_ms = 100; // Frequência atual
struct repeating_timer led_timer; // Timer do LED
struct repeating_timer button_timer; // Timer dos botões
// Controla a piscada do LED
bool led_blink_callback(struct repeating_timer *t) {
static absolute_time_t last_blink_time;
// Verifica intervalo correto para piscar
if (absolute_time_diff_us(last_blink_time, get_absolute_time()) >= current_blink_frequency_ms * 1000) {
gpio_put(LED_PIN, !gpio_get(LED_PIN)); // Alterna LED
last_blink_time = get_absolute_time();
blink_counter++;
}
current_blink_frequency_ms = blink_frequency_ms; // Atualiza frequência
// Desliga após 10 segundos (calculado pela frequência)
if (blink_counter >= (10000 / current_blink_frequency_ms)) {
led_blinking = false;
gpio_put(LED_PIN, false);
blink_counter = 0;
cancel_repeating_timer(t);
printf("LED desligado após piscar por 10 segundos\n");
}
return true;
}
// Verifica botões periodicamente
bool button_timer_callback(struct repeating_timer *t) {
static absolute_time_t last_press_time_A, last_press_time_B;
static bool initialized = false;
// Inicialização dos tempos
if (!initialized) {
last_press_time_A = last_press_time_B = get_absolute_time();
initialized = true;
}
// Botão A - Acionamento do LED
bool button_A_pressed = !gpio_get(BUTTON_A_PIN);
if (button_A_pressed && (absolute_time_diff_us(last_press_time_A, get_absolute_time()) > 200000)) {
last_press_time_A = get_absolute_time();
button_press_count++;
printf("Botão pressionado %d vezes\n", button_press_count);
// 5 pressionamentos = ativa LED
if (button_press_count == 5) {
button_press_count = 0;
led_blinking = true;
blink_counter = 0;
current_blink_frequency_ms = blink_frequency_ms;
add_repeating_timer_ms(1, led_blink_callback, NULL, &led_timer);
printf("O LED está piscando na frequência de %dHz.\n", 1000 / blink_frequency_ms);
}
}
// Botão B - Configura frequência
bool button_B_pressed = !gpio_get(BUTTON_B_PIN);
if (button_B_pressed && (absolute_time_diff_us(last_press_time_B, get_absolute_time()) > 200000)) {
last_press_time_B = get_absolute_time();
// Alterna entre 10Hz e 1Hz
blink_frequency_ms = (blink_frequency_ms == 100) ? 1000 : 100;
printf("Frequência alterada para %dHz.\n", 1000 / blink_frequency_ms);
}
return true;
}
int main() {
stdio_init_all();
sleep_ms(100);
printf("SISTEMA INICIADO\n");
// Configuração inicial
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, false);
// Configuração dos 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);
// Inicia monitoramento dos botões
add_repeating_timer_ms(100, button_timer_callback, NULL, &button_timer);
while (true) {
tight_loop_contents();
}
}
A
B