#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço do LCD
const int pinA = 2; // pino A do encoder
const int pinB = 3; // pino B do encoder
const int buttonPin = 4; // pino do botão do encoder
int currentMenu = 0; // Menu atual
int currentIndex = 0; // Índice do item atualmente selecionado
bool buttonPressed = false;
int potencial = 100; // Valor inicial do potencial
// Menus principais e seus submenus
const char* mainMenu[] = {"Configuracoes", "Cadastrar", "Editar", "Executar"};
const int mainMenuSize = sizeof(mainMenu) / sizeof(mainMenu[0]);
const char* settingsMenu[] = {"PID", "Fervura", "Fator Sensor", "Back"};
const int settingsMenuSize = sizeof(settingsMenu) / sizeof(settingsMenu[0]);
const char* registerMenu[] = {"Receitas", "Adjuntos", "Back"};
const int registerMenuSize = sizeof(registerMenu) / sizeof(registerMenu[0]);
const char* editMenu[] = {"Receitas", "Adicoes", "Back"};
const int editMenuSize = sizeof(editMenu) / sizeof(editMenu[0]);
const char* pidSubMenu[] = {"P: ", "I: ", "D: ", "Back"};
const int pidSubMenuSize = sizeof(pidSubMenu) / sizeof(pidSubMenu[0]);
const char* fervuraSubMenu[] = {"Temp: ", "Fator: ", "Back"};
const int fervuraSubMenuSize = sizeof(fervuraSubMenu) / sizeof(fervuraSubMenu[0]);
void setup() {
lcd.begin(20,4);
lcd.backlight();
pinMode(buttonPin, INPUT_PULLUP);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
// Carregar o valor do potencial da EEPROM
EEPROM.get(0, potencial);
if (potencial < 50 || potencial > 150) {
potencial = 100; // Se o valor estiver fora do intervalo, reseta para 100
}
displayMenu();
}
void loop() {
checkButton();
navigateMenu();
}
void checkButton() {
if (digitalRead(buttonPin) == LOW && !buttonPressed) {
buttonPressed = true;
selectMenu();
delay(300); // Debounce
} else if (digitalRead(buttonPin) == HIGH) {
buttonPressed = false; // Reseta o estado
}
}
void navigateMenu() {
static int lastStateA = HIGH;
int stateA = digitalRead(pinA);
int stateB = digitalRead(pinB);
if (lastStateA == HIGH && stateA == LOW) {
if (stateB == HIGH) { // Girando no sentido horário
currentIndex++;
if (currentIndex >= getCurrentMenuSize()) {
currentIndex = 0;
}
} else { // Girando no sentido anti-horário
currentIndex--;
if (currentIndex < 0) {
currentIndex = getCurrentMenuSize() - 1;
}
}
delay(100); // Delay para evitar movimentos rápidos
displayMenu();
}
lastStateA = stateA;
}
int getCurrentMenuSize() {
switch (currentMenu) {
case 0: return mainMenuSize; // Menu principal
case 1: return settingsMenuSize; // Menu de Configurações
case 2: return registerMenuSize; // Menu de Cadastro
case 3: return editMenuSize; // Menu de Edição
case 4: return pidSubMenuSize; // Submenu PID
case 5: return fervuraSubMenuSize; // Submenu Fervura
default: return 0;
}
}
void selectMenu() {
if (currentMenu == 0) { // Menu principal
if (currentIndex == 0) {
currentMenu = 1; // Acessa Configurações
currentIndex = 0; // Reseta o índice
} else if (currentIndex == 1) {
currentMenu = 2; // Acessa Cadastro
currentIndex = 0; // Reseta o índice
} else if (currentIndex == 2) {
currentMenu = 3; // Acessa Edição
currentIndex = 0; // Reseta o índice
}
} else if (currentMenu == 1) { // Menu de Configurações
if (currentIndex == settingsMenuSize - 1) {
currentMenu = 0; // Retorna ao menu principal
currentIndex = 0; // Reseta o índice
} else if (currentIndex == 0) {
currentMenu = 4; // Acessa submenu PID
currentIndex = 0; // Reseta o índice
} else if (currentIndex == 1) {
currentMenu = 5; // Acessa submenu Fervura
currentIndex = 0; // Reseta o índice
}
} else if (currentMenu == 2 || currentMenu == 3) { // Menus de Cadastro ou Edição
if (currentIndex == getCurrentMenuSize() - 1) {
currentMenu = 0; // Retorna ao menu principal
currentIndex = 0; // Reseta o índice
}
} else if (currentMenu == 4) { // Submenu PID
if (currentIndex == pidSubMenuSize - 1) {
currentMenu = 1; // Retorna ao menu de Configurações
currentIndex = 0; // Reseta o índice
} else if (currentIndex == 0) {
adjustPotencial(); // Ajusta o potencial
}
} else if (currentMenu == 5) { // Submenu Fervura
if (currentIndex == fervuraSubMenuSize - 1) {
currentMenu = 1; // Retorna ao menu de Configurações
currentIndex = 0; // Reseta o índice
}
}
displayMenu(); // Exibe o menu
}
void adjustPotencial() {
int adjusted = potencial; // Começa com o valor atual
bool adjusting = true; // Controle do loop de ajuste
while (adjusting) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Potencial: ");
lcd.print(adjusted);
lcd.setCursor(0, 1);
lcd.print("Use Encoder");
lcd.setCursor(0, 2);
lcd.print("Press Enter");
delay(1000); // Delay para evitar piscar a tela
int stateA = digitalRead(pinA);
int stateB = digitalRead(pinB);
// Verifica a direção do encoder
if (stateA == LOW) {
if (stateB == LOW) {
adjusted++;
if (adjusted > 150) {
adjusted = 150;
}
} else {
adjusted--;
if (adjusted < 50) {
adjusted = 50;
}
}
delay(10); // Delay para evitar movimentos rápidos
}
if (digitalRead(buttonPin) == LOW) {
potencial = adjusted; // Atualiza o potencial
EEPROM.put(0, potencial); // Salva na EEPROM
adjusting = false; // Sai do loop de ajuste
}
}
currentMenu = 4; // Retorna ao submenu PID
displayMenu(); // Exibe o submenu PID após voltar
}
void displayMenu() {
lcd.clear();
for (int i = 0; i < getCurrentMenuSize(); i++) {
lcd.setCursor(0, i);
if (i == currentIndex) {
lcd.print("> ");
} else {
lcd.print(" ");
}
if (currentMenu == 0) {
lcd.print(mainMenu[i]);
} else if (currentMenu == 1) {
lcd.print(settingsMenu[i]);
} else if (currentMenu == 2) {
lcd.print(registerMenu[i]);
} else if (currentMenu == 3) {
lcd.print(editMenu[i]);
} else if (currentMenu == 4) {
lcd.print(pidSubMenu[i]);
} else if (currentMenu == 5) {
lcd.print(fervuraSubMenu[i]);
}
}
}