• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Универсальная библиотека LiquidCrystal_I2C на базе расширителя портов PCF8574

enjoynering

Well-known member
Без проблем работает с не стандартным модулями и экранами. Поддерживает Arduino AVR, Arduino ESP8266, Arduino SMT32. Получилась немного быстрее, чем у всей остальной копипасты из интернета. Все пины можно переназначать. Вот как это работает. Для этого поближе посмотрим на строку инициализации:

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE);
Эта запись означает, что: 4-й пин LCD подключен к поту P0 (4 ноге) PCF8574, 5-й пин LCD подключен к поту P1 (5 ноге) PCF8574, 6-й пин LCD подключен к поту P2 (6 ноге) PCF8574, 16-й пин LCD подключен к поту P3 (7 ноге) PCF8574 и тд.

Теперь представим, что в вашем модуле 14-й пин LCD подключен к поту P0 (4 ноге) PCF8574, а 4-й пин LCD подключен к поту P7 (12 ноге) PCF8574, тогда строка инициализации для вашего модуля будет выглядеть так:
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 14, 5, 6, 16, 11, 12, 13, 4, POSITIVE);

В библиотеке уже забиты все возможные адреса для чипов PCF8574 и PCF8574A. Вот их список:
PCF8574_ADDR_A21_A11_A01
PCF8574_ADDR_A21_A11_A00
PCF8574_ADDR_A21_A10_A01
PCF8574_ADDR_A21_A10_A00
PCF8574_ADDR_A20_A11_A01
PCF8574_ADDR_A20_A11_A00
PCF8574_ADDR_A20_A10_A01
PCF8574_ADDR_A20_A10_A00

PCF8574A_ADDR_A21_A11_A01
PCF8574A_ADDR_A21_A11_A00
....
....
PCF8574A_ADDR_A20_A10_A00

Что бы понять что этот список означает посмотрите на внешний вид китайского модуля. В правом нижнем углу есть 3 контактные площадки A0, A1, A2. Теперь глянем на схему модуля - по умолчанию эти контакты подтянуты к питанию через резисторы R4, R5, R6, что соответствует логической единице на всех трех пинах: A0=1, A1=1, A2=1. Для такой конфигурации текущий адрес будет:
PCF8574_ADDR_A21_A11_A01
Если соеденить верхнюю и нижнюю контакнтную площадки A2, то мы закоротим ее на землю, что соотвествует логическому нулю на этом пине. Состояние на всех трех контактах будет следущее: A0=1, A1=1, A2=0. Для такой конфигурации текущий адрес будет:
PCF8574_ADDR_A20_A11_A01

Забирать библиотеку - тут
 

enjoynering

Well-known member
Народ протестировал скорость: моя 1096мкс, библиотека из менеджера закачке 1458мкс. Это на AVR 16МГц и скоростью i2c 100КГц. На ESP должна быть еще быстрее. Попробуйте поставить скоростью i2c 400КГц может прокатит. Вишенка тут не вскорости, она идет бонусом, а в полной УНИВЕРСАЛЬНОСТИ. У всех LiquidCrystal_I2C из инета куча параметров захардкодена. Моя же гибкая и все меняет на лету САМА.
 
Последнее редактирование:

enjoynering

Well-known member
Добавил поддержку PROGMEM для AVR, ESP8266 и STM32. Теперь можно иконки сохранять во флеш и не держать их мертвым грузом в динамической памяти.

Смотрите подробности в примере - CustomChars
 
Последнее редактирование:

enjoynering

Well-known member
недавно на официальном форуме Arduino один товарищ надавал мне по щам - мол не быстрая у меня либа. Пришлось слегка ее переписать теперь средняя скорость передачи символа - 1056 микросекунд на AVR 16MHz и I2C 100MHz. На стандартных настройках ESP8266 выдает около 800 микросекунд и STM32 ~900 микросекунд. Дает о себе знать разница в тактовой частое. Дальнее увеличение скорости выливается в больше расходы памяти и флеши :(. Поэтому я прекратил изыскания.

Добавил скетч - SpeedTest.ino для любителей доверять но проверять.
 
Последнее редактирование:
Сверху Снизу