#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "u8g2.h"
// Definições dos pinos
#define SDA_PIN 4
#define SCL_PIN 5
#define BUTTON_A_PIN 14
#define BUTTON_B_PIN 15
#define ENERGY_ELECTRIC_PIN 16
#define ENERGY_SOLAR_PIN 17
// Variáveis globais
bool auto_mode = false;
bool current_source = true; // true = elétrica, false = solar
u8g2_t u8g2;
// Função para inicializar a tela OLED
void init_oled() {
u8g2_Setup_ssd1306_i2c_128x64_noname_f(
&u8g2,
U8G2_R0,
u8x8_byte_sw_i2c,
u8x8_gpio_and_delay_pico
);
u8g2_SetI2CAddress(&u8g2, 0x3C);
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);
}
// Função para exibir informações na OLED
void display_status(const char* mode, const char* source) {
u8g2_ClearBuffer(&u8g2);
u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
u8g2_DrawStr(&u8g2, 0, 10, "Modo:");
u8g2_DrawStr(&u8g2, 50, 10, mode);
u8g2_DrawStr(&u8g2, 0, 30, "Fonte:");
u8g2_DrawStr(&u8g2, 50, 30, source);
u8g2_SendBuffer(&u8g2);
}
// Função principal
int main() {
stdio_init_all();
// Inicializar GPIOs
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_down(BUTTON_A_PIN);
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_down(BUTTON_B_PIN);
gpio_init(ENERGY_ELECTRIC_PIN);
gpio_set_dir(ENERGY_ELECTRIC_PIN, GPIO_IN);
gpio_init(ENERGY_SOLAR_PIN);
gpio_set_dir(ENERGY_SOLAR_PIN, GPIO_IN);
// Inicializar I2C
i2c_init(i2c0, 100 * 1000);
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
// Inicializar OLED
init_oled();
while (1) {
// Leitura dos botões
bool button_a_pressed = gpio_get(BUTTON_A_PIN);
bool button_b_pressed = gpio_get(BUTTON_B_PIN);
if (button_a_pressed) {
auto_mode = false;
current_source = !current_source;
}
if (button_b_pressed) {
auto_mode = !auto_mode;
}
if (auto_mode) {
bool electric_status = gpio_get(ENERGY_ELECTRIC_PIN);
bool solar_status = gpio_get(ENERGY_SOLAR_PIN);
if (!electric_status) {
current_source = false;
} else if (!solar_status) {
current_source = true;
}
}
// Exibição na tela
const char* mode = auto_mode ? "Automatico" : "Manual";
const char* source = current_source ? "Eletrica" : "Solar";
display_status(mode, source);
sleep_ms(500);
}
return 0;
}