Už jste se zajisté setkali s použitím sběrnice I2C v různých návodech a projektech. Často se ale stává, že připojený modul nereaguje či nevíme, na které adrese se nachází. Pro tyto účely jsem připravil z volně dostupných kódů jeden ucelený I2C skener, který nám umožní na různých Arduino deskách prohledat všechna připojená I2C zařízení, a to i s nastavením libovolných pinů.

I2C skener

Na začátku programu se nachází připojení potřebné knihovny Wire, která je součástí instalace Arduina. A poté můžeme zapsat čísla propojovacích I2C pinů, pokud je možné je u naší desky přenastavit jako například u desek s čipem ESP.
Ve funkci setup provedeme zahájení komunikace po sběrnici I2C, přičemž můžeme vybrat mezi zahájením bez definice pinů (například u Arduino UNO) či použít druhou variantu s nastavenými čísly pinů výše. Jako druhý bod pak zahájíme komunikaci po sériové lince, abychom si mohli vypsat výsledky hledání do počítače.
Nekonečná smyčka loop obsahuje na svém začátku vytvoření pomocných proměnných, do kterých si budeme ukládat výsledky hledání. V dalším kroku se totiž nachází for smyčka, která projde adresy v rozsahu 1 až 126, co odpovídá povolenému rozsahu adres pro I2C zařízení. V této smyčce vždy zahájíme komunikaci se zařízením na dané adrese, poté ji ukončíme a ověříme, jestli nám zařízení něco odpoví. Pokud nám odpoví hodnotou nula, tak víme, že existuje, a proto při splnění této if podmínky vypíšeme jeho adresu po sériové lince společně s inkrementací čítače nalezených zařízení. Další možnou odpovědí je hodnota 4, která odpovídá chybě v komunikaci. V tomto případě opět o této situaci vypíšeme hlášku na sériovou linku.
Po ukončení vyhledávací for smyčky zkontrolujeme počítadlo zařízení, přičemž jak v případě nula zařízení, tak alespoň jednoho vypíšeme o tomto stavu informaci na sériovou linku a vyčkáme nastavený čas před novým během smyčky loop.

// Arduino I2C skener
// navody.dratek.cz

// připojení potřebné knihovny
#include <Wire.h>
// nastavení čísel propojovacích pinů
#define I2C_SDA 21
#define I2C_SCL 22

void setup() {
  // zahájení komunikace po I2C sběrnici,
  // lze použít buď výchozí piny s variantou ()
  // nebo specifikovat piny např. u ESP desek (SDA, SCL)
  Wire.begin();
  //Wire.begin(I2C_SDA, I2C_SCL);

  // zahájení komunikace po sériové lince
  Serial.begin(9600);
  Serial.println("Start I2C skeneru...");
}

void loop() {
  // vytvoření pomocných proměnných
  byte chyba, adresa;
  int pocetZarizeni = 0;
  Serial.println("Zacatek hledani...");
  // smyčka pro hledání zařízení
  // I2C zařízení mohou mít adresu 1-126
  for (adresa = 1; adresa < 127; adresa++ ) {
    // zahájení komunikace a jeho následné ukončení,
    // při ukončení probíhá detekce zařízení pomocí
    // kontroly návratové hodnoty
    Wire.beginTransmission(adresa);
    chyba = Wire.endTransmission();
    // pokud nám zařízení odpoví '0',
    // tak funguje správně
    if (chyba == 0) {
      // vytištění informací o zařízení včetně
      // jeho adresy v hexa formátu
      Serial.print("I2C zarizeni nalezeno na adrese 0x");
      Serial.print(adresa, HEX);
      Serial.println("  !");
      // inkrementace počítadla zařízení
      pocetZarizeni++;
    }
    // při chybě v komunikaci je chybný výstup 4
    else if (chyba == 4) {
      // vytištění informací o zařízení včetně
      // jeho adresy v hexa formátu
      Serial.print("Neznama chyba na adrese 0x");
      Serial.println(adresa, HEX);
    }
  }
  // kontrola počítadla zařízení
  if (pocetZarizeni == 0) {
    // nebylo nalezeno žádné zařízení, protože neproběhla inkrementace
    Serial.println("Zadne I2C zarizeni nebylo nalezeno.");
  }
  else {
    // oznámení o konci hledání
    Serial.print("Konec hledani, nalezeno ");
    Serial.print(pocetZarizeni);
    Serial.println(" zarizeni.");
  }
  // pauza před novým během smyčky
  delay(5000);
}

Po nahrání uvedeného ukázkového kódu do Arduino UNO desky dostaneme například tento výsledek v Sériovém monitoru, přičemž při prvním hledání nebylo nic připojeno a pro druhé hledání jsem připojil modul se senzorem BMP085:

Zacatek hledani...
Zadne I2C zarizeni nebylo nalezeno.
Zacatek hledani...
I2C zarizeni nalezeno na adrese 0x77  !
Konec hledani, nalezeno 1 zarizeni.

I2C skener je vhodný program pro situace, kdy máte před sebou nový I2C senzor a chcete si ověřit, že je správně připojený či jednoduše zjistit jeho adresu. U některých modulů lze měnit pomocí jednoho či více pinů výslednou I2C adresu a někdy se může stát, že ji výrobce nastaví jinak, než bychom čekali. Díky tomuto programu pak můžeme prohledat všechny adresy a rychle vědět, na které je naše zařízení k dispozici. A pro desky jako je například ESP32, u kterých lze I2C sběrnici nastavit na různé piny, můžeme toto nastavení pohodlně provést na začátku programu.

Seznam použitých komponent:
https://dratek.cz/arduino/1258-klon-arduino-uno-r3-atmega328p-ch340g-usb-typ-b-kabel-1459967190.html
https://dratek.cz/arduino/1581-esp-32s-esp32-development-board-2-4ghz-dual-mode-wifi-bluetooth-antenna-module.html

FB tw

Další podobné články