Skip to main content

I2C-Bus scannen

Dieses Beispiel zeigt, wie der I2C-Bus des Lernboards gescannt wird, um alle angeschlossenen Geräte zu finden und anzuzeigen.

#Funktionsübersicht

  • I2C-Bus initialisieren
  • Alle Adressen von 0x00 bis 0x77 scannen
  • Gefundene Geräte mit Adresse anzeigen
  • Bekannte Sensoren des Lernboards identifizieren

#Voraussetzungen

  • Arduino IDE mit ESP32-Board-Unterstützung
  • Board: "ESP32C6 Dev Module"

#I2C-Adressen auf dem Lernboard

Das Lernboard hat folgende I2C-Geräte mit festen Adressen:

Gerät Adresse Funktion
TCA6408A 0x20 GPIO-Expander (Joystick, Taster)
BH1750 0x23 Lichtsensor
BMI270 0x68 Beschleunigung / Gyroskop
BME280 0x76 Temperatur / Luftfeuchtigkeit / Druck

#Code

/**
* Lernboard Beispiel: I2C-Bus scannen
* ===================================
* Dieses Beispiel zeigt:
* - Initialisierung des I2C-Bus
* - Scannen aller I2C-Adressen
* - Identifikation bekannter Geräte
*/
#include <Wire.h>
// I2C-Konfiguration für das Lernboard
const int I2C_SDA_PIN = 6;
const int I2C_SCL_PIN = 7;
const uint32_t I2C_FREQUENCY = 400000; // 400 kHz
// Struktur für bekannte Geräte
struct KnownDevice {
uint8_t address;
const char* name;
};
// Bekannte I2C-Adressen auf dem Lernboard
const KnownDevice KNOWN_DEVICES[] = {
{0x20, "TCA6408A (GPIO-Expander)"},
{0x23, "BH1750 (Lichtsensor)"},
{0x68, "BMI270 (Beschleunigung/Gyroskop)"},
{0x76, "BME280 (Temperatur/Feuchte/Druck)"}
};
const int NUM_KNOWN_DEVICES = sizeof(KNOWN_DEVICES) / sizeof(KNOWN_DEVICES[0]);
void setup setup() {
Serial.begin(115200);
delay(1000);
Serial.println("==================================================");
Serial.println("Lernboard - I2C Scanner");
Serial.println("==================================================");
Serial.println();
// I2C-Bus scannen
scanI2C();
Serial.println();
Serial.println("Scan abgeschlossen.");
}
void loop loop() {
// Einmaliger Scan - nichts zu tun in der Loop
delay(10000);
// Optional: Erneuter Scan alle 10 Sekunden
// scanI2C();
}
/**
* Sucht den Namen eines bekannten Geräts anhand der Adresse.
* @param address I2C-Adresse
* @return Gerätename oder "Unbekanntes Gerät"
*/
const char* getDeviceName* getDeviceNamechar* getDeviceName(uint8_t address) {
for (int i = 0; i < NUM_KNOWN_DEVICES; i++) {
if (KNOWN_DEVICES[i].address == address) {
return KNOWN_DEVICES[i].name;
}
}
return "Unbekanntes Gerät";
}
/**
* Prüft, ob eine Adresse zu den bekannten Geräten gehört.
* @param address I2C-Adresse
* @return true wenn bekannt, false sonst
*/
bool isKnownDevice isKnownDevice(uint8_t address) {
for (int i = 0; i < NUM_KNOWN_DEVICES; i++) {
if (KNOWN_DEVICES[i].address == address) {
return true;
}
}
return false;
}
/**
* Scannt den I2C-Bus und gibt alle gefundenen Geräte aus.
* @return Anzahl der gefundenen Geräte
*/
int scanI2C scanI2C() {
// I2C initialisieren
Serial.println("Initialisiere I2C-Bus...");
Serial.print(" SDA: GPIO");
Serial.println(I2C_SDA_PIN);
Serial.print(" SCL: GPIO");
Serial.println(I2C_SCL_PIN);
Serial.print(" Frequenz: ");
Serial.print(I2C_FREQUENCY / 1000);
Serial.println(" kHz");
Serial.println();
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN, I2C_FREQUENCY);
// Bus scannen
Serial.println("Scanne I2C-Bus...");
Serial.println("--------------------------------------------------");
int deviceCount = 0;
uint8_t foundDevices[128];
for (uint8_t address = 1; address < 127; address++) {
Wire.beginTransmission(address);
uint8_t error = Wire.endTransmission();
if (error == 0) {
foundDevices[deviceCount] = address;
deviceCount++;
}
}
if (deviceCount == 0) {
Serial.println("Keine I2C-Geräte gefunden!");
return 0;
}
Serial.print(deviceCount);
Serial.println(" Gerät(e) gefunden:");
Serial.println();
// Gefundene Geräte ausgeben
for (int i = 0; i < deviceCount; i++) {
uint8_t addr = foundDevices[i];
Serial.print(" Adresse: 0x");
if (addr < 16) Serial.print("0");
Serial.print(addr, HEX);
Serial.print(" (");
if (addr < 100) Serial.print(" ");
if (addr < 10) Serial.print(" ");
Serial.print(addr);
Serial.print(") - ");
Serial.println(getDeviceName(addr));
}
Serial.println("--------------------------------------------------");
// Status der Lernboard-Sensoren
Serial.println();
Serial.println("Status der Lernboard-Sensoren:");
for (int i = 0; i < NUM_KNOWN_DEVICES; i++) {
bool found = false;
for (int j = 0; j < deviceCount; j++) {
if (foundDevices[j] == KNOWN_DEVICES[i].address) {
found = true;
break;
}
}
Serial.print(" [");
Serial.print(found ? "+" : "!");
Serial.print("] ");
Serial.print(KNOWN_DEVICES[i].name);
Serial.print(": ");
Serial.println(found ? "OK" : "NICHT GEFUNDEN");
}
return deviceCount;
}

