Promjena I2C adrese
Što prikazuje ovaj primjer
GRID se odmah po isporuci javlja na adresi 0x30. Ova skica premješta ga na 0x31. Pločica sprema novu adresu u EEPROM mikrokontrolera ATtiny404 i odmah se javlja na njoj, bez resetiranja, a adresu zadržava i nakon isključivanja napajanja. Tako možete svakom GRID-u dodijeliti vlastitu adresu i više pločica može dijeliti istu I2C sabirnicu.
Promijenite NEW_ADDRESS u adresu koju želite (0x08 do 0x77). Ako pločica već koristi drugu adresu, postavite CURRENT_ADDRESS na nju. Za povratak na zadanu adresu pokrenite skicu s vrijednošću NEW_ADDRESS postavljenom na 0x30.
Kod primjera
Ovo je examples/ChangeAddress/ChangeAddress.ino iz zadane (pinned) biblioteke, bez izmjena.
/**
**************************************************
*
* @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
}
Očekivani rezultat:
Device found at 0x30. Changing address to 0x31 ...
Success! Device now at 0x31
Ako se pločica ne javlja na CURRENT_ADDRESS, skica ispisuje Device not found at 0x30. Check wiring or CURRENT_ADDRESS. i zaustavlja se. Ako se ne javlja na novoj adresi, ispisuje Device not found on new address. Re-flash firmware and try again.
Nakon promjene u svakoj drugoj skici objekt stvorite s novom adresom, na primjer InputronicGrid grid(0x31);.
Korištene funkcije
InputronicGrid(uint8_t address = INPUTRONIC_GRID_DEFAULT_ADDR)returns InputronicGridStvara upravljački program za jedan GRID. Ovdje dobiva CURRENT_ADDRESS, adresu na kojoj se pločica trenutačno javlja.
ReturnsObjekt upravljačkog programa.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | address | I2C adresa pločice. Neobavezno, prema zadanim postavkama 0x30 (INPUTRONIC_GRID_DEFAULT_ADDR). |
grid.begin(TwoWire &wire = Wire)returns boolPokreće I2C sabirnicu pomoću wire.begin() i provjerava javlja li se pločica na svojoj adresi.
Returnstrue kada je pločica potvrdila prijem na sabirnici, false kada nije pronađena.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
TwoWire & | wire | I2C sabirnica koja se koristi. Neobavezno, prema zadanim postavkama Wire. |
grid.setAddress(uint8_t newAddr)returns voidŠalje novu adresu pločici, koja je sprema u EEPROM i počinje se javljati na njoj. Objekt zatim koristi novu adresu za sve kasnije pozive. Adresa izvan raspona od 0x08 do 0x77 ignorira se i ništa se ne šalje.
ReturnsNišta. Rezultat provjerite ispitivanjem nove adrese, kao što to radi primjer.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | newAddr | Nova 7-bitna I2C adresa, 0x08 do 0x77. |
grid.clearLEDs()returns voidIsključuje svih 16 LED dioda. Isto je kao setAllLEDs(0, 0, 0). Ovdje se izvršava na novoj adresi, nakon uspješne promjene.
ReturnsNišta.
Wire.beginTransmission(uint8_t address)returns voidPokreće I2C zapisivanje na zadanu adresu. Primjer ga uparuje s Wire.endTransmission() i ne šalje podatke, čime se samo provjerava javlja li se uređaj na toj adresi. grid.begin() provjerava pločicu na isti način.
ReturnsNišta.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | address | 7-bitna adresa koja se provjerava, ovdje NEW_ADDRESS. |
Wire.endTransmission()returns uint8_tZavršava zapisivanje započeto funkcijom Wire.beginTransmission() i šalje ga na sabirnicu.
Returns0 kada je uređaj na toj adresi potvrdio prijem. Primjer svaku drugu vrijednost tumači kao izostanak odgovora.
Ovaj primjer koristi i Wire, Arduino I2C biblioteku koja nije dio biblioteke Soldered Inputronic GRID: dolazi uz Arduino jezgru za vašu pločicu.
Sve zajedno
begin() provjerava javlja li se pločica na CURRENT_ADDRESS. setAddress() šalje novu adresu, skica čeka 50 ms, a goli par Wire.beginTransmission()/Wire.endTransmission() provjerava postoji li odgovor na NEW_ADDRESS. Zatim se clearLEDs() izvršava preko istog objekta, koji već koristi novu adresu. Promjena se izvodi samo jednom, pa je loop() prazan.