I2C – это протокол обмена данными между устройствами по двум проводам, один из которых называют SDA, второй – SCL. Вообще-то, правильное его название IIC (Inter-Integrated Circuit – межинтегральная схема). Электронщики дают простое объяснение того, что такое I2C - это последовательная ассиметричная шина для связи между интегральными схемами внутри электронных приборов. Для людей далёких от электроники, проще объяснить, что по двум проводам передаются данные от одного электронного устройства (например, от микроконтроллера NodeMCU v3) к другому (например, к дисплею LCD1602). Один из них именуют последовательной линией тактирования SCL (Serial Clock), второй – последовательной линией данных SDA (Serial Data). Разработала эту технологию в конце 1980-х годов компания Philips Semiconductors.
Выпускается множество устройств и датчиков, которые могут обмениваться с микроконтроллером NodeMCU v3 данными по I2C протоколу. Это может быть OLED дисплей, датчик угла наклона и ускорения MPU6050 и множество других устройств.
Всего можно подключать до 127 устройств. Удобно то, что подсоединять их можно к одним и тем же выходам микроконтроллера. Чтобы обмениваться данными с нужным устройством, каждому из них присваивается свой уникальный номер, например, 0x3C. В некоторых устройствах этот номер поменять нельзя, встречаются устройства, в которых уникальный номер можно перепрошить. Скетч, который приведён ниже позволяет узнать уникальный номер устройства, подключённого к микроконтроллеру NodeMCU v3. Для этого нужно провод от контакта SCL подсоединить к пину D1, SDA – к D1.
Также, надо подсоединить питания I2C-устройства (как правило, контакт VCC) и землю (как правило, контакт GND).
Следующий скетч выведет в монитор порта сведения об уникальном адресе одного или нескольких подсоединённых I2C-устройств.
// I2C Сканер
#include <Wire.h>
void setup() {
Serial.begin (9600);
while (!Serial) // Ожидание соединения
{
}
delay(5000);
Serial.println ();
Serial.println ("I2C сканер. Сканируем ...");
byte count = 0;
Wire.begin();
for (byte i = 8; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Найден вдрес: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1);
}
}
Serial.println ("Выполнено.");
Serial.print ("Найдено ");
Serial.print (count, DEC);
Serial.println (" устройство(/а).");
}
void loop() {}
Результат работы скетча будет выведен в мониторе порта. Не забудьте установить скорость обмена данными 9600 бод.
Полученный адрес (в нашем случае 0x3C) нужно указывать в скетче, чтобы микроконтроллер обменивался данными именно с этим устройством.