Zum Hauptinhalt springen

Die I2C-Adresse ändern

Was dieses Beispiel zeigt​

Der GRID antwortet ab Werk auf 0x30. Dieser Sketch setzt ihn auf 0x31. Das Board speichert die neue Adresse im EEPROM des ATtiny404 und antwortet sofort darauf, ohne Reset, und es behält die Adresse nach dem Ausschalten. Wenn Sie jedem GRID auf diese Weise eine eigene Adresse geben, 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 den Sketch mit NEW_ADDRESS gleich 0x30 aus.

Der Beispielcode​

Dies ist examples/ChangeAddress/ChangeAddress.ino aus der angepinnten Bibliothek, unverändert.

Select Board
ChangeAddress.ino
/**
**************************************************
*
* @file ChangeAddress.ino
* @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 the Wire
* peripheral 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.
*
* Hardware wiring:
* - Connect Inputronic Grid to host via Qwiic / I2C
* (SDA, SCL, 3V3, GND).
*
* @authors Josip Šimun Kuči @ soldered.com
***************************************************/

#include <InputronicGrid.h>

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

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

InputronicGrid grid(CURRENT_ADDRESS);

void setup()
{
Serial.begin(115200);
while (!Serial)
;

if (!grid.begin())
{
Serial.print("Device not found at 0x");
Serial.print(CURRENT_ADDRESS, HEX);
Serial.println(". Check wiring or CURRENT_ADDRESS.");
while (1)
;
}

Serial.print("Device found at 0x");
Serial.print(CURRENT_ADDRESS, HEX);
Serial.print(". Changing address to 0x");
Serial.print(NEW_ADDRESS, HEX);
Serial.println(" ...");

grid.setAddress(NEW_ADDRESS);

// Give the firmware one loop() iteration to apply the change (~5 ms is plenty)
delay(50);

// grid._addr is now NEW_ADDRESS — probe the device directly
Wire.beginTransmission(NEW_ADDRESS);
if (Wire.endTransmission() == 0)
{
Serial.print("Success! Device now at 0x");
Serial.println(NEW_ADDRESS, HEX);
grid.clearLEDs();
}
else
{
Serial.println("Device not found on new address. Re-flash firmware and try again.");
}
}

void loop()
{
// Nothing to do — address change is a one-time operation
}

Erwartetes Ergebnis:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
Device found at 0x30. Changing address to 0x31 ...
Success! Device now at 0x31

Wenn das Board nicht auf CURRENT_ADDRESS antwortet, gibt der Sketch Device not found at 0x30. Check wiring or CURRENT_ADDRESS. aus und hält an. Wenn es nicht auf der neuen Adresse antwortet, gibt er Device not found on new address. Re-flash firmware and try again. aus.

Nach der Änderung erstellen Sie in jedem anderen Sketch das Objekt mit der neuen Adresse, zum Beispiel InputronicGrid grid(0x31);.

Verwendete Funktionen​

InputronicGrid(uint8_t address = INPUTRONIC_GRID_DEFAULT_ADDR)returns InputronicGrid

Erstellt das Driver-Objekt für einen GRID. Hier erhält es CURRENT_ADDRESS, die Adresse, auf der das Board aktuell antwortet.

ReturnsDas Driver-Objekt.

Parameter

TypNameBeschreibung
uint8_taddressI2C-Adresse des Boards. Optional, standardmäßig 0x30 (INPUTRONIC_GRID_DEFAULT_ADDR).
grid.begin(TwoWire &wire = Wire)returns bool

Startet den I2C-Bus mit wire.begin() und prüft, ob das Board auf seiner Adresse antwortet.

Returnstrue, wenn das Board am Bus bestätigt hat, false, wenn es nicht gefunden wurde.

Parameter

TypNameBeschreibung
TwoWire &wireDer zu verwendende I2C-Bus. Optional, standardmäßig Wire.
grid.setAddress(uint8_t newAddr)returns void

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.

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

Parameter

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

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

ReturnsNichts.

Wire.beginTransmission(uint8_t address)returns void

Startet einen I2C-Schreibvorgang an die angegebene Adresse. Das Beispiel kombiniert ihn mit Wire.endTransmission() und sendet keine Daten, wodurch nur geprüft wird, ob dort ein Gerät antwortet. grid.begin() prüft das Board auf die gleiche Weise.

ReturnsNichts.

Parameter

TypNameBeschreibung
uint8_taddressDie zu prüfende 7-Bit-Adresse, hier NEW_ADDRESS.
Wire.endTransmission()returns uint8_t

Beendet den mit Wire.beginTransmission() begonnenen Schreibvorgang und sendet ihn auf den Bus.

Returns0, wenn das Gerät an dieser Adresse bestätigt hat. Das Beispiel behandelt jeden anderen Wert als keine Antwort.

Dieses Beispiel verwendet außerdem Wire, die Arduino-I2C-Bibliothek, die nicht zur Soldered-Inputronic-GRID-Bibliothek gehört: Sie wird mit dem Arduino-Core für Ihr Board geliefert.

Zusammengefasst​

begin() stellt sicher, dass das Board auf CURRENT_ADDRESS antwortet. setAddress() sendet die neue Adresse, der Sketch wartet 50 ms, und ein einfaches Paar aus Wire.beginTransmission()/Wire.endTransmission() prüft, ob auf NEW_ADDRESS eine Antwort kommt. Danach läuft clearLEDs() über dasselbe Objekt, das bereits die neue Adresse verwendet. Die Änderung wird nur einmal durchgeführt, daher ist loop() leer.