Вообще-то микросхема PCF8574 может быть приспособлена к большому количеству самых разных применений (считывание кнопок, засвечивание светодиодов и т. п.). В режиме записи микросхема при этом напрямую транслирует значение битов в переданном по шине I2C байте в состояние восьми выходов (при чтении, наоборот, состояние восьми линий передается в передаваемый байт). I2C-адрес в PCF8574 может меняться установкой уровня на трех входах задания адреса, так что с помощью одной шины по двум проводам можно устанавливать или читать состояние до 64 линий. В этом деле имеются некоторые особенности из-за несимметрии состояний «0» и «1» выводов параллельного порта PCF8574, причем как при работе на вход, так и на выход (см. здесь), но нашей задаче управления ЖК- или OLED-дисплеями по шине I2C они не помешают.
Нет даже необходимости разводить переходную плату для дисплеев самостоятельно. Специально для управления HD44780-совместимыми дисплеями выпускаются многочисленные разновидности модулей-переходников (см. фото). По одному краю у них установлен игольчатый однорядный разъем типа PLS, разводка которого позволяет напрямую стыковать такой модуль с ЖК- или OLED-дисплеем.
Если при этом ориентировать модуль так, чтобы вывод модуля номер 1 (отсчет ведется от входного разъема, см. фото выше) совпадал с выводом 1 дисплея, то плату-переходник можно установить прямо на плату дисплея так, как показано на фото ниже (фото с сайта 9zip.ru). При этом, конечно, должен совпадать и шаг выводов и сам тип разъема. Поэтому среди распространенных строчных OLED-дисплеев Winstar так, как на картинке, подключить можно только типы WEH1602A и 2004A, для типа 1602B модуль придется поворчивать на 180, а для любимых народом 2002A/B и 1202/1204 изготавливать переходные кабелЯ.
Разводка выводов для случая OLED-дисплея показана в таблице. Если вы хотите вместо готового модуля самостоятельно подключить микросхему (что позволит уменьшить габариты), но собираетесь использовать описанную далее библиотеку, то по этой таблице можно также определить правильное подключение «голой» микросхемы. Отметим, что фактически здесь используется четырехпроводная схема подключения дисплея и биты DB0-DB3 не подключены никуда, поэтому в таблице обозначены серым цветом.
Разводка выводов при подключении PCF8574 и модуля на ее основе к OLED-дисплею
Синенький подстроечный резистор, а также перемычка на торце платы, которые видны на фото, предназначены для управления подсветкой в ЖК-дисплеях (выводы 15 и 16) и в нашем случае не задействуется. (Кстати, то же самое относится к биту Р3 выходного порта PCF8574, который в нашем случае не используется.) Поэтому при подключении напрямую OLED-дисплея 1602B, у которого выводы 15 и 16 находятся перед выводом 1, их можно просто не подключать (а у модуля при этом 15 и 16 выводы придется удалить, чтобы не мешались).
Под этим резистором на плате имеются контакты A0, A1 и A2 для задания младших битов I2C-адреса. По умолчанию они подключены к высокому уровню, поэтому адрес имеет наибольшее возможное значение из заданного диапазона. Микросхемы PCF8574 выпускаются в нескольких модификациях, отличающихся этим диапазоном. Для PCF8574 без буквенного индекса (или у PCF8574Т) адрес по умолчанию будет равен 0x27, и может меняться в меньшую сторону до 0x20. У PCF8574A адрес по умолчанию равен 0x3F и меняется до 0x38.
Для работы с дисплеем, подключенным через PCF8574 по I2C-интерфейсу, имеется рекомендованная библиотека под названием LiquidCrystal_I2C (см. официальный сайт arduino.cc). Разумеется, как и оригинальная LiquidCrystal, она работает только с английским языком. Русскоязычных версий ее не имеется (по крайней мере, таких, которые бы уверенно работали в современных версиях Arduino IDE), и вариант для работы с OLED-дисплеем тоже отсутствует. Поэтому автор взял на себя труд доработки, приняв за исходный самый простой из вариантов LiquidCrystal_I2C.
Очевидным методом русификации было бы объединить LiquidCrystal_I2C и LiquidCrystalRus, доработав последнюю в части инициализации OLED-дисплеев. Но лобовое решение здесь не прокатывает — в I2C-режиме LiquidCrystalRus выводит только первую букву посланной через функцию print() строки. С чем это связано, я разбираться не стал, попросту дополнив библиотеку LiquidCrystal_I2C своей функцией вывода outStr(), которая отбрасывает старший байт кодировки UTF-8, а младший перекодирует в символ из внутренней таблицы ENGLISH_RUSSIAN (0x02) контроллера WS0010.
Исправленную и дополненную версию под названием LiquidCrystal_I2C_OLED можно скачать отсюда. Если строка не содержит русских букв, то ее следует выводить обычной функцией print(), которая работает быстрее. Значок градуса, а также буквы «ё» и «Ё» выводить можно только прямым указанием восьмеричных кодов (например, «всё» — «вс265», «22,5°» — «22,5337», см. таблицу далее). Примеры вывода имеются в папке examples (не забудьте сменить адрес микросхемы PCF8574, если у вас версия, отличная от PCF8574A или адрес изменен переключением бит модификации). Пример вывода русского алфавита на дисплей конфигурации 1602 (микросхема PCF8574A, адрес по умолчанию 0x3F):
#include #include LiquidCrystal_I2C OLED1(0x3F,16,2); // Устанавливаем дисплей void setup() { OLED1.init(); OLED1.clear(); OLED1.print("Proba"); //вывод английского OLED1.setCursor(7, 0); //середина верхней строки OLED1.outStr("Проба"); //вывод русского OLED1.setCursor(7, 1);//середина нижней строки OLED1.print("-22,3337C"); //"-22,3°C" delay(1000); } void loop() {//для дисплея 16х2 или 20х2!!!! OLED1.setCursor(0, 0); //начало верхней строки OLED1.outStr("АБВГДЕЖЗИЙКЛМНОП"); OLED1.setCursor(0, 1);//начало нижней строки OLED1.outStr("абвгдежзийклмноп"); delay(2000); OLED1.setCursor(0, 0); //начало верхней строки OLED1.outStr("РСТУФХЦЧШЩЪЫЬЭЮЯ"); OLED1.setCursor(0, 1);//начало нижней строки OLED1.outStr("рстуфхцчшщъыьэюя"); delay(3000); }
Корректный результат вывода первой половины алфавита показан на фото:
Подчеркнем, что такая русифицированная библиотека (как и 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;) необходимо удалить.
Источник