//Feito as correções de erros e organização do codigo com a ajuda: https://copilot.microsoft.com/
// Feito o programa do joystick LED com base em: https://github.com/BitDogLab/BitDogLab-C/tree/main/Joystick_led
//Feito o buzzer tocar com base em: https://github.com/BitDogLab/BitDogLab-C/tree/main/buzzer_pwm1
//Feito Ligar o LED RGB com base em: https://github.com/BitDogLab/BitDogLab-C/tree/main/PWM_LED_0
//Feito com base em:https://www.dropbox.com/scl/fi/bnqlzk2puvu5qk1x69q81/Menu_OLED.zip?e=2&file_subpath=%2FMenu_OLED%2FMenu_OLED.c&rlkey=lkk4bqrf1fmic8csidgco1a28&dl=0
//Feito a parte do buzzer com a ajuda: https://copilot.microsoft.com/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "ssd1306.h"
#include "hardware/adc.h"
// Pinos e módulos controlador i2c selecionado
#define I2C_PORT i2c1
#define PINO_SCL 14
#define PINO_SDA 15
// Botão do Joystick
const int SW = 22;
// Definição dos LEDs RGB
const uint BLUE_LED_PIN = 12; // LED azul no GPIO 12
const uint RED_LED_PIN = 13; // LED vermelho no GPIO 13
const uint GREEN_LED_PIN = 11; // LED verde no GPIO 11
// Pino do buzzer
const uint BUZZER_PIN = 10;
// Variável para armazenar a posição do seletor do display
uint pos_y = 12;
ssd1306_t disp;
volatile bool buzzer_ativo = false;
volatile bool execucao_em_andamento = false;
// Função para inicialização de todos os recursos do sistema
void inicializa(){
stdio_init_all();
adc_init();
adc_gpio_init(26);
adc_gpio_init(27);
i2c_init(I2C_PORT, 400*1000); // I2C Inicialização. Usando 400Khz.
gpio_set_function(PINO_SCL, GPIO_FUNC_I2C);
gpio_set_function(PINO_SDA, GPIO_FUNC_I2C);
gpio_pull_up(PINO_SCL);
gpio_pull_up(PINO_SDA);
disp.external_vcc = false;
ssd1306_init(&disp, 128, 64, 0x3C, I2C_PORT);
// Inicialização dos LEDs
gpio_init(RED_LED_PIN);
gpio_init(GREEN_LED_PIN);
gpio_init(BLUE_LED_PIN);
gpio_set_dir(RED_LED_PIN, GPIO_OUT);
gpio_set_dir(GREEN_LED_PIN, GPIO_OUT);
gpio_set_dir(BLUE_LED_PIN, GPIO_OUT);
// Inicializa o pino do buzzer
gpio_init(BUZZER_PIN);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
// Inicialmente, desligar o LED RGB e buzzer
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 0);
gpio_put(BLUE_LED_PIN, 0);
gpio_put(BUZZER_PIN, 0);
// Botão do Joystick
gpio_init(SW); // Inicializa o pino do botão
gpio_set_dir(SW, GPIO_IN); // Configura o pino do botão como entrada
gpio_pull_up(SW); // Ativa o pull-up no pino do botão para evitar flutuações
}
// Função escrita no display
void print_texto(char *msg, uint pos_x, uint pos_y, uint scale){
ssd1306_draw_string(&disp, pos_x, pos_y, scale, msg); // Desenha texto
ssd1306_show(&disp); // Apresenta no Oled
}
// O desenho do retângulo fará o papel de seletor
void print_retangulo(int x1, int y1, int x2, int y2){
ssd1306_draw_empty_square(&disp, x1, y1, x2, y2);
ssd1306_show(&disp);
}
void tocar_buzzer(){
while(execucao_em_andamento && buzzer_ativo) {
gpio_put(BUZZER_PIN, 1);
sleep_ms(100);
gpio_put(BUZZER_PIN, 0);
sleep_ms(100);
}
}
int main()
{
inicializa();
char *text = ""; // Texto do menu
uint countdown = 0; // Verificar seleções para baixo do joystick
uint countup = 2; // Verificar seleções para cima do joystick
while(true) {
// Trecho de código aproveitado de https://github.com/BitDogLab/BitDogLab-C/blob/main/joystick/joystick.c
adc_select_input(0);
uint adc_y_raw = adc_read();
const uint bar_width = 40;
const uint adc_max = (1 << 12) - 1;
uint bar_y_pos = adc_y_raw * bar_width / adc_max; // bar_y_pos determinará se o Joystick foi pressionado para cima ou para baixo
// Texto do Menu
ssd1306_clear(&disp); // Limpa a tela
print_texto(text = "Menu", 52, 2, 1);
print_retangulo(2, pos_y, 120, 18);
print_texto(text = "joystick LED", 6, 18, 1.5);
print_texto(text = "Tocar o buzzer", 6, 30, 1.5);
print_texto(text = "LED RGB", 6, 42, 1.5);
// printf("Valor de y e: %d", bar_y_pos);
// o valor de 20 é o estado de repouso do Joystick
if(bar_y_pos < 20 && countdown < 2) {
pos_y += 12;
countdown += 1;
countup -= 1;
} else if(bar_y_pos > 20 && countup < 2) {
pos_y -= 12;
countup += 1;
countdown -= 1;
}
sleep_ms(250);
// Verifica se botão foi pressionado
if(gpio_get(SW) == 0) {
switch (pos_y) {
case 12:
execucao_em_andamento = !execucao_em_andamento;
if (execucao_em_andamento) {
// Ativa o LED verde
gpio_put(BLUE_LED_PIN, 0);
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 1);
} else {
// Desativa todos os LEDs
gpio_put(BLUE_LED_PIN, 0);
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 0);
}
break;
case 24:
execucao_em_andamento = !execucao_em_andamento;
buzzer_ativo = execucao_em_andamento;
if (execucao_em_andamento) {
// Ativa o Buzzer
tocar_buzzer();
} else {
// Desativa o Buzzer
gpio_put(BUZZER_PIN, 0);
}
break;
case 36:
execucao_em_andamento = !execucao_em_andamento;
if (execucao_em_andamento) {
// Ativa o LED azul
gpio_put(BLUE_LED_PIN, 1);
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 0);
} else {
// Desativa todos os LEDs
gpio_put(BLUE_LED_PIN, 0);
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 0);
}
break;
default:
gpio_put(BLUE_LED_PIN, 0);
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN, 0);
gpio_put(BUZZER_PIN, 0);
break;
}
sleep_ms(500); // Debounce
}
}
return 0;
}