// Versi yang diperbarui: memperbaiki arah rotasi dan scroll menu
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define CLK 26
#define DT 27
#define SW 14
#define LED1 17
#define LED2 5
#define LED3 18
#define LED4 19
int menuIndex = 0;
int menuOffset = 0;
int lastClkState;
bool ledStates[4] = {false, false, false, false};
bool inRotationMode = false;
int rotationCount = 0;
const int totalMenuItems = 6;
String menuItems[6] = {
"Rotasi: ",
"LED 17 OFF",
"LED 5 OFF",
"LED 18 OFF",
"LED 19 OFF",
"Semua LED OFF"
};
void updateMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
for (int i = 0; i < 3; i++) {
int itemIndex = menuOffset + i;
if (itemIndex >= totalMenuItems) break;
if (itemIndex == menuIndex) {
display.fillRect(0, i * 21, SCREEN_WIDTH, 21, SSD1306_WHITE);
display.setTextColor(SSD1306_BLACK);
} else {
display.setTextColor(SSD1306_WHITE);
}
display.setCursor(5, i * 21 + 6);
if (itemIndex == 0) {
display.print("Rotasi: ");
display.print(rotationCount);
} else {
display.print(menuItems[itemIndex]);
}
}
display.display();
}
void updateLEDMenuText() {
menuItems[1] = ledStates[0] ? "LED 17 ON" : "LED 17 OFF";
menuItems[2] = ledStates[1] ? "LED 5 ON" : "LED 5 OFF";
menuItems[3] = ledStates[2] ? "LED 18 ON" : "LED 18 OFF";
menuItems[4] = ledStates[3] ? "LED 19 ON" : "LED 19 OFF";
bool allOn = ledStates[0] && ledStates[1] && ledStates[2] && ledStates[3];
menuItems[5] = allOn ? "Semua LED ON" : "Semua LED OFF";
}
void toggleLED(int index, int pin) {
ledStates[index] = !ledStates[index];
digitalWrite(pin, ledStates[index]);
updateLEDMenuText();
updateMenu();
}
void toggleAllLEDs() {
bool allOn = ledStates[0] && ledStates[1] && ledStates[2] && ledStates[3];
for (int i = 0; i < 4; i++) {
ledStates[i] = !allOn;
}
digitalWrite(LED1, ledStates[0]);
digitalWrite(LED2, ledStates[1]);
digitalWrite(LED3, ledStates[2]);
digitalWrite(LED4, ledStates[3]);
updateLEDMenuText();
updateMenu();
}
void setup() {
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
delay(1000);
updateLEDMenuText();
updateMenu();
lastClkState = digitalRead(CLK);
}
void loop() {
int newClkState = digitalRead(CLK);
if (newClkState != lastClkState && newClkState == LOW) {
int dtState = digitalRead(DT);
if (inRotationMode) {
if (dtState == HIGH) rotationCount--;
else rotationCount++;
} else {
if (dtState == HIGH && menuIndex > 0) menuIndex--;
else if (dtState == LOW && menuIndex < totalMenuItems - 1) menuIndex++;
if (menuIndex < menuOffset) menuOffset = menuIndex;
else if (menuIndex > menuOffset + 2) menuOffset = menuIndex - 2;
}
updateMenu();
}
lastClkState = newClkState;
if (digitalRead(SW) == LOW) {
delay(200); // debounce
if (menuIndex == 0) {
inRotationMode = !inRotationMode;
} else if (!inRotationMode) {
switch (menuIndex) {
case 1: toggleLED(0, LED1); break;
case 2: toggleLED(1, LED2); break;
case 3: toggleLED(2, LED3); break;
case 4: toggleLED(3, LED4); break;
case 5: toggleAllLEDs(); break;
}
}
while (digitalRead(SW) == LOW); // tunggu tombol dilepas
}
}