I2C

I2C удобен, когда к одному контроллеру нужно подключить несколько небольших устройств: датчик давления BME280, дисплей OLED, часы реального времени DS3231, расширитель портов. Все они делят две сигнальные линии, а контроллер выбирает нужный модуль по адресу.
I2C — синхронная адресная шина. SDA передаёт данные, SCL задаёт такт. Обе линии обычно требуют подтягивающих резисторов к логическому питанию шины. Устройства подключаются параллельно и отвечают только на свой адрес.

Зачем это нужно
В роботе часто много медленных датчиков. Если каждому выделять отдельные пины, выводы контроллера быстро закончатся. I2C позволяет подключить несколько устройств на одни и те же SDA и SCL.
Но простота имеет цену: нужно следить за адресами, подтяжками, уровнем питания и длиной проводов. Два устройства с одинаковым адресом на одной шине обычно будут конфликтовать.
Главная идея
Контроллер начинает обмен, формирует START, отправляет адрес устройства, передаёт или читает байты и завершает транзакцию STOP. Каждый принятый байт подтверждается сигналом ACK.

Линии SDA и SCL устроены не как обычные выходы, которые активно выдают 0 и 1. Участники шины тянут линию вниз для нуля и отпускают её для единицы. Высокий уровень создаёт подтягивающий резистор.
Провода и сигналы
| Линия | Назначение | Что важно |
|---|---|---|
SDA | данные и адреса | двунаправленная линия, нужна подтяжка |
SCL | тактовый сигнал | обычно задаётся контроллером, тоже нужна подтяжка |
GND | общий ноль | обязателен для всех участников |
VCC | питание модулей и логическая подтяжка | напряжение выбирают по самому чувствительному устройству |
Подтягивающие резисторы ставят на шину, а не «обязательно по паре на каждый датчик». На готовых модулях они часто уже есть. Если подключить несколько модулей с установленными подтяжками, итоговое сопротивление станет меньше.
Где находятся пины
| Плата | Пины I2C | Комментарий |
|---|---|---|
| Arduino Uno | A4/SDA, A5/SCL; на Uno R3 есть отдельные подписи SDA и SCL | это те же линии I2C |
| Arduino Nano | A4/SDA, A5/SCL | как у Uno, но физическое расположение другое |
| Arduino Mega | 20/SDA, 21/SCL | не совпадает с Uno |
| ESP32 DevKit | часто GPIO21/SDA, GPIO22/SCL | в Arduino core пины можно переназначить |
| ESP8266 | часто GPIO4/SDA, GPIO5/SCL в учебных примерах | зависит от платы и ядра |
Перед разводкой платы или пайкой шлейфа всегда открывают pinout конкретной платы. Название I2C не гарантирует одинаковые номера выводов.
Подключение устройства к Arduino Uno: BME280

BME280 измеряет температуру, давление и влажность. Многие готовые модули имеют выводы VCC, GND, SCL, SDA.
| Контакт BME280-модуля | Arduino Uno | Что проверить |
|---|---|---|
SDA | A4/SDA | не перепутать с SCL |
SCL | A5/SCL | линия такта |
GND | GND | общий ноль |
VCC | 3.3V или 5V по модулю | голый чип BME280 рассчитан на 3,3 В; готовый модуль может иметь стабилизатор |
После подключения удобно запустить I2C-сканер. Он покажет адрес, на котором модуль отвечает, например 0x76 или 0x77. Сканер подтверждает наличие ответа, но не доказывает, что датчик правильно измеряет.
Пример с несколькими Arduino

Одна Arduino может быть контроллером шины, а другие Arduino — адресуемыми устройствами. Это полезная лабораторная работа: становится видно, что адрес выбирает участника, а SDA и SCL остаются общими.
| Соединение | Arduino-контроллер | Адресуемая Arduino |
|---|---|---|
| данные | A4/SDA | A4/SDA |
| такт | A5/SCL | A5/SCL |
| земля | GND | GND |
Скетч адресуемой платы задаёт адрес:
#include <Wire.h>
void setup() {
Wire.begin(0x12);
Wire.onRequest(sendValue);
}
void loop() {
}
void sendValue() {
Wire.write(42);
}
Скетч контроллера запрашивает один байт:
#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
}
void loop() {
Wire.requestFrom(0x12, 1);
if (Wire.available()) {
Serial.println(Wire.read());
}
delay(1000);
}
В реальном проекте вместо числа 42 передают осмысленные данные: состояние датчика, заряд батареи или команду для адресуемого узла.
Частые ошибки
| Ошибка | Что произойдёт |
|---|---|
перепутали SDA и SCL | устройство не отвечает |
нет общего GND | уровни не имеют общего отсчёта |
| нет подтяжек | линии не возвращаются в высокий уровень |
подтяжки к 5 В при модуле 3,3 В | вход модуля можно повредить |
| два устройства с одним адресом | ответы конфликтуют |
| слишком длинные провода | фронты становятся медленными, появляются ошибки |
Что запомнить про I2C
- I2C использует две сигнальные линии:
SDAиSCL. - Устройства сидят на общей шине и различаются адресами.
- Для
SDAиSCLнужны корректные подтяжки. - На Arduino Uno I2C находится на
A4/A5. - На ESP32 пины часто можно переназначить, но типовой учебный вариант —
GPIO21/GPIO22.
Практика
- Нарисуйте Arduino Uno, BME280 и OLED на общей шине I2C.
- Подпишите
SDA,SCL,GND,VCCи две подтяжки. - Проверьте адрес BME280 сканером.
- Подключите вторую Arduino как устройство с адресом
0x12.
Проверьте себя
- Почему
SDAиSCLтребуют подтяжек? - Чем адрес I2C отличается от пина
CSв SPI? - Где находятся линии I2C на Arduino Uno?
- Почему два одинаковых датчика с одним адресом могут мешать друг другу?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- I2C — синхронная адресная шина с линиями данных
SDAи тактаSCL. - Контроллер шины — участник, который начинает транзакцию и формирует такт.
- Адресуемое устройство — участник, который отвечает на свой адрес.
- ACK — подтверждение приёма байта.
- Подтягивающий резистор — резистор, возвращающий открытую линию в высокий уровень.
Связанные темы
- UART — прямой поток байтов между двумя устройствами.
- 1-Wire — одна сигнальная линия и уникальные ROM-коды.
- SPI — быстрый синхронный обмен с отдельным выбором устройства.
- Сравнение протоколов — когда какой интерфейс удобнее.
- Отладка обмена — как искать ошибки питания, проводки и адресов.
Источники
- Arduino Docs. Arduino Uno Rev3.
- Arduino Docs. Wire library reference.
- Espressif. Arduino-ESP32 I2C API.
- Nexperia. UM10204 — I2C-bus specification and user manual.
- Texas Instruments. I2C Bus Pullup Resistor Calculation.