#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define pinCLK 2 // Pino CLK do encoder
#define pinDT 3 // Pino DT do encoder
#define pinSW 4 // Pino do botão do encoder
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int numMenus = 3;
const char* menus[numMenus] = {"Saude", "Lojas", "Escola"};
const char* saudeMessages[] = {"1", "2", "3"};
const char* lojasMessages[] = {"M1", "M2", "M3"};
const char* escolaMessages[] = {"Me1", "Me2", "Me3"};
volatile int lastCLKState = HIGH;
int currentMenu = 0;
int currentMessage = 0;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Tecnologia");
lcd.setCursor(0, 1);
lcd.print("Assistiva");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Menu: ");
lcd.setCursor(6, 1);
lcd.print(menus[currentMenu]);
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
pinMode(pinSW, INPUT_PULLUP);
}
void loop() {
int CLKState = digitalRead(pinCLK);
if (CLKState != lastCLKState) {
if (digitalRead(pinDT) != CLKState) {
currentMenu = (currentMenu + 1) % numMenus;
} else {
currentMenu = (currentMenu - 1 + numMenus) % numMenus;
}
updateMenuDisplay();
delay(50); // Pequeno atraso para evitar leituras falsas
}
lastCLKState = CLKState;
int buttonState = digitalRead(pinSW);
if (buttonState != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (buttonState == LOW) {
currentMessage = (currentMessage + 1) % 3;
displayMessage();
}
}
lastButtonState = buttonState;
}
void updateMenuDisplay() {
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa a linha do menu anterior
lcd.setCursor(0, 0);
lcd.print("Menu: ");
lcd.setCursor(6, 1);
lcd.print(menus[currentMenu]);
}
void displayMessage() {
lcd.setCursor(0, 1);
lcd.print(" "); // Limpa a linha da mensagem anterior
const char* currentMessagePtr = nullptr;
switch (currentMenu) {
case 0:
currentMessagePtr = saudeMessages[currentMessage];
break;
case 1:
currentMessagePtr = lojasMessages[currentMessage];
break;
case 2:
currentMessagePtr = escolaMessages[currentMessage];
break;
}
lcd.setCursor(0, 1);
lcd.print(currentMessagePtr);
delay(2000); // Mostrar mensagem por 2 segundos
lcd.clear();
updateMenuDisplay();
}