• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 для любителей доверять но проверять.
 
Последнее редактирование:
Сверху Снизу