Skip to content

Technik Blog

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

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung

Posted on 26. Februar 202415. Februar 2024 by Stefan Draeger

In diesem Beitrag möchte ich dir eine Schritt-für-Schritt-Anleitung geben, wie du den I2C Scanner von Arduino.cc für die ESP8266 & ESP32 Mikrocontroller anpassen kannst.

Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung
Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung

Die Idee zu diesem Beitrag kam von einem Leser meines Blogs, welcher Probleme mit dem ESP8266 speziell den von Ideaspark hatte und keine Geräte mit dem IC2 Scanner von Arduino.cc gefunden hat.

Inhaltsverzeichnis

  • Wie funktioniert die I2C Kommunikation?
  • I2C Adressen der verschiedenen Mikrocontroller
  • Suchen nach I2C Geräte
    • I2C Scanner für ESP8266 & ESP32 umschreiben
      • Wo kommt der Präfix „ARDUINO_“ her?
      • Prüfen des gewählten Boards
  • Download vom GitHub Repository

Wie funktioniert die I2C Kommunikation?

Um das Beispiel von Arduino.cc für den I2C-Scanner auf ESP8266 und ESP32 anzupassen, ist es zunächst wichtig zu verstehen, wie die I2C-Kommunikation funktioniert. Die I2C-Kommunikation ermöglicht es, verschiedene Geräte wie Sensoren und Aktoren mit einem Mikrocontroller zu verbinden. Hierbei erfolgt die Verbindung über zwei Drähte, die als Bus bezeichnet werden und an die Pins des Mikrocontrollers angeschlossen sind.

Die I2C-Geräte, die an den Bus angeschlossen sind, verfügen über eindeutige Adressen. Diese Adressen bestehen aus 7 Bits und ermöglichen die eindeutige Identifikation jedes angeschlossenen Geräts. Durch diese Adressierung ist es möglich, mehrere Geräte an einer I2C-Schnittstelle anzuschließen und gleichzeitig zu betreiben.

Die I2C-Schnittstelle nutzt zwei Signalleitungen: eine für die Datenübertragung (SDA) und eine für die Taktfrequenz (SCL). Die Kommunikation erfolgt über ein Master-Slave-Prinzip, wobei der Mikrocontroller als Master agiert und die angeschlossenen Geräte als Slaves. Der Master initiiert die Kommunikation, sendet Befehle und fordert Daten von den Slaves an.

Master  / Slave  auf dem I2C-Bus
Master / Slave auf dem I2C-Bus

Nachdem das Grundverständnis für die I2C-Kommunikation etabliert ist, können wir das Beispiel von Arduino.cc für den I2C-Scanner anpassen, um die Geräte auf ESP8266 und ESP32 Mikrocontrollern zu erkennen.

I2C Adressen der verschiedenen Mikrocontroller

Zunächst möchte ich dir eine Tabelle geben, mit den Pins SDA & SCL für die I2C Schnittstellen der verschiedenen Mikrocontroller.

MikrocontrollerSDASCL
Arduino UNO, Arduino NanoA5A4
Arduino MicroD2D3
Arduino Mega 2560 R3D20D21
Arduino DUED20D21
Wemos D1 Mini – ESP8266D2 (GPIO04)D1 (GPIO05)
ESP8266 – IdeasparkD6 (GPIO12)D5 (GPIO14)
ESP32GPIO21GPIO21
ESP32 S3GPIO08GPIO09

Den Mikrocontroller Raspberry Pi Pico / Pico W kannst du ebenso in der Arduino IDE programmieren, dieser hat zwei I2C Schnittstellen (I2C0 & I2C1) und diese sind an allen 26 GPIOs verfügbar.

Pinout des Raspberry PI Pico
Pinout des Raspberry PI Pico

Suchen nach I2C Geräte

Nachdem wir ermittelt haben an welche Pins die I2C Schnittstellen anliegen, möchten wir nun nach Geräten an diesen Pins suchen. Dazu nutze ich zunächst wie erwähnt den I2C Scanner von Arduino.cc.

#include <Wire.h>

byte error, address;
int nDevices = 0;

void setup() {
  Wire.begin();

  Serial.begin(9600);
  while (!Serial)
    ;
  Serial.println("\nI2C Scanner");
}

