Arduino NANO:    I2C -AdressScanner
 

 
Programm: I2C-Bus nach Adressen von Bausteinen durchsuchen
/*
I2C-AdressenScanner
===================
Das Programm durchsucht den I2C-Bus des Arduino NANO nach den 7Bit Adressen von angeschlossenen I2C-
Bausteinen. Da in Datenblättern der I2C-Bausteine manchmal Adressen mit 8 Bit angegeben werden, gibt das Programm auch diese in Klammern an.
Die gefundenen Adressen werden im seriellen Monitor der Entwicklungsumgebung angezeigt.

*/
 
long f100kHz = 100000L;                       // typische I2C-Frequenz beim Arduino NANO
long f400kHz = 400000L;
 
#include <Wire.h>
 
// einmalig, Startbedingungen des Programms einstellen
// ---------------------------------------------------
void setup() {
   Serial.begin (9600);
   Wire.begin();
   
   Serial.println ("Start: I2C-AdressScan\n");
   scan(f100kHz);                             // I2C-BUS mit f100kHz einmalig scannen
   Serial.println ("Ende:  I2C-AdressScan");
}
 
// wird die Funktion loop() entfernt, erscheint der Fehler:
// Fehler beim Kompilieren für das Board Arduino Nano
// --------------------------------------------------------
void loop() {
     // nix
}
 
 
// I2C-Adressen von 0-127 ausgeben und auf
// eine Antwort hoffen
// ---------------------------------------
void scan(long frequenz) {
   int count = 0;                            // Anzahl der gefundenen Bausteine
   Wire.setClock(frequenz);                  // Bus-Frequenz einstellen ..
   Serial.print ("Scan mit ");               // .. und anzeigen
   Serial.print (frequenz/1000);
   Serial.println ("kHz");
 
   for (int i = 0; i < 128; i++) {            // alle 7Bit I2C-Adressen von 0 bis 127 aufrufen
      Wire.beginTransmission(i);              // .. Adresse aufrufen
      byte msg = Wire.endTransmission();      // .. Aufruf beenden
 
      if (msg == 0) {                         // Rückgabe 0, ein Baustein hat ACK gesendet
         Serial.print ("ID = 7 Bit= ");       // 7 Bit Adresse des Bausteins ausgeben
         Serial.print (" 0x");
         Serial.print (i, HEX);
         Serial.print (" .. (8 Bit= 0x");     // ( 8 Bit Adresse) berechnen
         Serial.print (i<<1,HEX);
         Serial.println (")");
         count++;
      }
      delay (50);
   }
   Serial.print (count);                      // Anzahl der gefundenen Bausteine ausgeben
   Serial.println (" I2C-Bausteine gefunden\n");
}