OLED + rotary encoder

This commit is contained in:
2025-06-14 01:59:49 +02:00
parent b406c574c2
commit f1163c3469
@@ -1,6 +1,6 @@
#define FW_VER 1.0
#define USE_OLED true // LEDC68 (Gotek alphanumeric displays)
#define USE_ENCODER false
#define USE_OLED true // OLED displays
#define USE_ENCODER true
// include libraries
#include <Adafruit_MCP23X17.h>
@@ -18,7 +18,9 @@
#endif
#if USE_ENCODER
#define ENCODER_CLK 2
#define ENCODER_DT 3
int lastClk = HIGH;
#endif
// Instantiate libraries
@@ -93,10 +95,9 @@ MCPOutput noteToMCP[32] = {
void updateOLED() {
#if USE_OLED
oled.clearDisplay();
oled.drawBitmap(0, 0, midich, MIDICH_WIDTH, MIDICH_HEIGHT, 1);
oled.setCursor(88, 18);
oled.drawBitmap(0, 13, midich, MIDICH_WIDTH, MIDICH_HEIGHT, 1);
oled.setCursor(86, 32);
oled.setTextColor(SSD1306_WHITE);
oled.setTextSize(1);
if (currentMidiChannel == MIDI_CHANNEL_OMNI) {
oled.print("ALL");
} else {
@@ -106,6 +107,26 @@ void updateOLED() {
#endif
}
void checkEncoder() {
#if USE_ENCODER
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk && newClk == LOW) {
if (digitalRead(ENCODER_DT) == LOW) {
currentMidiChannel++;
} else {
currentMidiChannel--;
}
// Wraparound: OMNI = 0, channels 116
if (currentMidiChannel > 16) currentMidiChannel = 0;
if (currentMidiChannel < 0) currentMidiChannel = 16;
updateOLED();
}
lastClk = newClk;
#endif
}
void setup() {
#if USE_OLED
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C addr 0x3C
@@ -122,6 +143,10 @@ void setup() {
}
#endif
#if USE_ENCODER
pinMode(ENCODER_CLK, INPUT_PULLUP);
pinMode(ENCODER_DT, INPUT_PULLUP);
#endif
// Midi Activity LED on Pin 13 (aka LED_BUILTIN)
pinMode(LED_BUILTIN, OUTPUT);
@@ -146,6 +171,10 @@ void setup() {
void loop() {
MIDI.read();
#if USE_ENCODER
checkEncoder();
#endif
// LED feedback
if (ledActive && millis() - ledOnTime >= ledDuration) {
digitalWrite(LED_BUILTIN, LOW);