Для строчных дисплеев Winstar очень соблазнительно сократить число управляющих соединений, которых даже при четырехпроводном включении получается не меньше шести (R/W можно не подключать, см. вот эту публикацию автора). Говорят (в том числе и сами винстары, см. оф. сайт), что контроллер WS0010 может управляться по SPI (а некоторые даже и по I2C!), но инструкций в документации на эту тему упорно не помещают, и как с этим управляться — непонятно. К тому же SPI помогает не сильно — вместо шести соединений получаем четыре привязанных к дисплею, потому что еще для каких-то целей SPI в любительской практике употребляют нечасто. Потому самое удобное решение в плане сокращения числа соединений для стандартных плат Arduino — использовать так называемый расширитель (экспандер) портов на основе шины I2C под названием PCF8574. Это позволяет сократить число необходимых соединений до двух (не считая питания), причем на основе выводов стандартного порта TWI, что не мешает подключать к нему же различные датчики, часы и т.п. Вообще-то микросхема PCF8574 может быть приспособлена к большому количеству самых разных применений (считывание кнопок, засвечивание светодиодов и т. п.). В режиме записи микросхема при этом напрямую транслирует значение битов в переданном по шине I2C байте в состояние восьми выходов (при чтении, наоборот, состояние восьми линий передается в передаваемый байт). I2C-адрес в PCF8574 может меняться установкой уровня на трех входах задания адреса, так что с помощью одной шины по двум проводам можно устанавливать или читать состояние до 64 линий. В этом деле имеются некоторые особенности из-за несимметрии состояний «0» и «1» выводов параллельного порта PCF8574, причем как при работе на вход, так и на выход (см. здесь), но нашей задаче управления ЖК- или OLED-дисплеями по шине I2C они не помешают. Нет даже необходимости разводить переходную плату для дисплеев самостоятельно. Специально для управления HD44780-совместимыми дисплеями выпускаются многочисленные разновидности модулей-переходников (см. фото). По одному краю у них установлен игольчатый однорядный разъем типа PLS, разводка которого позволяет напрямую стыковать такой модуль с ЖК- или OLED-дисплеем. 


