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
- Lernboard mit MicroPython
#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
"""
from machine import Pin, I2C
import time
# I2C-Konfiguration für das Lernboard
I2C_SDA_PIN = 6
I2C_SCL_PIN = 7
I2C_FREQUENCY = 400000 # 400 kHz
# Bekannte I2C-Adressen auf dem Lernboard
KNOWN_DEVICES = {
0x20: "TCA6408A (GPIO-Expander)",
0x23: "BH1750 (Lichtsensor)",
0x68: "BMI270 (Beschleunigung/Gyroskop)",
0x76: "BME280 (Temperatur/Feuchte/Druck)",
}
def scan_i2c():
"""Scannt den I2C-Bus und gibt alle gefundenen Geräte aus."""
# I2C initialisieren
print("Initialisiere I2C-Bus...")
print(f" SDA: GPIO{I2C_SDA_PIN}")
print(f" SCL: GPIO{I2C_SCL_PIN}")
print(f" Frequenz: {I2C_FREQUENCY // 1000} kHz")
print()
i2c = I2C(0, sda=Pin(I2C_SDA_PIN), scl=Pin(I2C_SCL_PIN), freq=I2C_FREQUENCY)
# Bus scannen
print("Scanne I2C-Bus...")
devices = i2c.scan()
print("-" * 50)
if not devices:
print("Keine I2C-Geräte gefunden!")
return
print(f"{len(devices)} Gerät(e) gefunden:\n")
# Gefundene Geräte ausgeben
for addr in devices:
device_name = KNOWN_DEVICES.get(addr, "Unbekanntes Gerät")
print(f" Adresse: 0x{addr:02X} ({addr:3d}) - {device_name}")
print("-" * 50)
# Prüfen ob alle Lernboard-Sensoren gefunden wurden
print("\nStatus der Lernboard-Sensoren:")
for addr, name in KNOWN_DEVICES.items():
status = "OK" if addr in devices else "NICHT GEFUNDEN"
symbol = "+" if addr in devices else "!"
print(f" [{symbol}] {name}: {status}")
return devices
def main():
"""Hauptprogramm."""
print("=" * 50)
print("Lernboard - I2C Scanner")
print("=" * 50)
print()
scan_i2c()
print()
print("Scan abgeschlossen.")
# Programm starten
if __name__ == "__main__":
main()
#Konsolenausgabe
Bei korrekter Funktion aller Sensoren erscheint folgende Ausgabe:
==================================================
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.
#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.
- Fehlende Geräte: Falls ein Sensor nicht gefunden wird, könnte ein Hardwaredefekt oder eine kalte Lötstelle vorliegen.
#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 |
#Erweiterungsmöglichkeiten
- Zyklischer Scan zur Überwachung
- Detaillierte Diagnose einzelner Sensoren
- Integration in ein Selbsttest-Programm