#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "ssd1306.h"// Assumindo que você tem uma biblioteca para o SSD1306 como "ssd1306.h"
// Definições para o display SSD1306
#define SSD1306_I2C_ADDR 0x3C
#define SSD1306_WIDTH 128
#define SSD1306_HEIGHT 64
// Definição dos pinos do joystick
#define JOY_X 26
#define JOY_Y 27
#define JOY_BTN 28
// Inicialização do display OLED
#define I2C_PORT i2c0
#define I2C_SDA 16
#define I2C_SCL 17
// Variáveis do menu e submenu
const char *menu_inicio[] = {"LED ON", "LED OFF", "Submenu"};
const char *menu_submenu[] = {"Alarme", "Brilho", "Voltar"};
const char **menu_atual = menu_inicio;
int menu_size = 3;
int menu_index = 0;
bool submenu = false;
// Definição do tipo para SSD1306
typedef struct {
i2c_inst_t *i2c;
uint8_t address;
uint8_t buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];
} ssd1306_t;
ssd1306_t oled;
// Função de inicialização do SSD1306
void ssd1306_init(ssd1306_t *oled, i2c_inst_t *i2c, uint8_t address) {
oled->i2c = i2c;
oled->address = address;
memset(oled->buffer, 0, sizeof(oled->buffer));
// Envia os comandos de inicialização do SSD1306
uint8_t init_sequence[] = {
0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x00, 0xA1, 0xC8,
0xDA, 0x12, 0x81, 0x7F, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF
};
i2c_write_blocking(oled->i2c, oled->address, init_sequence, sizeof(init_sequence), false);
}
// Função para limpar o buffer do display
void ssd1306_clear(ssd1306_t *oled) {
memset(oled->buffer, 0, sizeof(oled->buffer));
}
// Função para atualizar o display
void ssd1306_update(ssd1306_t *oled) {
for (int page = 0; page < 8; page++) {
uint8_t data[] = {0xB0 + page, 0x00, 0x10};
i2c_write_blocking(oled->i2c, oled->address, data, 3, true);
i2c_write_blocking(oled->i2c, oled->address, &oled->buffer[page * SSD1306_WIDTH], SSD1306_WIDTH, false);
}
}
// Função para desenhar um pixel no display
void ssd1306_draw_pixel(ssd1306_t *oled, int x, int y, bool color) {
if (x < 0 || x >= SSD1306_WIDTH || y < 0 || y >= SSD1306_HEIGHT) return;
if (color) {
oled->buffer[x + (y / 8) * SSD1306_WIDTH] |= (1 << (y % 8));
} else {
oled->buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
}
}
// Função para desenhar um caractere
void ssd1306_draw_char(ssd1306_t *oled, int x, int y, char c, bool color) {
const uint8_t font[5] = {0x7E, 0x09, 0x09, 0x09, 0x7E}; // Exemplo de fonte 5x7 (A letra 'A')
for (int i = 0; i < 5; i++) {
uint8_t line = font[i];
for (int j = 0; j < 8; j++) {
if (line & (1 << j)) {
ssd1306_draw_pixel(oled, x + i, y + j, color);
}
}
}
}
// Função para desenhar uma string
void ssd1306_draw_string(ssd1306_t *oled, int x, int y, const char *str, bool color) {
while (*str) {
ssd1306_draw_char(oled, x, y, *str, color);
str++;
x += 6; // Move 6 pixels para o próximo caractere
}
}
// Função para desenhar o menu no OLED
void draw_menu() {
ssd1306_clear(&oled);
for (int i = 0; i < menu_size; i++) {
if (i == menu_index) {
ssd1306_draw_string(&oled, 5, i * 10, ">", true); // Indica item selecionado
}
ssd1306_draw_string(&oled, 15, i * 10, menu_atual[i], true);
}
ssd1306_update(&oled);
}
// Função principal
int main() {
stdio_init_all();
// Inicializa GPIOs do joystick
gpio_init(JOY_X);
gpio_init(JOY_Y);
gpio_init(JOY_BTN);
gpio_set_dir(JOY_X, GPIO_IN);
gpio_set_dir(JOY_Y, GPIO_IN);
gpio_set_dir(JOY_BTN, GPIO_IN);
gpio_pull_up(JOY_BTN);
// Inicializa OLED
i2c_init(I2C_PORT, 400 * 1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
ssd1306_init(&oled, I2C_PORT, SSD1306_I2C_ADDR);
while (1) {
draw_menu();
if (!gpio_get(JOY_X)) { // Direita (próximo item)
menu_index = (menu_index + 1) % menu_size;
sleep_ms(200);
}
if (!gpio_get(JOY_Y)) { // Seleciona item
if (!submenu && menu_index == 2) { // Entra no submenu
menu_atual = menu_submenu;
menu_size = 3;
submenu = true;
} else if (submenu && menu_index == 2) { // Voltar ao menu principal
menu_atual = menu_inicio;
menu_size = 3;
submenu = false;
} else {
printf("Selecionado: %s\n", menu_atual[menu_index]);
}
sleep_ms(200);
}
}
}