#include #include <liquidcrystal_i2c oled1="" void="" setup="" oled1.init="" oled1.clear="" oled1.print="" oled1.setcursor="" oled1.outstr="" delay="" loop="">
Корректный результат вывода первой половины алфавита показан на фото: Подчеркнем, что такая русифицированная библиотека (как и LiquidCrystalRus, кстати) предназначена для работы в современных версиях Arduino IDE (начиная примерно с 1.6.1 и далее) в среде Windows 7/8/10. В среде Arduino IDE 1.0, а также в других редакторах и ОС, работающих в однобайтовой кодировке win1251 (ANSI, cp1251), эти библиотеки прямой русский текст в строке не воспринимают. В этом случае следует пользоваться функцией print() с указанием восьмеричных кодов русских букв, согласно таблице ниже, только библиотеку все равно придется использовать эту (либо доработать LiquidCrystal_I2C для переключения в таблицу ENGLISH_RUSSIAN при инициализации, см. здесь). В контроллере WS0010 применен экономичный метод кодирования — вводятся только русские буквы, не совпадающие с английскими по начертанию. Например, «суббота» будет выглядеть, как «cy262262o277a». Коды кириллических символов и значка градуса для контроллера WS0010 (таблица ENGLISH_RUSSIAN, код 0x02) Признаком того, что ваша среда/редактор выдает вместо UTF-8 однобайтную кодировку win1251 будет вывод вместо «А» — «ч», вместо «а» — «Д» и т. п. (фото прислал Tomasina): Если не справитесь с выяснением причин, откуда в современных средах под Windows берется однобайтовая кодировка, то остается только либо воспользоваться прямым выводом кодов, как указано выше, либо просто изменить в моей функции outStr() по очереди все коды младшего байта UTF-8 на код из таблицы win1251. Например, оператор case 0x90 (заглавная «А») заменяем на case 0xC0 и так далее, при этом строки, фильтрующие старший байт (case 0xd0: break; и case 0xd1: break;) необходимо удалить.
- Цена: $0.94
Решил я сделать текстовую панель оператора(HMI) и подключить ее по «квадратной» шине I2C к Arduino. Для этого разработал на основе микросхемы PCF8574P плату клавиатуры из 5 кнопок. PCF8574P это расширитель портов, корпус DIP, работает по шине I2C. Приобрел я партию из двух таких микросхем за 0.94$ с бесплатной доставкой из Китая, таким образом одна штука стоит 0.47$. Покупка выгодная, так как в местных магазинах эти же микросхемы стоят больше 2 долларов за штуку. Дисплеем HMI будет стандартный экранчик 1602, так же через платку FC-113 работающий по квадратной шине. PCF8574P выслали, дали трек-номер и через 2 недели я их уже получил на почте. Извлекаем из пластиковой трубки, вроде бы все нормально. Однако, снизу на корпусе одной из микросхем есть следы загадочных термомеханических воздействий. Природа этих повреждений мне не ясна, но очевидно, что во время пересылки они появиться не могли. Долго думал над этой загадкой, пока меня не осенило. Просто на склад продавца пробрался Люк Скайуокер, вдруг уменьшившийся до микроскопических размеров. Там он приметил один из расширителей портов, спутал с имперским шагоходом и принялся рубить его световым мечем. Тут зашла комплектовальщица, увидела эту картину и такая говорит: «Прекрати, Люк Скайуокер! Это не имперский шагоход, это микросхема PCF8574P, за которую уже уплочено из Запорожья». Хорошо хоть, обе микросхемы при проверке оказались рабочими. Приступаем к созданию самой клавиатуры по такой схеме. В Layout 6.0 нарисовал одностороннюю плату. Скачать файл с платой можно тут. Плату травил перекисью водорода и лимонной кислотой. В сети много рецептов травления платы перекисью. Я делал такой раствор: 100 мл перекиси водорода 3%, 50 г лимонной кислоты, 3 чайные ложки соли. Баночку с перекисью подогрел в кастрюле с водой. Погружаем плату в раствор рисунком вниз, как рекомендуют при травлении перекисью. Пшшшшшш! Сначала процесс идет бурно. Пс… Потом заметно стихает. Переворачиваем, смотрим на рисунок. Красота. Готовая плата выглядит так.
Адресные ножки микросхемы подключены на GND, поэтому адрес платы на шине будет 0x20. Пишем программу для Ардуино.Скетч Загружаем программу в Ардуино и подключаем его к созданной клавиатурной плате и дисплею. Включаем, работает! Мой HMI будет работать не просто с Arduino, а с ардуино-совместимым ПЛК CONTROLLINO. Если будет вдохновение и интерес читателей, напишу и про него как-нибудь.Плюсы PCF8574P: 1. Минимальная обвязка. 2. Прост в работе.Минусы PCF8574P: У самой микросхемы не обнаружил, хотя и советую покупать у другого продавца. На этом обзор микросхемы PCF8574P заканчиваю. Но как опытный уже обозреватель, заранее отвечу на вопросы, которые обязательно зададут:Почему в DIP корпусе? SOIC лучше. При прочих равных, я предпочитаю DIP, мне с ними проще.DIP и выводные элементы ставят только ламеры, все специалисты используют SOIC и SMD. Вот я паяю исключительно SMD и вообще я молодец. Вы молодец.Почему бы просто не купить на алиэкспрессе готовый модуль с дисплеем 1602 и клавиатурой 5 кнопок? Он тоже работает по I2C. Его цена от 11 $. Я же потратил: Дисплей 1602 — 1.3 $ Плата FC-113 — 0.55 $ Микросхема PCF8574P — 0.47 $ Кнопки и колпачки — 0.7 $ Реактивы для травления платы — 0.3 $ Текстолит, резисторы и прочая мелочевка — бесплатно, из старых запасов. Итого: 3.32 $ Но главное- на своей плате я поставил кнопки с квадратным толкателем что бы одеть на них красивые цветные колпачки.Ого, всего одна микросхема PCF8574P стоит почти как целая плата FC-113! Да уж…Вы сделали все неправильно. Неправильно рисовали, неправильно травили в неправильном растворе и поставили неправильные кнопки. Я бы на вашем месте сделал все правильно. Вы молодец.Почему пятая кнопка так далеко от остальных? Это специально так, они функционально различны. Те четыре это влево, вправо, отмена, ввод, а пятая будет SETUP.Я ждал более захватывающую историю про Люка Скайуокера, вы меня обманули! Я молодец.UPD 2017-02-20:доделал девайсПеречень функций библиотеки LiquidCrystal и LiquidCrystal_I2C
Системные функции:
init() – Обязательная инициализация
begin(col, row, size) – Инициализация дисплея с указанием количества col — столбцов, строк — row и размера символа — size
backlight() – Активация подсветки
noBacklight() – Деактивация подсветки
display() – Включить вывод на экран
noDisplay() – Выключить вывод экран
Функции работы с текстом:
clear() – Очистить экранную область и сброс позиции курсора в 0, 0
home() – Сброс курсора в позицию 0, 0
setCursor(col, row) – Установка курсора в положение, col — колонка и row — строка
print(«Ваш текст») – Выводит текст в экранную область дисплея
blink() – Включить мерцание курсора
noBlink() – Выключить мерцание курсора
cursor() – Включить курсор в виде нижнего подчеркивания
noCursor() – Выключить курсор
leftToRight() – Сдвигать курсор вправо, после символа
rightToLeft() – Сдвигать курсор влево, после символа
autoscroll() – Выравнять текст справа от курсора
noAutoscroll() – Выравнять текст слева от курсора
scrollDisplayLeft() – Сдвиг экранной области влево на один шаг
scrollDisplayRight() – Сдвиг экранной области вправо на один шаг
Используемые источники:
- https://habr.com/post/408197/
- https://mysku.ru/blog/aliexpress/48969.html
- https://duino.ru/lcd-1602-arduino/library-and-function/


Arduino Nano 3.0 распиновка
Умный дом на базе Ардуино: пошаговая инструкция по сборке
Датчики давления Arduino bmp280, bmp180, bme280
Метеостанция (Arduino pro mini, BME280, LCD1602)
Что такое Ардуино? Это свобода для изобретателя
Видео и фото обзор стартового набора Arduino для UNO R3 из посылки на Aliexpress
Еще одно FM радио на RDA5807 под управлением Ардуино