Метеостанцию на Nano я собирал на пределе пинов: под фоторезистор и датчик климата ушли почти все свободные линии, а дисплею по классической схеме нужны ещё шесть сигнальных — RS, E и четыре линии данных. Я уже примерялся перекинуть всё на Mega, пока не присмотрелся к синей платке размером с ноготь, напаянной сзади дисплея: переходник на чипе PCF8574, четыре провода вместо восьми. Экран завёлся за десять минут, и вечер освободился под настоящую работу.
Этот урок — про тот самый чип. Разберём, что делает PCF8574 внутри переходника, где на плате живёт подсветка, почему выходы чипа не конфликтуют с линиями данных дисплея и откуда берётся знаменитая развилка 0x27 против 0x3F. Схема подключения проста до скучности — четыре провода, как в первом уроке про текст по I2C; интереснее другое: что происходит на дорожках между Arduino и стеклом.
Понимание начинки экономит время дважды. Первый раз — когда экран молчит и надо быстро понять, виноват ли чип, адрес или подсветка. Второй — когда на шине появляется второй I2C-потребитель, и адреса приходится разводить. Обе истории у меня были, обе разберу по пути. И третья — вечный спор «I2C или параллельная»: к концу урока у вас будет критерий выбора, а не вера в статью.
Что внутри переходника
PCF8574 — восьмибитный расширитель портов с интерфейсом I2C. Внутри — регистр выходов на восемь ножек P0–P7: чип слушает шину, получает байт и выставляет его на ножки. Дисплею в четырёхбитном режиме нужно ровно шесть сигнальных линий — их и раздают выходы расширителя, а седьмой обслуживает подсветку. Никакого «драйвера дисплея» внутри нет: PCF8574 — просто удалённые пины, до которых можно дотянуться двумя проводами SDA и SCL. Подтяжки шины уже стоят на модуле, отдельные резисторы не нужны — втыкайте четыре провода, подавайте питание и пишите код.
Скорость обмена честная, но не бездонная. Шина I2C на Uno работает на 100 кГц, каждый символ дисплея в четырёхбитном режиме — это несколько байтов по шине, и полная перерисовка экрана 16x2 занимает порядка 10–15 мс. Для показаний, меню и бара из предыдущего урока запас огромный: обновление раз в 100–200 мс выглядит мгновенно. Бегущие строки и анимации уже упираются в шину — если экран должен перерисовываться по двадцать раз в секунду, честнее вернуть параллельную схему из урока про шесть проводов. Моё правило: статичные показания — I2C, кино — провода. И следствие из физики: чем короче четыре провода, тем стабильнее шина — раскинутые по макетке полметра дают редкие сбои, держите их короткими.
| Ножка PCF8574 | Линия дисплея | Зачем она HD44780 |
|---|---|---|
| P0 | RS | 0 — команда, 1 — данные |
| P1 | RW | 0 — запись в дисплей; чтение почти не нужно |
| P2 | E | Строб: дисплей защёлкивает байт по фронту |
| P3 | Ключ подсветки | Через транзистор на плате переходника |
| P4 | D4 | Старший полубайт данных |
| P5 | D5 | Старший полубайт данных |
| P6 | D6 | Старший полубайт данных |
| P7 | D7 | Старший полубайт данных |
Бит P3 — самый интересный. Подсветка дисплея тянет 20–30 мА, а выход PCF8574 устроен хитро — квазидвунаправленный: в состоянии нуля он уверенно принимает ток, а в состоянии единицы отдаёт лишь сотни микроампер. Поэтому светодиод подсветки вешают не на ножку чипа, а на транзисторный ключ на плате, и бит P3 лишь переключает этот ключ. Отсюда и практическое правило: к выходам PCF8574 не подключают нагрузку вроде реле или зуммера — для этого собирают транзисторный каскад, чип создан для сигналов, а не для тока.
Второе следствие слабого источника — линии данных дисплея для чипа безопасны: входы HD44780 высокоомные и тока практически не потребляют. А вся печать через библиотеку — это серия байтов в регистр PCF8574 с переключением RS и стробированием E, и все они уходят по двум линиям шины, устройство которой мы разбирали в уроке про I2C. Библиотека LiquidCrystal_I2C — тонкая обёртка над этими байтами, никакой магии.
Почему хватает четырёх линий данных? HD44780 умеет и восьмибитный обмен, но переходники используют четырёхбитный режим: байт уходит в два приёма, сначала старший полубайт, затем младший, а между ними библиотека дёргает строб E. Расширитель как раз восьмибитный, и его байт раскладывается без остатка: P4–P7 под данные, P0–P2 под управление, P3 под подсветку. Для вас это остаётся невидимым — но именно отсюда берётся упомянутое замедление: каждый символ дисплея это два полубайта и несколько байтов шины. Скорость при этом падает не в разы, а на проценты: выигрыш в экономии пинов обычно стоит дороже лишнего полубайта.
Адрес: 0x27, 0x3F и три перемычки
У чипа три адресных входа A0–A2: их уровень добавляет единицы к базовому адресу. На переходниках эти входы подтянуты к единице, поэтому готовые модули отвечают по крайнему адресу своего семейства: базовый PCF8574 занимает диапазон 0x20–0x27 и с подтяжками отвечает по 0x27, родственный PCF8574A — 0x38–0x3F, то есть 0x3F. Внешне чипы не отличить, разница прячется в суффиксе T или AT маркировки — и половина «мёртвых» дисплеев с форумов это скетч с 0x27 на модуле с 0x3F.
Единственный честный способ узнать адрес — спросить шину. Сканер из урока про адреса I2C перебирает адреса от 8 до 119 и печатает, кто ответил; этот же приём потом пригодится и для OLED-экранов. Найденный адрес подставляется первым аргументом в конструктор библиотеки — о самой библиотеке поговорим в соседнем уроке. Если на вашей плате есть незапаянные площадки A0–A2, замыкание их на землю меняет соответствующие биты адреса — пригодится для второго дисплея на шине.
- 0x27 — самый частый ответ: переходник на чипе PCF8574T
- 0x3F — вторая по частоте партия: чип PCF8574AT
- 0x20–0x26 и 0x38–0x3E — если площадки A0–A2 на плате запаяны нестандартно
- Два устройства с одним адресом на шине конфликтуют — одному из них адрес надо менять
- Сканер шины перед первым запуском — пять секунд против вечера гаданий
#include <Wire.h> void setup() { Serial.begin(9600); Wire.begin(); Serial.println("Skan I2C 8..119:"); for (byte addr = 8; addr < 120; addr++) { Wire.beginTransmission(addr); if (Wire.endTransmission() == 0) { // кто-то ответил Serial.print("Najden: 0x"); Serial.println(addr, HEX); // 0x27 или 0x3F - адрес LCD } }} void loop() {}Проверка в симуляторе: сканер и тумблер партии
В тренажёре кнопка на D2 запускает «сканирование», а тумблер на D3 играет партию чипа: внизу — PCF8574T с адресом 0x27, вверху — PCF8574AT с 0x3F. Дисплей собирается сам из кода скетча — конструктор LiquidCrystal_I2C движок понимает напрямую, отдельный компонент для экрана не нужен. Перекиньте тумблер, нажмите кнопку — и увидите оба варианта ответа шины, ровно как при прогонах сканера на двух партиях модулей.
На реальной плате результат сканера — те же строки «Adres: 0x3F», только в Serial-мониторе. Дальше адрес переезжает в конструктор, и экран оживает; если хочется пространства побольше, тот же переходник работает и с панелями 20x4 — только не забудьте про раскладку строк из урока про адресацию 20x4. Питание переходника — 2,5–6 В, но сама панель обычно рассчитана на 5 В: на 3,3-вольтовых платах модули заводятся через раз и контраст плывёт, так что на Uno берите 5V без вариантов. И на всякий случай: ручка контраста никуда не делась, она и на I2C-модулях стоит синим кубиком — об этом помнит урок про V0. Кстати, ручка в этой симуляции не завелась намеренно: I2C-дисплей занимает A4 и A5, и аналоговые входы лучше держать свободными — потому макетка и собрана на цифровых пинах.
- PCF8574 — 8-битный расширитель портов: шесть выходов играют линии RS, E и D4–D7, седьмой ведёт подсветку
- Переходник экономит шесть сигнальных пинов: остаются SDA и SCL, на Uno это A4 и A5
- Выходы чипа — сигнальные: единицу они отдают микроамперами, поэтому подсветка сидит на транзисторном ключе
- PCF8574T отвечает по 0x27, PCF8574AT — по 0x3F; узнать адрес своей платы можно только сканером
- Перерисовка 16x2 по шине 100 кГц — порядка 10–15 мс: показаниям хватает, анимациям — нет
- Второй дисплей на шине требует своего адреса: площадки A0–A2 или переходник с другим чипом
- 1. Сколько сигнальных линий остаётся, если дисплей подключить через переходник PCF8574?
- 2. Какой адрес чаще всего отвечает переходник на чипе PCF8574AT?
- 3. За что отвечает бит P3 в байте, который библиотека шлёт на переходник?
- 4. Сканер нашёл дисплей по адресу 0x3F, а в скетче стоит 0x27. Что вы увидите?
- 5. Почему подсветку на переходнике включают через транзистор, а не напрямую с ножки чипа?
Частые вопросы по теме урока
- Сколько сигнальных линий остаётся, если дисплей подключить через переходник PCF8574?
- Вся параллельная шина переезжает в чип: наружу остаются только SDA и SCL плюс питание. На Uno это пины A4 и A5. Две: SDA и SCL
- Какой адрес чаще всего отвечает переходник на чипе PCF8574AT?
- Семейство A занимает диапазон 0x38–0x3F, а с подтянутыми входами A0–A2 модуль отвечает по крайнему 0x3F. Версия T отвечает по 0x27. 0x3F
- За что отвечает бит P3 в байте, который библиотека шлёт на переходник?
- P0–P2 — это RS, RW и E, P4–P7 — линии данных, а P3 переключает транзисторный ключ подсветки на плате переходника. Ключ подсветки через транзистор
- Сканер нашёл дисплей по адресу 0x3F, а в скетче стоит 0x27. Что вы увидите?
- Дисплей ждёт команд по своему адресу, скетч шлёт на чужой — никто не отвечает. Картина типовая: подсветка жива, текста нет, лечится заменой адреса в конструкторе. Подсветка горит, текста нет
- Почему подсветку на переходнике включают через транзистор, а не напрямую с ножки чипа?
- Выход PCF8574 квазидвунаправленный: ноль он держит уверенно, а единицу — лишь сотнями микроампер. Подсветке нужны десятки миллиампер, поэтому ставят транзисторный ключ. Выход PCF8574 в единице отдаёт микроамперы, а LED тянет десятки миллиампер