Skip to main content

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.

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
}

Očekivani rezultat:

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

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 InputronicGrid

Stvara upravljački program za jedan GRID. Ovdje dobiva CURRENT_ADDRESS, adresu na kojoj se pločica trenutačno javlja.

ReturnsObjekt upravljačkog programa.

Parametri

TipNazivOpis
uint8_taddressI2C adresa pločice. Neobavezno, prema zadanim postavkama 0x30 (INPUTRONIC_GRID_DEFAULT_ADDR).
grid.begin(TwoWire &wire = Wire)returns bool

Pokreć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

TipNazivOpis
TwoWire &wireI2C 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

TipNazivOpis
uint8_tnewAddrNova 7-bitna I2C adresa, 0x08 do 0x77.
grid.clearLEDs()returns void

Isključ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 void

Pokreć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

TipNazivOpis
uint8_taddress7-bitna adresa koja se provjerava, ovdje NEW_ADDRESS.
Wire.endTransmission()returns uint8_t

Završ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.