Wenn du meinen Beitrag „Arduino Nesso N1 Tutorial: Touch-Zahlenfeld & PIN-Abfrage“ gelesen hast, weißt du, dass sich mit dem Nesso N1 erstaunlich schnell ein modernes Touch-Interface umsetzen lässt. Für das Projekt wollte ich ein kleines, aber praktisches Feature ergänzen:
Über den kleinen Taster unterhalb des Displays sollte der eingegebene PIN-Code zurückgesetzt werden.
Klingt simpel – funktionierte aber überhaupt nicht.
Obwohl der Code korrekt war, wurde der Taster nicht erkannt. Also begann die Fehlersuche. Die offizielle Dokumentation half nur bedingt weiter: Das Beispiel zur Taster-Abfrage zeigt lediglich den klassischen Weg, wie man digitale Eingänge eines Mikrocontrollers ausliest – absoluter Standard, aber keine Lösung für das eigentliche Problem.
Und genau hier lag der Knackpunkt:
Die Taster des Arduino Nesso N1 hängen nicht direkt am Mikrocontroller, sondern an einem I/O-Expander, der über I2C angebunden ist. Gleichzeitig nutzt das Display ebenfalls die I2C-Schnittstelle.
➡️ Wenn Display und Taster parallel genutzt werden, stören sie sich gegenseitig – die Taster können nicht korrekt ausgewertet werden.
Damit du nicht die gleiche Fehlersuche durchlaufen musst, zeige ich dir in diesem Beitrag die einfache Lösung, mit der sowohl Display als auch Taster zuverlässig funktionieren.
Das Problem nachvollziehen: Display + Taster = I2C-Konflikt
Schauen wir uns zuerst den Sketch an, der nicht wie erwartet funktioniert:
#include <M5GFX.h>
M5GFX display;
void initDisplay() {
display.begin();
display.setRotation(1);
display.setTextDatum(middle_center);
display.setTextColor(TFT_WHITE, TFT_BLACK);
display.setTextSize(2);
display.clearDisplay(TFT_BLACK);
display.drawString("Hallo Welt!", display.width() / 2, display.height() / 2);
}
void initButtons() {
pinMode(KEY1, INPUT_PULLUP);
pinMode(KEY2, INPUT_PULLUP);
}
void setup() {
Serial.begin(115200);
initDisplay();
initButtons();
}
void loop() {
if (digitalRead(KEY1) == LOW) {
Serial.println("Taster 1 betätigt!");
delay(200);
}
if (digitalRead(KEY2) == LOW) {
Serial.println("Taster 2 betätigt!");
delay(200);
}
}
Der Code wirkt auf den ersten Blick absolut harmlos:
- Das Display wird über
M5GFXinitialisiert und zeigt „Hallo Welt!“ an. - Die beiden Taster
KEY1undKEY2werden ganz klassisch überpinMode()als Eingänge mit Pullup konfiguriert. - Im
loop()fragtdigitalRead()die Taster ab und schreibt bei Tastendruck eine Meldung in die serielle Konsole.
In der Praxis passiert aber etwas anderes:
In der Konsole der Arduino IDE taucht sehr schnell folgende Fehlermeldung auf:
E (304) i2c.common: I2C bus id(0) has already been acquired
Und genau ab diesem Punkt reagieren die Taster nicht mehr zuverlässig – oder gar nicht.
Was hier wirklich schiefläuft
Der Hintergrund:
- Das Display des Arduino Nesso N1 hängt am I2C-Bus.
- Die Taster
KEY1undKEY2hängen nicht direkt an normalen GPIO-Pins des Mikrocontrollers, sondern an einem I/O-Expander, der ebenfalls über I2C angebunden ist. - Wenn
M5GFXinitialisiert wird, konfiguriert die Library den I2C-Bus für das Display. - Wenn du anschließend
pinMode(KEY1, INPUT_PULLUP)unddigitalRead(KEYx)verwendest, behandelst du diese Taster so, als wären es „echte“ Mikrocontroller-Pins – was sie aber nicht sind.
Die Folge:
Der Board-Support bzw. die Low-Level-Library versucht, für diese „Pins“ im Hintergrund ebenfalls den I2C-Bus zu nutzen – dieser ist aber bereits vom Display belegt. Daher kommt die Fehlermeldung:
I2C bus id(0) has already been acquired
Kurz gesagt: Display und Taster konkurrieren auf demselben I2C-Bus – und der „normale“ Arduino-Weg mit pinMode + digitalRead funktioniert hier nicht.
Der Fix: Statt M5GFX muss M5Unified verwendet werden
Die gute Nachricht: Das Problem lässt sich sehr einfach lösen – allerdings nicht mit der Display-Library, die viele (inklusive mir) zuerst verwenden.
Installation von M5Unified
Du kannst die Library ganz einfach über den Bibliotheksverwalter installieren:
- Arduino IDE öffnen
- Werkzeuge → Bibliotheken verwalten
- Im Suchfeld eingeben: M5Unified
- Auf Installieren klicken
Ggf. wirst du aufgeforder noch abhängigkeiten zu installieren, diese musst du bestätigen!
Funktionierender Beispielcode mit M5Unified
Nachdem die Ursache geklärt ist, sehen wir uns nun die korrekte Lösung an.
Mit der Library M5Unified lassen sich Display und Taster des Arduino Nesso N1 problemlos gleichzeitig nutzen — ohne I2C-Konflikte oder Fehlermeldungen.
Der folgende Sketch zeigt ein minimales Beispiel:
Über Button A (KEY1) wird ein Counter hochgezählt, über Button B (KEY2) wird er heruntergezählt.
Jeder Tastendruck aktualisiert sofort den Bildschirm.
Lauffähiges Beispiel: Counter mit Taster A und B
/**
* ------------------------------------------------------------
* Arduino Nesso N1 – Beispielcode:
* Display & Taster gleichzeitig nutzen mit M5Unified
* ------------------------------------------------------------
*
* Einleitung:
* Der Arduino Nesso N1 nutzt für Display und Taster denselben I2C-Bus.
* Die Library M5GFX verursacht Konflikte, wodurch die Buttons nicht
* zuverlässig ausgelesen werden können ("I2C bus id(0) already acquired").
*
* Die Lösung:
* Statt M5GFX muss die Library M5Unified verwendet werden.
* Mit dieser Bibliothek lassen sich Display und Buttons stabil und
* ohne I2C-Probleme gleichzeitig betreiben.
*
* In diesem Beispiel wird ein einfacher Counter dargestellt:
* - Button A erhöht den Wert
* - Button B verringert den Wert
* Der aktuelle Wert wird sofort auf dem Display aktualisiert.
*
* Artikel & Erklärung:
* https://draeger-it.blog/arduino-nesso-n1-troubleshooting-display-blockiert-tasten-loesung/
*
* Hardware:
* - Arduino Nesso N1
* - Eingebaute Buttons A & B (I/O Expander)
* - Eingebautes IPS-Display
*
* ------------------------------------------------------------
*/
#include <M5Unified.h>
// Zählvariable für das Beispiel
int counter = 0;
// Displayauflösung des Nesso N1
const int SCREEN_HEIGHT = 135;
const int SCREEN_WIDTH = 240;
void setup() {
Serial.begin(9600); // Serielle Ausgaben für Debugging
// M5Unified-Konfiguration laden
auto cfg = M5.config();
cfg.clear_display = true; // Display beim Start löschen
// Initialisiert Display, Taster, Touch, I2C-Expander usw.
M5.begin(cfg);
}
void loop() {
// Aktualisiert alle Button-Zustände (A, B, C, Power usw.)
M5.update();
bool btnPress = false;
// Button A gedrückt → Counter++
if (M5.BtnA.wasPressed()) {
btnPress = true;
counter++;
}
// Button B gedrückt → Counter--
else if (M5.BtnB.wasPressed()) {
btnPress = true;
counter--;
}
// Wenn ein Button gedrückt wurde, Display neu zeichnen
if (btnPress) {
M5.Display.clearDisplay(TFT_BLACK); // Bildschirm leeren
M5.Display.setRotation(1); // Landscape-Ausrichtung
M5.Display.setTextDatum(middle_center); // Text zentrieren
M5.Display.setTextSize(2); // Textgröße setzen
// Counter-Wert zentriert anzeigen
M5.Display.drawString(
String(counter), // Zahl als String
SCREEN_WIDTH / 2, // X-Mitte
SCREEN_HEIGHT / 2 // Y-Mitte
);
}
}
Fazit
Der Fehler lag nicht am Code, sondern an der eingesetzten Display-Library.
Da Display und Taster beim Arduino Nesso N1 denselben I2C-Bus nutzen, führt M5GFX zu Konflikten und verhindert die Button-Abfrage.
Nach einem Blick in die M5Stack-Dokumentation wurde klar:
👉 Die Lösung ist der Wechsel zu M5Unified.
Mit M5Unified laufen Display und Taster ohne jede Fehlermeldung zuverlässig zusammen – und der Nesso N1 kann endlich wie vorgesehen genutzt werden.
Letzte Aktualisierung am: 01. Dezember 2025

