Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Mikrocontroller
    • Arduino
    • ESP32 & Co.
    • Calliope Mini
    • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

Arduino Nesso N1 Troubleshooting: Display blockiert Tasten – Lösung

Veröffentlicht am 3. Dezember 20251. Dezember 2025 von Stefan Draeger

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.

Arduino Nesso N1 Troubleshooting: Display blockiert Tasten – Lösung
Dieses Video auf YouTube ansehen.

Inhaltsverzeichnis

  • Das Problem nachvollziehen: Display + Taster = I2C-Konflikt
    • Was hier wirklich schiefläuft
  • Der Fix: Statt M5GFX muss M5Unified verwendet werden
    • Installation von M5Unified
    • Funktionierender Beispielcode mit M5Unified
  • Fazit

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 M5GFX initialisiert und zeigt „Hallo Welt!“ an.
  • Die beiden Taster KEY1 und KEY2 werden ganz klassisch über pinMode() als Eingänge mit Pullup konfiguriert.
  • Im loop() fragt digitalRead() 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 KEY1 und KEY2 hängen nicht direkt an normalen GPIO-Pins des Mikrocontrollers, sondern an einem I/O-Expander, der ebenfalls über I2C angebunden ist.
  • Wenn M5GFX initialisiert wird, konfiguriert die Library den I2C-Bus für das Display.
  • Wenn du anschließend pinMode(KEY1, INPUT_PULLUP) und digitalRead(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:

  1. Arduino IDE öffnen
  2. Werkzeuge → Bibliotheken verwalten
  3. Im Suchfeld eingeben: M5Unified
  4. Auf Installieren klicken
Arduino IDE - Bibliotheksverwalter - M5Unified

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.

Taster am Arduino Nesso N1 - M5Unified Konstanten
Taster am Arduino Nesso N1 – M5Unified Konstanten

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

Foto von Stefan Draeger
Über den Autor

Stefan Draeger — Entwickler & Tech-Blogger

Ich zeige praxisnah, wie du Projekte mit Arduino, ESP32 und Smarthome-Komponenten umsetzt – Schritt für Schritt, mit Code und Schaltplänen.

Mehr Artikel von Stefan →

Schreibe einen Kommentar Antwort abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 015565432686
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
  • Optionen verwalten
  • Dienste verwalten
  • Verwalten von {vendor_count}-Lieferanten
  • Lese mehr über diese Zwecke
Einstellungen anzeigen
  • {title}
  • {title}
  • {title}