#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Rotary.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Menüelemente
const char* menuItems[] = { "Farbe 1" , "Farbe 2" , "Sättigung 1", "Sättigung 2", "Helligkeit 1", "Helligkeit 2", "MIDI Kanal", "LED ausschalten", "Display abschalten", "Displaykontrast", "Speichern", "Beenden" };
const char* menuHelp[] = { "Farbe für Note On", "Farbe für Note Off" };
const int menuSize = sizeof(menuItems) / sizeof(menuItems[0]);
int selectedItem = 0;
// Rotary Encoder Pins
const int encoderBtn = 2; // Pin für den Encoder Taster
const int encoderPinA = 3; // Pin für den A-Kanal
const int encoderPinB = 4; // Pin für den B-Kanal
volatile int encoderPos = 0; // Position des Encoders
Rotary Enc = Rotary(encoderPinA, encoderPinB);
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.display();
// Encoder Pins initialisieren
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
drawMenu();
}
void loop()
{
// Menü aktualisieren, wenn sich die Auswahl ändert
if (encoderPos != 0)
{
selectedItem += encoderPos;
if (selectedItem < 0)
selectedItem = 0;
if (selectedItem >= menuSize)
selectedItem = menuSize - 1;
encoderPos = 0; // Zurücksetzen der Encoder-Position
drawMenu();
}
}
void updateEncoder()
{
// Encoder-Logik
if (digitalRead(encoderPinA) == digitalRead(encoderPinB))
encoderPos--;
else
encoderPos++;
delay(5);
}
void drawMenu()
{
display.clearDisplay();
for (int i = 0; i < menuSize; i++)
{
if (i == selectedItem)
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Hervorhebung
else
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, i * 10);
display.setTextSize(2);
display.println(menuItems[i]);
display.setTextSize(1);
display.println(menuHelp[i]);
}
display.display();
}