
I2C (Inter-Integrated Circuit) — популярный последовательный протокол связи для подключения датчиков, дисплеев и других периферийных устройств к микроконтроллерам. Полное руководство с примерами кода.

I2C (Inter-Integrated Circuit) — это популярный последовательный протокол связи, широко используемый для подключения датчиков, дисплеев и других периферийных устройств к микроконтроллерам. В отличие от SPI, I2C требует всего два провода, что делает его идеальным для проектов с ограниченным количеством выводов.
В этой статье мы подробно разберём:
I2C — это синхронный последовательный интерфейс, разработанный Philips (ныне NXP) для связи между микросхемами. Он используется для подключения:
Основные ограничения:
Шина I2C состоит из:
Все устройства подключены параллельно к этим двум линиям. Каждое устройство имеет уникальный 7-битный адрес (реже 10-битный).

1. Стартовое условие (Start condition) — SDA переходит в LOW при HIGH на SCL
2. Адрес устройства (7 бит) + бит чтения/записи (0 — запись, 1 — чтение)
3. Подтверждение (ACK) — устройство отвечает LOW на 9-м такте
4. Данные (по 8 бит, каждый байт подтверждается ACK)
5. Стоповое условие (Stop condition) — SDA переходит в HIGH при HIGH на SCL
`
[Start] [Адрес 0x68 + W] [ACK] [Данные 0xAB] [ACK] [Stop]
`
В Arduino Uno и Nano (ATmega328P) I2C выведен на:
Также на плате Arduino Uno есть отдельные пины SCL и SDA для подключения устройств по I2C.
Для работы используется библиотека Wire:
```cpp
#include <Wire.h>
void setup() {
Wire.begin(); // Инициализация I2C (мастер)
Serial.begin(9600);
}
void loop() {
// Запись в устройство с адресом 0x68
Wire.beginTransmission(0x68);
Wire.write(0x00); // Регистр
Wire.write(0xAB); // Данные
Wire.endTransmission();
// Чтение из устройства
Wire.beginTransmission(0x68);
Wire.write(0x00); // Указываем регистр для чтения
Wire.endTransmission(false); // Не завершаем передачу
Wire.requestFrom(0x68, 1); // Запрашиваем 1 байт
if (Wire.available()) {
byte data = Wire.read();
Serial.println(data, HEX);
}
delay(1000);
}
`
Каждое устройство должно иметь уникальный адрес. Например:
| Параметр | I2C | SPI | UART |
|---|---|---|---|
| Скорость | До 400 кГц (стандарт), до 3.4 МГц (быстрый режим) | До 50 МГц | До 1 МГц |
| Линии | 2 (SDA, SCL) | 4 (SCK, MOSI, MISO, SS) | 2 (TX, RX) |
| Адресация | Встроенная (7/10 бит) | Нет (используется SS) | Нет |
| Тип передачи | Полудуплекс | Полный дуплекс | Полудуплекс |
| Подключение устройств | До 128 (7-бит) | Ограничено количеством SS | 1:1 |
Когда выбирать I2C?
---
Проверьте:
Сканер I2C-адресов:
```cpp
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C Scanner");
}
void loop() {
byte error, address;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("Found device at 0x");
Serial.println(address, HEX);
}
}
delay(1000);
}
`
Решения:
Если два устройства имеют одинаковый адрес:
---
I2C — это простой и эффективный интерфейс для подключения множества устройств с минимальным количеством проводов. Он идеально подходит для проектов с Arduino, где важна компактность и простота разводки.
Ключевые моменты:
Теперь вы готовы использовать I2C в своих проектах! Попробуйте подключить датчик температуры или OLED-дисплей — это отличный способ закрепить знания.
P.S. Для более сложных проектов изучите:
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.