Zum Hauptinhalt springen

I2C-Adresse ändern

Was dieses Beispiel zeigt​

Das GRID antwortet werkseitig auf 0x30. Dieses Beispiel ändert die Adresse auf 0x31. Das Board speichert die neue Adresse im EEPROM des ATtiny404 und antwortet sofort darauf, ohne Reset, und behält die Adresse auch nach dem Ausschalten. Geben Sie jedem GRID auf diese Weise eine eigene Adresse, dann können sich mehrere Boards einen I2C-Bus teilen.

Ändern Sie NEW_ADDRESS auf die gewünschte Adresse (0x08 bis 0x77). Wenn das Board bereits eine andere Adresse verwendet, setzen Sie CURRENT_ADDRESS auf diese. Um zur Standardadresse zurückzukehren, führen Sie das Beispiel mit NEW_ADDRESS gleich 0x30 aus.

Dieses Beispiel erstellt immer selbst I2C(0, scl=Pin(22), sda=Pin(21)). Ändern Sie diese Pin-Nummern, falls die I2C-Pins Ihres Boards andere sind.

Der Beispielcode​

Dies ist Examples/ChangeAddress.py aus dem festgelegten Modul, unverändert. Speichern Sie es auf Ihrem Board und führen Sie es einmal aus.

# FILE: ChangeAddress.py
# AUTHOR: Josip Šimun Kuči @ Soldered
# BRIEF: Example showing how to change the I2C address of the Inputronic GRID.
# Sends a new I2C address to the device. The firmware validates the address,
# stores it in EEPROM, and re-initializes on the new address — no reset required.
# The address is retained across power cycles.
# To restore the default address (0x30), call setAddress(0x30) while
# connected on whatever address the device currently uses.
# WORKS WITH: Inputronic GRID: www.soldered.com
# LAST UPDATED: 2026-05-12

from machine import I2C, Pin
from InputronicGrid import InputronicGrid
import time

# ── Configuration ─────────────────────────────────────────────────────────────
# Current address the device is on (change if you already moved it)
CURRENT_ADDRESS = 0x30

# New address to assign (must be a valid 7-bit I2C address: 0x08-0x77)
NEW_ADDRESS = 0x31
# ─────────────────────────────────────────────────────────────────────────────

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
grid = InputronicGrid(i2c=i2c, address=CURRENT_ADDRESS)

print("Device found at 0x{:02X}. Changing address to 0x{:02X} ...".format(
CURRENT_ADDRESS, NEW_ADDRESS))

grid.setAddress(NEW_ADDRESS)

# Give the firmware time to apply the change
time.sleep_ms(50)

# Probe device on new address
try:
i2c.writeto(NEW_ADDRESS, b"")
print("Success! Device now at 0x{:02X}".format(NEW_ADDRESS))
grid.clearLEDs()
except OSError:
print("Device not found on new address. Re-flash firmware and try again.")

🔗Vollständiges Beispiel öffnen

Examples/ChangeAddress.py im Commit 36d3def

→

Erwartetes Ergebnis:

ShellMicroPython
Device found at 0x30. Changing address to 0x31 ...
Success! Device now at 0x31

Wenn das Board auf CURRENT_ADDRESS nicht antwortet, löst InputronicGrid() eine Exception mit der Meldung Inputronic GRID not found. Check wiring. aus, bevor etwas ausgegeben wird. Wenn es auf der neuen Adresse nicht antwortet, gibt das Beispiel Device not found on new address. Re-flash firmware and try again. aus.

Übergeben Sie nach der Änderung die neue Adresse in jedem anderen Programm, zum Beispiel InputronicGrid(address=0x31).

Verwendete Funktionen​

InputronicGrid(i2c=None, address=INPUTRONIC_GRID_DEFAULT_ADDR)returns InputronicGrid

Erstellt das Driver-Objekt und prüft, ob das Board antwortet. Hier erhält es das I2C-Objekt des Beispiels und CURRENT_ADDRESS, die Adresse, auf der das Board jetzt antwortet.

ReturnsDas Driver-Objekt. Löst eine Exception mit 'Inputronic GRID not found. Check wiring.' aus, wenn das Board nicht antwortet.

Parameter

TypNameBeschreibung
I2Ci2cEin fertiges machine.I2C-Objekt. Optional.
intaddressI2C-Adresse des Boards. Optional, standardmäßig 0x30.
grid.setAddress(newAddr)returns None

Sendet die neue Adresse an das Board, das sie im EEPROM speichert und darauf zu antworten beginnt. Das Objekt verwendet die neue Adresse danach für jeden weiteren Aufruf. Eine Adresse außerhalb von 0x08 bis 0x77 wird ignoriert und es wird nichts gesendet; ein I2C-Fehler beim Senden wird ebenfalls ignoriert.

ReturnsNichts. Prüfen Sie das Ergebnis, indem Sie die neue Adresse abfragen, wie es das Beispiel tut.

Parameter

TypNameBeschreibung
intnewAddrDie neue 7-Bit-I2C-Adresse, 0x08 bis 0x77.
grid.clearLEDs()returns None

Schaltet alle 16 LEDs aus. Es entspricht setAllLEDs(0, 0, 0). Hier läuft es auf der neuen Adresse, nachdem die Änderung erfolgreich war.

ReturnsNichts.

i2c.writeto(addr, buf)returns not used

Methode machine.I2C von MicroPython: schreibt die Bytes in buf an das Gerät unter addr. Mit leerem buf prüft sie nur, ob dort ein Gerät antwortet; so prüft auch der Konstruktor des Moduls das Board.

ReturnsDas Beispiel ignoriert den Rückgabewert. Wenn unter addr kein Gerät antwortet, löst der Aufruf einen OSError aus, den das Beispiel abfängt.

Parameter

TypNameBeschreibung
intaddrDie zu prüfende 7-Bit-Adresse, hier NEW_ADDRESS.
bytesbufDie zu schreibenden Bytes; im Beispiel b"".

Dieses Beispiel verwendet außerdem machine.I2C, das nicht Teil der Soldered Inputronic-GRID-Bibliothek ist: Es gehört zum Lieferumfang von MicroPython.

Zusammenspiel​

Der Konstruktor beweist, dass das Board auf CURRENT_ADDRESS antwortet. setAddress() sendet die neue Adresse, das Beispiel wartet 50 ms, und ein leeres i2c.writeto() prüft, ob auf NEW_ADDRESS eine Antwort kommt. clearLEDs() läuft dann über dasselbe Objekt, das bereits die neue Adresse verwendet.