В этой статье я расскажу, как с помощью Arduino сделать I2C-сканер, используя LCD1602 дисплей с интерфейсом I2C.
Немного теории
I2C — это протокол, позволяющий различным устройствам взаимодействовать по одной шине данных (SDA и SCL). Каждому устройству присваивается уникальный адрес (максимум 127 устройств). Изменить адрес устройства нельзя, но некоторые производители позволяют менять адрес в небольшом диапазоне, что позволяет подключать несколько одинаковых устройств к одной шине.
Зачем нужен I2C-сканер?
Иногда документация на устройство недоступна или адрес микросхемы отличается от указанного в документации. В таких случаях I2C-сканер помогает определить адрес устройства.
Оборудование
Для примера используем Arduino UNO и LCD модуль I2C. Интерфейс I2C на Arduino UNO работает на выводах A4 и A5.
Схема подключения
Для подключения LCD1602 дисплея к Arduino используйте следующую схему:
- VCC подключите к 5V на Arduino.
- GND подключите к GND на Arduino.
- SDA подключите к A4 на Arduino.
- SCL подключите к A5 на Arduino.

Пример кода
Откройте Arduino IDE, скопируйте и загрузите следующий скетч:
/*
I2C_scanner
Этот скетч тестирует стандартные 7-битные адреса.
Устройства с более высоким адресом бита могут быть неправильно обнаружены.
*/
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner"); // Выводит сообщение о начале сканирования по шине I2C
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning..."); // Выводит сообщение о начале сканирования
nDevices = 0;
for (address = 1; address < 127; address++ ) { // Перебирает адреса от 1 до 127
Wire.beginTransmission(address); // Начинает передачу данных по шине I2C на определенный адрес
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("Unknown 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); // Ожидание перед следующим сканированием
}
|
Проверка
Откройте «Монитор порта», установите скорость 9600. Если все подключено правильно, программа покажет адрес устройства. В моем случае, это LCD с адресом 0x27.

Заключение
Этот скетч позволяет быстро и легко определить адрес I2C-устройств, что особенно полезно при отсутствии документации.