void loop() {
  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0 || error == 4) {
      if (error == 0) {
        Serial.print("I2C device found at address 0x");
        nDevices++;
      } else {
        Serial.print("Unknown error at address 0x");
      }
      Serial.print((address < 16 ? "0" : "") + String(address, HEX) + "!");
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found");
  } else {
    Serial.println("done");
  }

  delay(5000); 
}
Ausgabe der I2C Adresse eines Displays vom I2C Scanner
Ausgabe der I2C Adresse eines Displays vom I2C Scanner

I2C Scanner für ESP8266 & ESP32 umschreiben

Um die Suche nach Geräten auf anderen Pins des I2C-Busses zu ermöglichen, ist es erforderlich, der Funktion „begin“ des Wire-Objekts die entsprechenden SDA- und SCL-Pins zu übergeben. Das kann man aber nur, wenn die Implementierung es zulässt und das ist abhängig vom gewählten Mikrocontroller!

Daher muss geprüft werden, welcher Mikrocontroller / welches Board in der Arduino IDE ausgewählt wurde.

#if defined(ARDUINO_ESP8266_GENERIC)
  #define otherBoard
  //Boardconfiguration for Heltec HTIT-W8266 board with oboard OLED Display
  BoardConfiguration bc = { "Generic ESP8266 Module", 1, { { 16, 24 } } };
#endif

Eine Liste an den möglichen Werten findest du in der Datei boards.txt im Ordner zum Mikrocontroller bzw. zum Boardtreiber.

%user%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2

Aus dieser Datei können wir den Namen entnehmen und das Board welches dann später erkannt wird.

generic.name=Generic ESP8266 Module
generic.build.board=ESP8266_GENERIC

Wo kommt der Präfix „ARDUINO_“ her?

Wenn du den Code gelesen hast, dann siehst du, dass die Bezeichnung immer den Präfix „ARDUINO_“ trägt. Diese kommt daher, dass dieses als Parameter übergeben wird.

Datei "platform.txt"
-DARDUINO_{build.board}

Prüfen des gewählten Boards

In der Funktion loop wird nun geprüft, ob ein Feld „otherBoard“ oder „arduinoBoard“ existiert. Diese wurden zuvor abhängig vom Board erzeugt. Das funktioniert mit dem precompile Befehl #define.

Danach wird dann abhängig vom Board entweder eine For-Schleife oder der default gestartet.

void loop() {
  Serial.print("An ");
  Serial.print(bc.boardname);
  Serial.println(" was recognized!");
#if defined(otherBoard)
  uint8_t numI2CInterfaces = bc.numI2CInterfaces;
  Serial.println("The microcontroller has " + String(numI2CInterfaces, DEC) + " I2C Interfaces!");
  for (int pair = 0; pair < numI2CInterfaces; pair++) {
    uint8_t(*i2cPins)[2] = bc.i2cPins;

    uint8_t sda = i2cPins[pair][0];
    uint8_t scl = i2cPins[pair][1];

    Serial.println("\t[" + String(pair, DEC) + "] SDA: " + String(SDA, DEC) + ", SCL: " + String(SCL, DEC));
    Wire.begin(sda, scl);
    Serial.println("\tScanning...");
    findDevices();
  }
#else
  #ifdef defined(notDeclaredBoard)
    Serial.println("Boardtype not found, try default!");
  #endif
  Wire.begin();
  Serial.println("\tScanning...");
  findDevices();
#endif
  Serial.println("End.");
  delay(10000);
}

Wenn die Suche ausgeführt wird, dann erhalten wir wie beim Original im seriellen Monitor die Ausgabe der gefundenen I2C Adressen.

Ausgabe der gefundenen I2C Adressen im seriellen Monitor
Ausgabe der gefundenen I2C Adressen im seriellen Monitor

Download vom GitHub Repository

Das Programm findest du auf meinem GitHub Repository StefanDraeger/universal-I2C-Scanner. Dort kannst du dir dieses dann als ZIP-Datei herunterladen.

Es gibt derzeit sehr viele Mikrocontroller auf dem Markt, daher ist die Implementierung aller Konfigurationen sehr aufwändig. Jedoch habe ich begonnen, bereits einige einzutragen. Sollte dir ein Mikrocontroller fehlen, so schreibe mir eine Mail an info@draeger-it.blog.

1 thought on “Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung”

  1. Pingback: Temperaturabhängige Steuerung: Shelly 1PM Mini und Wemos D1 Mini kombinieren - Technik Blog

Schreibe einen Kommentar Antworten 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.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • 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}