#Konsolenausgabe

Bei korrekter Funktion aller Sensoren erscheint folgende Ausgabe im Seriellen Monitor (115200 Baud):

==================================================
Lernboard - I2C Scanner
==================================================
Initialisiere I2C-Bus...
SDA: GPIO6
SCL: GPIO7
Frequenz: 400 kHz
Scanne I2C-Bus...
--------------------------------------------------
4 Gerät(e) gefunden:
Adresse: 0x20 ( 32) - TCA6408A (GPIO-Expander)
Adresse: 0x23 ( 35) - BH1750 (Lichtsensor)
Adresse: 0x68 (104) - BMI270 (Beschleunigung/Gyroskop)
Adresse: 0x76 (118) - BME280 (Temperatur/Feuchte/Druck)
--------------------------------------------------
Status der Lernboard-Sensoren:
[+] TCA6408A (GPIO-Expander): OK
[+] BH1750 (Lichtsensor): OK
[+] BMI270 (Beschleunigung/Gyroskop): OK
[+] BME280 (Temperatur/Feuchte/Druck): OK
Scan abgeschlossen.

#Arduino IDE Einstellungen

Einstellung Wert
Board ESP32C6 Dev Module
USB CDC On Boot Enabled
Upload Speed 921600
Flash Size 4MB

#Hinweise

  • I2C-Pins: Das Lernboard verwendet GPIO6 (SDA) und GPIO7 (SCL) für den I2C-Bus.
  • Frequenz: 400 kHz (Fast Mode) wird von allen Sensoren unterstützt.
  • Wire-Bibliothek: Die Standard-Wire-Bibliothek des ESP32 wird verwendet.
  • Einmaliger Scan: Der Scan wird nur einmal beim Start ausgeführt. Für zyklisches Scannen kann die auskommentierte Zeile in loop() aktiviert werden.

#Fehlerbehebung

Problem Mögliche Ursache
Keine Geräte gefunden Falsche Pin-Konfiguration oder I2C-Bus nicht richtig initialisiert
Gerät fehlt Kalte Lötstelle, defekter Sensor
Falsche Adresse Adresskonflikte mit externen I2C-Geräten
Keine Ausgabe USB CDC On Boot nicht aktiviert

#Erweiterungsmöglichkeiten

  • Zyklischer Scan zur Überwachung
  • Detaillierte Diagnose einzelner Sensoren
  • Integration in ein Selbsttest-Programm
  • Ausgabe auf Display statt Konsole