I2C — это такая шина данных, широко используемая в микроэлектронике. С помощью I2C можно подключить к Ардуино много разных полезных модулей, включая датчики, дисплеи, АЦП и даже другие платы Ардуино.
Шина является адресной, так что каждое подключаемое устройство имеет свой адрес в диапазоне от 8 до 127. На одной шине не может быть два устройства с одинаковыми адресами.
В этой короткой статье мы победим одну из частых проблем, которые испытывают самодельщики про покупке неведомого модуля с этим самым I2C интерфейсом. Проблема состоит в том, что производитель может изменить адрес устройства, и стандартные библиотеки перестают работать. Часто с подобной неприятностью можно столкнуться, например, при подключении ЖК дисплея с интерфейсом I2C.
Программа для сканирования I2C шины
Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из 119 возможных адресов. Если кто-то ответит, значит адрес рабочий!
#include <Wire.h>
void setup(){
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop(){
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 8; address < 127; address++ ){
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) {
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000);
}
Загружаем программу на Ардуино Уно, подключаем тестируемое устройство к I2C шине и открываем монитор последовательного порта. Если все подключено правильно, то появится примерно такой отчет:

Это значит, что мой дисплей имеет адрес 0x27 в шестнадцатеричной системе счисления. Теперь можно смело подключить библиотеку для работы с такими дисплеями и указать в ней данный адрес.
Очень интересно, но думаю не помешала бы принципиальная схемка подключения I2C устройства к Ардуино. Ну или ссылка на такую процедуру.
SDA к SDA, SCL к SCL, Питание и земля…
и резисторы 10кОм с «+» на SDA(А4) и SCL(А5),
резисторы нужны обязательно, если подключено более 2х устройств, если одно, то необязательно
А если не более двух и не одно?
работает
на китайце с али работает! адрес-0x3F
на двух lcd экранах 1602 — один адрес 0x27
на двух lcd экранах 2004 — один адрес 0x3F
Адрес определяется стоит ли микросхема PCF8574A или PCF8574 в драйвере i2c lcd. У первой адрес [1 1 1 A0 A1 A2] , у второй [1 0 0 A0 A1 A2], в бинарном виде. Для [A0 A1 A2] = [1 1 1] перемычки разомкнуты, адрес в HEX по умолчанию первого 0x3F, второго 0x27.
Кстати. Может быть кому-нибудь будет полезно — как изменить адрес.
http://soltau.ru/index.php/arduino/item/372-kak-podklyuchit-lcd-displej-s-i2c-modulem-k-arduin
Я проверил на на экране 1602. Адрес изменился на 0х26 после того, как запаял перемычку на А0.
Удобная версия I2C сканера, показывает типы устройств. Можно добавлять свои в файлы cfg:
https://sites.google.com/site/diyheadtracking/home/razor-ahrs-20180306/razor_i2c_scanner
спасибо огромное. А то голову сломал
Почему у меня пишет постоянно какую то ошибку при загрузке?
Какую именно ошибку? Скопируйте в коммент.
Здравствуйте! У меня выдает что COM3 недоступен( Помогите разобраться в чем может быть причина?
Scanning…
No I2C devices found
Подключил всё правильно. Контакты перепаял 2 раза.
Монитор порта пишет кракозябры.
Что делать?
у меня бесконечно бегут эти строки:
8⸮initialization done.
64 125 2.44 0.29
0 75 1.46 0.00
0 75 1.46 0.00
0 75 1.46 0.27
245 249 4.86 4.66
255 249 4.86 5.01
0 75 1.46 0.00
0 75 1.46 0.00
16 75 1.46 0.62
255 249 4.86 5.01
255 249 4.86 5.01
0 75 1.46 0.00
0 75 1.46 0.01
227 245 4.78 4.08
255 249 4.86 5.01
А куда подключать SDA и SCL? К каким пинам? Чтобы все сработало?
SDA-A4 SCL-A5 но может быть наоборот.
Ошибку исправьте, иначе адрес 127 не проверится.
for(address = 8; address <= 127; address++ ){