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