Метеопанель в оранжерее я собирал с лёгкой тревогой: на той же паре проводов A4-A5, что и экран 16x2, должен был жить датчик света BH1750. В голове сидела мысль из форумов: два устройства на шине — обязательно что-то сломается. Прошёл месяц, и сломалось ровно ничего: сканер при первом запуске показал два адреса, 0x27 и 0x23, экран рисовал температуру, датчик отдавал люксы, и они даже не мешали друг другу. Когда через полгода туда же въехали часы DS3231, шина приняла и третьего — снова без единой правки скетча связи.
Соседние сюжеты у меня уже разобраны, и повторять их здесь не буду. Два LCD рядом, когда оба экрана нужны на одной шине, — в уроке про два экрана; сам сканер как инструмент с расшифровкой кодов — в уроке про сканирование адресов; конфликт клонов в общем виде, на любых модулях, — в уроке про одинаковые адреса. Мой угол другой: как LCD уживается с датчиками на одной паре проводов и что происходит с физикой шины, когда соседей становится двое и больше — подтяжки, длина линии, диагностика по результатам скана.
План такой: сначала почему адреса в принципе не конфликтуют и кто кому что называет, потом перемычки на переходнике PCF8574 и таблица адресов типовых модулей, потом арифметика параллельных подтяжек и предел длины проводов. В конце — грабля, с которой я лично встречался дважды: два переходника, пришедшие с одной пачки, с одинаковым адресом 0x27. Скан в симуляторе — модель с таблицей: движок отвечает успехом на любую передачу, честный сканер для платы лежит в скетче ниже.
Почему адреса не конфликтуют
Шина I2C устроена как докладная с адресом на конверте: перед каждым пакетом мастер выкрикивает семь бит адреса, и слушают только те, чей адрес назван. LCD с переходником PCF8574 сидит на 0x27, датчик BH1750 — на 0x23, и когда плата шлёт байты экрану, датчик честно молчит: его адресом пакет не начался. Конфликт возможен ровно в одном случае — два устройства с одним адресом: тогда оба откликаются одновременно и дерутся за линию SDA. Отсюда весь дизайн адресов модулей: у каждого чипа есть базовый адрес и одна-две ножки, которые его сдвигают.
Переходник на PCF8574 базовый 0x20, а перемычки A0, A1, A2 добавляют к нему единицу, двойку и четвёрку: замкнули A0 — получили 0x21, A0 с A1 — 0x23, все три — 0x27. Отдельная версия чипа, PCF8574A, живёт в диапазоне 0x38-0x3F — оттого экраны в партиях бывают то 0x27, то 0x3F, вся сетка разобрана в уроке про выбор адреса. Важное следствие: если второй LCD на шине нужен, его переходник разводится перемычками на соседний адрес — механика этого переезда здесь не расскажу, она в уроке про два экрана.
Датчики устроены так же, только перемычек меньше. BH1750 слушает 0x23, пока его ножка ADDR прижата к земле, и 0x5C, если подать на неё питание. BMP280 — 0x76 или 0x77 по ножке SDO. А вот часы DS3231 сидят на 0x68 жёстко: никаких перемычек у чипа нет, и второй DS3231 на ту же шину не поставить — никуда не годится, но так устроен чип. То есть адрес у LCD 0x27 занят самим экраном, и соседи с 0x27 ему противопоказаны, а 0x23, 0x76, 0x68 рядом с ним чувствуют себя спокойно.
Конфликт — это не про трафик, а про совпадение ярлыков, и с потоком данных шина справляется легко. Кадр 16x2 по I2C стоит 10-15 миллисекунд, BH1750 просит пару байт раз в секунду, DS3231 — шесть байт раз в минуту: на шине 100 кГц это доли процента загрузки, и соседи не замечают друг друга даже на живом экране с бегущей строкой. Проблемы начинаются не от количества устройств, а от количества одинаковых адресов — и ровно поэтому сканер при сборке полезнее любого даташита: он показывает не то, что написано на коробке, а то, кто реально отвечает.
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { Wire.begin(); lcd.init(); lcd.backlight(); Serial.begin(9600); lcd.print("Skanner I2C");} void loop() { int naideno = 0; lcd.setCursor(0, 1); for (int adr = 8; adr < 120; adr++) { Wire.beginTransmission(adr); byte kod = Wire.endTransmission(); if (kod == 0) { // кто-то ответил ACK naideno++; Serial.print("Adres 0x"); if (adr < 16) Serial.print("0"); Serial.print(adr, HEX); Serial.println(); lcd.print(adr, HEX); // короткая находка на вторую строку lcd.print(" "); if (naideno == 5) { // строка кончилась - затираем и заново delay(1500); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); } } } if (naideno == 0) { lcd.setCursor(0, 1); lcd.print("Pusto! Provoda?"); } delay(3000);}| Модуль | Адрес по умолчанию | Как сдвигать |
|---|---|---|
| LCD на PCF8574 | 0x27 (версия A — 0x3F) | Перемычки A0-A2: плюс 1, 2, 4 к базе 0x20 |
| BH1750 (свет) | 0x23 | Ножка ADDR: на земле 0x23, на питании 0x5C |
| BMP280 (давление) | 0x76 | Ножка SDO: на земле 0x76, на питании 0x77 |
| DS3231 (часы) | 0x68 | Перемычек нет — второй DS3231 на шину не добавить |
Физика общей шины: подтяжки и длина
Линии SDA и SCL висят в воздухе — их подтягивает к питанию резисторами, и вот тут соседи по шине вступают в дело друг за друга. На каждом готовом модуле стоят свои подтяжки, чаще всего по 4,7 кОм на линию. Подключили второй модуль — его 4,7 кОм встали параллельно первым: 4,7 на 4,7 даёт 2,35 кОм, третий модуль прижмёт линию до 1,6 кОм. Для Uno это всё ещё норма: у шины 5 В нижняя граница здоровых подтяжек — около 1-1,5 кОм, глубже начинается лишний ток через открытый транзистор шины. У меня на столе живут три модуля с родными подтяжками без единого внешнего резистора, и вопрос закрыт.
Длина проводов — второй предел. Метр-полтора банальной dupont-лапши на штатных 100 кГц у меня работал без единого сбоя; два метра до BH1750 в теплице уже давали зависания раз в час — датчик переставал отвечать, помогала только перезагрузка. Чем длиннее линия, тем больше её ёмкость, и фронты сигнала расплываются; лечится тремя способами по нарастающей: укорачивать, снижать частоту шины, ставить подтяжки пожёстче — 2,2-3,3 кОм. Целую лестницу удлинителей и варианты с двумя парами проводов я разбирал в уроке про длину проводов, а снижение частоты с записью в регистр TWBR — отдельный приём, о котором скажу одной фразой: на Uno шина управляется одним байтом.
Если адресов всё-таки не хватает или соседей надо развести физически, есть мультиплексор TCA9548A: один вход, восемь выходов, и на каждом может сидеть свой 0x27. Для метеопанели с одним экраном и парой датчиков это стрельба из пушки, но знать про запасной выход стоит — урок про TCA9548A покажет его живьём. Главное правило перед покупкой соседа простое: адрес нового модуля не должен совпасть с уже занятым, а у LCD 0x27 занято место рядом с самим экраном.
Сканер — это и диагностика, если уметь читать его ответы. Найдены 0x00 и 0x7F — так шина отвечает на короткое замыкание SDA на SCL или на землю: проверяйте провода, это физика, а не скетч. Найден только 0x27, а датчик не показался — модуль мёртв, не запитан или его адрес другой, чем вы думали: перепаяйте ADDR и прогоните скан заново. Не найдено ничего, даже экрана, — обрыв, перепутанные SDA с SCL или отсутствие земли: экран при этом может гореть подсветкой и вводить в заблуждение. Систематическую расшифровку молчания экрана я собирал в уроке про диагностику молчащего LCD — там и про чёрную первую строку.
Мой рабочий порядок при добавлении любого соседа на шину теперь один и тот же. Скан до: записываю, кто уже живёт, скажем 0x27 и 0x68. Смотрю адрес нового модуля и его перемычки — пересечение адресов ловится на бумаге за минуту. Скан после: новый адрес появился, старые на месте, датчик отвечает на запросы. Одна минута дисциплины стоит часа ловли «датчик то отвечает, то нет» — потому что два ответчика на одном адресе и есть ровно такой плавающий сбой.
И про скорость на закуску, раз уж речь о совместном проживании. Штатные 100 кГц хватает всем: датчики с парой байт и экран с кадром раз в двести миллисекунд даже не складываются в очередь. Разгон до 400 кГц имеет смысл на OLED и больших объёмах, а для символьного LCD это чаще источник глюков, чем выигрыш: дешёвые переходники на PCF8574 не всегда держат быстрый фронт. Мой рецепт — не трогать скорость, пока сканер и глаз не показали проблему, которую надо чинить.
- 1. Какой адрес получит переходник на PCF8574, если замкнуть только перемычку A0?
- 2. Что покажет сканер, если на шине два LCD-модуля с адресом 0x27?
- 3. Какой суммарной подтяжкой станет линия, если два модуля принесли по 4,7 кОм на SDA?
- 4. Как развести два модуля DS3231 на одной шине?
- 5. Сканер нашёл адреса 0x00 и 0x7F. О чём это говорит?
- Мастер называет адрес в каждом пакете — соседи с разными адресами не мешают друг другу в принципе
- PCF8574: база 0x20 плюс перемычки A0-A2 (1, 2, 4); версия A живёт в 0x38-0x3F
- BH1750 0x23/0x5C и BMP280 0x76/0x77 переключаются ножкой, DS3231 — жёсткий 0x68
- Два модуля по 4,7 кОм дают 2,35 кОм подтяжки: до трёх-четырёх модулей Uno держит
- Сканер до и после подключения соседа — минута, которая экономит час отладки плавающих сбоев
Частые вопросы по теме урока
- Какой адрес получит переходник на PCF8574, если замкнуть только перемычку A0?
- База PCF8574 — 0x20, перемычки A0, A1, A2 добавляют 1, 2 и 4. Одна A0 — ровно 0x21. 0x21 — к базе 0x20 добавится единица
- Что покажет сканер, если на шине два LCD-модуля с адресом 0x27?
- Оба чипа откликаются на 0x27: сканер видит один адрес, а буквы рисуются на обоих экранах. Читающие датчики при этом ссорятся за линию. Один 0x27, и оба экрана будут рисовать одно и то же
- Какой суммарной подтяжкой станет линия, если два модуля принесли по 4,7 кОм на SDA?
- Параллельные резисторы уменьшают сопротивление: 4,7 на 4,7 — это 2,35 кОм. До трёх модулей по 4,7 кОм Uno это держит спокойно. 2,35 кОм — параллельное соединение
- Как развести два модуля DS3231 на одной шине?
- DS3231 не имеет перемычек адреса. Два таких на одной шине — тупик, нужен второй контроллер или мультиплексор TCA9548A. Никак: адрес 0x68 жёсткий, второй DS3231 на шину не поставить
- Сканер нашёл адреса 0x00 и 0x7F. О чём это говорит?
- Крайние адреса с ответом — классика КЗ SDA-SCL или на землю. Проверяйте провода и пайку, скетч тут ни при чём. Признак короткого замыкания на линиях