#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/timer.h"
#define ACIONA_LED 5 // Entrada do botão A -> Inicia a contagem do pressionamento do botão
#define MUDA_FREQ 6 // Entrada do botão B -> Muda a frequencia do pisca led
#define LED_PIN 11 // LED verde onboard da BitDogLab
#define CONTADOR_BOTAO 5 // Número de vezes que o botao foi pressionado
#define FREQ_PISCA 10 // Frequência de piscada em Hz
#define TEMPO_PISCA 10 // Tempo total de piscada em segundos
volatile uint8_t botao_count = 0;
volatile bool pisca_led = false;
volatile uint32_t last_press_time = 0;
const uint32_t debounce_delay = 200000; // 200ms em microssegundos
volatile uint32_t periodo_sinal = 0; //Período do sinal em 10 Hz
volatile uint32_t periodo_sinal_1_Hz = 0; //Período do sinal em 1 Hz
volatile bool botao_B = false;
volatile uint32_t blink_end_time = 0;
// Função para tratamento do botão A
void botao_callback(uint gpio, uint32_t events) {
uint32_t current_time = time_us_32();
if(gpio == ACIONA_LED){
// Debounce simples
if (current_time - last_press_time < debounce_delay) {
return;
}
last_press_time = current_time;
botao_count++;
printf("Botao pressionado: %d.\n", botao_count);
if (gpio == ACIONA_LED && !pisca_led && botao_count==5 && botao_B==false){
pisca_led = true;
//Frequencia 10 Hz
blink_end_time = time_us_32() + (TEMPO_PISCA * 1000000);
while (time_us_32() < blink_end_time) {
gpio_put(LED_PIN, 1);
sleep_us(20000);
gpio_put(LED_PIN, 0);
sleep_us(80000);
}
pisca_led = false;
botao_count = 0; // Reinicia a contagem
}else if(gpio == ACIONA_LED && !pisca_led && botao_count==5 && botao_B==true){
pisca_led = true;
//Frequencia 1 Hz
blink_end_time = time_us_32() + (TEMPO_PISCA * 1000000);
while (time_us_32() < blink_end_time) {
gpio_put(LED_PIN, 1);
sleep_us(500000);
gpio_put(LED_PIN, 0);
sleep_us(500000);
}
pisca_led = false;
botao_count = 0; // Reinicia a contagem
}
}
if(gpio == MUDA_FREQ){
// Debounce simples
if (current_time - last_press_time < debounce_delay) {
return;
}
last_press_time = current_time;
botao_B = !botao_B;
if(botao_B==false){
printf("Frequencia 10 Hz.\n");
}else{
printf("Frequencia 1 Hz.\n");
}
}
}
void setup(){
stdio_init_all();
// Configuração do LED
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
// Configuração do botão com pull-up
gpio_init(ACIONA_LED);
gpio_set_dir(ACIONA_LED, GPIO_IN);
gpio_pull_up(ACIONA_LED);
gpio_init(MUDA_FREQ);
gpio_set_dir(MUDA_FREQ, GPIO_IN);
gpio_pull_up(MUDA_FREQ);
}
int main() {
setup();
// Configura interrupção para o botão
// Configura cada pino individualmente
gpio_set_irq_enabled_with_callback(ACIONA_LED, GPIO_IRQ_EDGE_FALL, true, &botao_callback);
gpio_set_irq_enabled_with_callback(ACIONA_LED, GPIO_IRQ_EDGE_FALL, true, &botao_callback);
gpio_set_irq_enabled_with_callback(MUDA_FREQ, GPIO_IRQ_EDGE_FALL, true, &botao_callback);
// Loop principal
while (true) {
tight_loop_contents();
}
return 0;
}