Шины I2C и SPI: OLED-дисплей и датчики
Подключаем умные устройства по двум-четырём проводам вместо десятка.
I2C и SPI — последовательные шины, позволяющие одному микроконтроллеру общаться со множеством устройств (дисплеями, датчиками) по нескольким общим проводам.
Зачем нужны шины
Подключать каждый датчик отдельными проводами накладно: выводов не хватит. Шина решает это: устройства висят на общих линиях, а адресуются по «имени» (адресу). Так на двух проводах I2C можно держать десяток датчиков и дисплей.
I2C: два провода на всех
I2C использует две линии: SDA (данные) и SCL (тактирование). У каждого устройства свой адрес. Схема:
ESP32 устройства
GPIO21 (SDA) ----+----+----+
GPIO22 (SCL) --+-|--+-|--+-|
| | | | | |
[OLED][датчик][часы]
(каждый со своим I2C-адресом)Сканируем шину
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
devices = i2c.scan()
print("Найдены адреса:", [hex(a) for a in devices])
# например: ['0x3c', '0x76'] — дисплей и датчикВывод текста на OLED
from machine import Pin, I2C
import ssd1306
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("Умный дом", 0, 0)
oled.text("t = 23.5 C", 0, 20)
oled.text("h = 45 %", 0, 35)
oled.show()I2C против SPI
| Критерий | I2C | SPI |
| Проводов | 2 (SDA, SCL) | 4 (MOSI, MISO, SCK, CS) |
| Скорость | До 400 кГц–1 МГц | Десятки МГц |
| Адресация | По адресу устройства | Отдельной линией CS |
| Когда удобно | Много медленных датчиков | Быстрые: дисплеи, SD-карты |
Как работает под капотом
В I2C мастер (ESP32) формирует тактовые импульсы на SCL и по SDA передаёт сначала адрес нужного устройства, потом данные. Устройство с этим адресом «откликается», остальные молчат. Линии подтянуты к питанию резисторами, а устройства лишь «притягивают» их к земле — отсюда ограничение по скорости. SPI быстрее: у него отдельные линии на отправку и приём и выделенный провод выбора устройства (CS), поэтому адресация не нужна и поток данных плотнее.
Частые ошибки
- Перепутать SDA и SCL. Шина не заработает,
scan()вернёт пусто. - Забыть подтяжку. Многие модули уже имеют резисторы; если нет — добавьте pull-up 4.7 кОм.
- Не сделать
oled.show(). Без него нарисованное не появится на экране — рисунок копится в буфере.
Итог
- I2C и SPI позволяют общаться со множеством устройств по общим линиям.
- I2C — 2 провода и адресация; SPI — 4 провода, выше скорость.
i2c.scan()показывает адреса подключённых устройств.- Для OLED после рисования обязателен
show().