#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int pinA = 35;
const int pinB = 34;
const int pinButton = 32;
bool lastStateA;
bool lastButtonState = HIGH;
unsigned long time_now = 0;
int currentMenu = -1;
const int numMenus = 6;
const String menu[numMenus] = {"menu 1", "menu 2", "menu 3", "menu 4", "menu 5", "menu 6"};
void setup() {
Serial.begin(115200);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
pinMode(pinButton, INPUT_PULLUP);
lastStateA = digitalRead(pinA);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(500);
display.clearDisplay();
display.setTextColor(WHITE);
cover();
}
void loop() {
bool currentStateA = digitalRead(pinA);
bool currentStateB = digitalRead(pinB);
if (currentStateA > lastStateA) {
if (currentStateB != currentStateA) {
currentMenu = (currentMenu + 1) % numMenus; //ke menu berikutnya
} else {
currentMenu = (currentMenu - 1 + numMenus) % numMenus; //ke menu sebelumnya
}
scrollMenu(currentMenu);
Serial.println(currentMenu);
}
lastStateA = currentStateA;
bool buttonState = digitalRead(pinButton);
//Serial.println(buttonState);
if (buttonState < lastButtonState) {
select(currentMenu);
}
lastButtonState = buttonState;
}
void cover() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(12, 3);
display.println("MENU LIST");
display.setTextSize(1);
display.setCursor(59, 30);
display.println("by");
display.setCursor(15, 40);
display.println("Alditya - 492752");
display.display();
}
void scrollMenu(int num) {
time_now = millis();
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.println("Select:");
display.setTextSize(1);
display.println(menu[(num - 1 + numMenus) % numMenus]);
display.setTextSize(1);
display.println("> " + menu[num]);
display.setTextSize(1);
display.println(menu[(num + 1) % numMenus]);
display.display();
while (millis() < time_now + 200) { }
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.println("Select:");
display.setTextSize(1);
display.println(menu[(num - 1 + numMenus) % numMenus]);
display.setTextSize(2);
display.println("> " + menu[num]);
display.setTextSize(1);
display.println(menu[(num + 1) % numMenus]);
display.display();
}
void select(int numSelect) {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.println("Selected:");
display.println(menu[numSelect]);
// switch (numSelect) {
// case 0:
// display.println(menu1);
// break;
// case 1:
// display.println(menu2);
// break;
// case 2:
// display.println(menu3);
// break;
// case 3:
// display.println(menu4);
// break;
// case 4:
// display.println(menu5);
// break;
// case 5:
// display.println(menu6);
// break;
// default:
// display.clearDisplay();
// Serial.println("error: no menu selected");
// display.println("Please\nrotate\nthe knob!");
// break;
//}
display.display();
}