#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
const uint LED_PIN = 13; //Pino do LED
const uint LED_VERDE = 11; //Sinalização da mudança de frequência
const uint BUTTON_PIN = 5; //Pino do botao
const uint BUTTON_FREQ = 6; //Pino para mudança de frequência
volatile int button_press_count = 0; //Contador de pressões do botão
volatile int flag_count = 0;
volatile bool led_freq_1 = false;
volatile bool led_freq_2 = false;
volatile bool led_active = false;
bool repeating_timer_callback(struct repeating_timer *t){
static absolute_time_t last_press_time = 0;
static bool button_last_state = false;
bool button_pressed = !gpio_get(BUTTON_PIN); // Pressionado = LOW
bool button_pressed_freq = !gpio_get(BUTTON_FREQ); // Pressionado = LOW
//printf("Testando o loop\n");
if(button_pressed && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000){//200 ms
last_press_time = get_absolute_time();
button_last_state = true;
button_press_count++;
printf("Botão pressionado: %d \n",button_press_count);
if(button_press_count==5){//Verifica se o contador de aperto do
//botão ja estourou
button_press_count=0;//Zera contador
led_active = true; //Seta nível lógico true na flag
if(flag_count == 1){
led_freq_1 = true;
led_freq_2 = false;
}else if(flag_count == 2 || flag_count == 0){
led_freq_2 = true;
led_freq_1 = false;
}
}
}else if(!button_pressed){
button_last_state = false;//Resetar estado quando o botão é liberado
}
if(button_pressed_freq && !button_last_state &&
absolute_time_diff_us(last_press_time, get_absolute_time()) > 200000){
button_last_state = true;
last_press_time = get_absolute_time();
//printf("Testando mudança de frequência\n");
if(flag_count==2){
flag_count = 0;
}
flag_count++;
if(flag_count == 1){
led_freq_1 = true;
led_freq_2 = false;
printf("Frequência de 1 Hz ativa!\n\n");
}else if(flag_count == 2 || flag_count == 0){
led_freq_2 = true;
led_freq_1 = false;
printf("Frequência de 10 Hz ativa!\n\n");
}
gpio_put(LED_VERDE, false);
}else if(!button_pressed){
button_last_state = false;//Resetar estado quando o botão é liberado
}
return true; //Continuar o temporizador de repetição
}
//Função responsável por piscar o LED na fequência de 10 Hz por
//10 segundos
void pisca_LED(){
uint64_t inicio = to_us_since_boot(get_absolute_time());
uint64_t fim = to_us_since_boot(get_absolute_time()+10000000);
if(led_active == true){
if(led_freq_1 == true){
printf("\n1 Hz ativo\n");
led_freq_1 = false;
while(get_absolute_time() <= fim){
gpio_put(LED_PIN, true);
sleep_ms(100);//10 ms segundos led ligado
gpio_put(LED_PIN,false);
sleep_ms(900);//90 ms segundos led desligado
}
}else if(led_freq_2 == true || flag_count == 0){
printf("\n10 Hz ativo\n");
while(get_absolute_time() <= fim){
gpio_put(LED_PIN, true);
sleep_ms(10);//10 ms segundos led ligado
gpio_put(LED_PIN,false);
sleep_ms(90);//90 ms segundos led desligado
}
led_freq_2 = false;
}
printf("LED apagado!\n\n");
led_active = false;
}
}
//Função responsável por configurar o os pinos do microcontrolador
void setup(){
//Configurar o pino do LED como saída
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0); //LED começa apagado
//Configurar o pino do LED como saída
gpio_init(LED_VERDE);
gpio_set_dir(LED_VERDE, GPIO_OUT);
gpio_put(LED_VERDE, 0); //LED começa apagado
//Configurar o pino do botão como entrada com pull-up interno
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN);//Aciona o pull-up interno do microcontrolador
//Configurar o pino do botão como entrada com pull-up interno
gpio_init(BUTTON_FREQ);
gpio_set_dir(BUTTON_FREQ, GPIO_IN);
gpio_pull_up(BUTTON_FREQ);//Aciona o pull-up interno do microcontrolador
}
int main(){
stdio_init_all();
setup();
//Configurar o temporizador para verificar o estado do botão a cada 100 ms
struct repeating_timer timer;
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);
while(true){//O loop principal fica livre para outras tarefas
//O temporizador cuida do controle do botão e do LED
tight_loop_contents();
if(led_active == true){//Verifica se a contador do botao já atingiu o valor
pisca_LED();
}
}
}