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.
/**
**************************************************
*
* @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:
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 InputronicGridErstellt 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
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | address | I2C-Adresse des Boards. Optional, standardmäßig 0x30 (INPUTRONIC_GRID_DEFAULT_ADDR). |
grid.begin(TwoWire &wire = Wire)returns boolStartet 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
| Typ | Name | Beschreibung |
|---|---|---|
TwoWire & | wire | Der zu verwendende I2C-Bus. Optional, standardmäßig Wire. |
grid.setAddress(uint8_t newAddr)returns voidSendet 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
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | newAddr | Die neue 7-Bit-I2C-Adresse, 0x08 bis 0x77. |
grid.clearLEDs()returns voidSchaltet 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 voidStartet 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
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | address | Die zu prüfende 7-Bit-Adresse, hier NEW_ADDRESS. |
Wire.endTransmission()returns uint8_tBeendet 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.