#include <stdio.h>
#include "pico/stdlib.h"
//#include "pico/cyw43_arch.h"
//#include "button.h"
//Definições relacioadas ao LED
#define Led_Pin 2
uint8_t led_value=0;
#define pino_led 3
#define Led_Pin2 5
#define Led_Pin3 6
//Pino de interrupção
#define button_1 1
#define button_2 4
uint8_t conta_botao = 0, conta_repeticao =0, frequencia=0, reduz_Hz=0, habilita_mudanca=0;
//funções relacionadas ao timer
struct repeating_timer timer;
bool repeating_timer_callback(struct repeating_timer *t);
static void gpio_irq_handler(uint gpio, uint32_t events);
int main()
{
//stdio_init_all();
//Configura o botão 1 de entrada botão utilizado para relizar a contagem dos pulsos
//para ativação da função que faz o led vermelho piscar
gpio_init(button_1);
gpio_set_dir(button_1, 0);
//Configura o botão 2 de entrada que altera a frequencia do led vermelho
gpio_init(button_2);
gpio_set_dir(button_2, 0);
//Configura o Led vermelho de referência que pisca conforme a frequência
gpio_init(Led_Pin);
gpio_set_dir(Led_Pin, 1);
//Configura o Led Azul
//Led azul ativo significa que é possivel alterar a frequencia do led
gpio_init(Led_Pin2);
gpio_set_dir(Led_Pin2, 1);
gpio_put(Led_Pin2,1);
//Configura o Led branco
//Led branco ativo significa que a frequencia é de 1Hz, desativado 10Hz
gpio_init(Led_Pin3);
gpio_set_dir(Led_Pin3, 1);
gpio_put(Led_Pin3,0);
//Configura o Led verde, led que demonstra o funcionamento do botão 1
gpio_init(pino_led);
gpio_set_dir(pino_led, 1);
//habilita resistor de pullup na entrado digital 1
gpio_pull_up(button_1);
//habilita interrupção no pino digital 1
gpio_set_irq_enabled_with_callback(button_1,GPIO_IRQ_EDGE_FALL,true,&gpio_irq_handler);
//habilita resistor de pullup na entrado digital 4
gpio_pull_up(button_2);
//habilita interrupção no pino digital 4 na borda de descida
gpio_set_irq_enabled(button_2,GPIO_IRQ_EDGE_FALL,true);
//adiciona uma interrupção que se repete
add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);
while (true) {
}
}
bool repeating_timer_callback(struct repeating_timer *t) {
if(conta_botao>=5){
habilita_mudanca=1;
gpio_put(Led_Pin2,0);
if(frequencia!=1){
if(conta_repeticao<=99){
led_value=1-led_value;
gpio_put(Led_Pin,led_value);
conta_repeticao++;
}
if(conta_repeticao>99){
conta_botao=0;
conta_repeticao=0;
habilita_mudanca=0;
gpio_put(Led_Pin2,1);
}
}
if(frequencia==1){
reduz_Hz++;
if(reduz_Hz==10){
if(conta_repeticao<=9){
led_value=1-led_value;
gpio_put(Led_Pin,led_value);
conta_repeticao++;
}
if(conta_repeticao>9){
conta_botao=0;
conta_repeticao=0;
habilita_mudanca=0;
gpio_put(Led_Pin2,1);
}
reduz_Hz=0;
}
}
}
return true;
}
void gpio_irq_handler(uint gpio, uint32_t events){
if(gpio==button_1){
conta_botao++;
if(conta_botao%2==0){
gpio_put(pino_led,0);
}
else if(conta_botao%2!=0){
gpio_put(pino_led,1);
}
}
if(gpio==button_2){
if(habilita_mudanca==0 && frequencia!=1){
frequencia=1;
//habilita_mudanca=1;
gpio_put(Led_Pin3,1);
}
else if(habilita_mudanca==0 && frequencia==1){
frequencia=10;
//habilita_mudanca=1;
gpio_put(Led_Pin3,0);
}
}
}