====== Определение адреса I2C устройства ======

===== Введение =====

Шина I2C очень популярна тем, что к ней можно подключить очень много устройств. Тем самым не требуется занимать много выводов контроллера и подключение намного понятнее и нагляднее. Чтобы обратиться к модулю на шине, нужно указать его адрес. Но покупая очередное устройство, не всегда понятно, как же определить, какой именно адрес на шине I2C принадлежит тому или иному устройству.

===== Простое определение адреса устройства =====

==== Шаг 1. Подключите устройство к контроллеру ====

Подключите Ваше устройство напрямую к контроллеру.

{{ :главная:инфо:i2c_connecting.png?nolink |}}

==== Шаг 2. Загрузите скетч, указанный ниже в контроллер ====

**Скетч для загрузки:**
<file Arduino>
#include <Wire.h> //подключение библиотеки


void setup()
{
  Wire.begin(); //инициализация шины
  Serial.begin(9600); //инициализация монитора Serial-порта
  while (!Serial); //ожидание доступности порта
  Serial.println("I2C Scanner");
}


void loop()
{
  //вспомогательные переменные
  byte error; //хранение кода ошибки
  byte address; //хранение адреса устройства
  int nDevices = 0; //счётчик устройств

  Serial.println("Scanning..."); //вывод надписи

  for (address = 1; address < 127; address++ )
  {
    /* Для поиска устройств воспользуемся функцией коммуникации и
     *  окончания коммуникации с устройством на адресе от 1 до 127. 
     *  При окончании коммуникации возвращается код ошибки.
     *  Если он не равен нулю, то коммуникация прошла успешно,
     *  и устройство на данном адресе найдено.
     *  В противном случае выводится информация об ошибке.
     */
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) { //ошибки не обнаружено

      //вывод адреса найденного устройства
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }  
      Serial.print(address, HEX);
      Serial.println("  !");

      nDevices++; //увеличение счётчика найденных устройств
      
    } else if (error == 4) { //если код ошибки равен 4 - устройство неопознано
      //вывод информации об ошибке
      Serial.print("Unknown error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }  
      Serial.println(address, HEX);
    }
  }
  
  //вывод результата по окончании сканирования
  if (nDevices == 0) {
    Serial.println("No I2C devices found");
  } else {
    Serial.print("Found ");
    Serial.print(nDevices);
    Serial.println(" devices");
  }

  delay(5000);  //пауза в 5 секунд между сканированием
}
</file>

=== Шаг 3. Откройте монитор порта ===

В мониторе Serial-порта будет выведен адрес Вашего устройства. В данном примере адресом устройства является "0x51".

<file>
Scanning...
I2C device found at address 0x51  !
Found 1 devices
</file>



**Примечание:** Для подключения нескольких устройств, посмотрите примеры из статьи [[main:modules:i2c|Расширитель I2C]].


