#include <U8g2lib.h>
#include <RotaryEncoder.h>
#define OLED_RESET 4
#define encoderCLK A2
#define encoderDT A3
#define encoderSW 7
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA, U8X8_PIN_NONE);
RotaryEncoder encoder(encoderDT, encoderCLK);
int selectedOption = 0;
int prevSelectedOption = -1;
// MENU OPTION
const char *menuItems[] = {
"Option 1",
"Option 2",
"Option 3",
"Option 4",
"Option 5",
"Language/Idioma"
};
int menuSize = sizeof(menuItems) / sizeof(menuItems[0]);
void setup() {
Serial.begin(9600);
pinMode(encoderSW, INPUT_PULLUP);
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_courB12_tr);
u8g2.setFontMode(0);
}
void loop() {
encoder.tick();
int encoderPos = encoder.getPosition();
handleEncoder(encoderPos);
if (digitalRead(encoderSW) == LOW) {
handleSelection();
delay(300); // Debounce
}
if (selectedOption != prevSelectedOption) {
prevSelectedOption = selectedOption;
displayMenu();
}
}
void handleEncoder(int encoderPos) {
int newPosition = encoderPos;
if (newPosition != selectedOption) {
if (newPosition >= menuSize) {
selectedOption = 0;
newPosition = menuSize - 1;
} else if (newPosition < 0) {
selectedOption = menuSize - 1;
} else {
selectedOption = newPosition;
}
}
}
void handleSelection() {
Serial.print("Selected Option: ");
Serial.println(menuItems[selectedOption]);
Serial.println(selectedOption);
}
void displayMenu() {
//u8g2.clearDisplay();
u8g2.firstPage();
int y = 16; // Posición vertical inicial
int displayStart = selectedOption;
if (displayStart > 3) {
displayStart = 3;
}
for (int i = displayStart; i < displayStart + 4; i++) {
u8g2.setCursor(2, y);
if (i == selectedOption) {
u8g2.print(">");
} else {
u8g2.print(" ");
}
u8g2.print(menuItems[i]);
y += u8g2.getFontAscent() - u8g2.getFontDescent() + 2; // Calcula el desplazamiento vertical
}
do {
} while (u8g2.nextPage());
}