В предыдущем уроке мы рассмотрели подключение LCD-экранчика к Arduino. Неудобство в том, что при задействовании 4-битного режима задействуется 7 выводов Arduino, а при использовании 8-битного аж 11 выводов. Чтобы сократить количество выводов I/O Arduino при подключении к LCD, были разработаны LCD с последовательным интерфейсом т.н. Serial LCD. При подключении через I2C кол-во проводников сокращается до 4-х.
На eBay Serial LCD на сегодняшний день продаются по цене в среднем 10$, найти их достаточно легко, введя в поисковую строку один из запросов: Serial LCD, I2C LCD, Serial LCD Arduino, UART LCD и др. Есть отдельно продающиеся адаптеры.
В основной массе это широко распространённые китайские LCD модули 1602, JHD162A и др., с установленным с обратной стороны модулем, который и обеспечивает преобразование. Как правило, в модулях используется микросхема PCF8574T, представляющая собой 8-ми битный расширитель шины для I2C интерфейса.
Как видно из фото выше, модуль имеет всего 4 вывода: GND, VCC, SDA, SCL. Линия SDA (data) подключается к Analog In 4, а SCL (clock) к Analog In 5. Ну и естественно питание 5В.
На плате размещен джампер для включения подсветки, а также потенциометр для регулировки контрастности.
Исходный код:
#include Wire.h #include LiquidCrystal_I2C.h LiquidCrystal_I2C lcd(0x27,16,2); // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2) int interval = 0; void setup() { lcd.init(); // инициализация LCD lcd.backlight(); // включаем подсветку lcd.clear(); // очистка дисплея lcd.setCursor(4, 0); // устанавливаем курсор на 1 строку, 4 символ lcd.print("cxem.net"); // вывод надписи lcd.setCursor(1, 1); // устанавливаем курсор на 2 строку, 1 символ lcd.print("count:"); lcd.setCursor(8, 1); // устанавливаем курсор на 2 строку, 8 символ lcd.print(interval); } void loop() { delay(500); interval++; lcd.setCursor(8, 1); lcd.print(interval); }
Код я постарался хорошо прокомментировать, поэтому вопросов по его работе возникнуть не должно.
Создание пользовательских символов
На экране можно выводить пользовательские символы, создавать их очень просто. Размер одного символа составляет 5 пикселей по горизонтали и 7 пикселей по вертикали. Для создания символа необходимо начертить табличку 5х7 и закрасить необходимые клетки. В них ставим 1, а в пустых 0. Затем формируем семь строк в двоичном формате. Например русская буква "П":
Первая строка полностью закрашена, т.е. в двоичном формате это 11111. Переводим в шестнадцатеричный формат и получаем 1F. И так для всех 7-ми строк. Вторая и все последующие строки 10001 и 0x11.
В самой программе для создания символа вы инициализируете массив из 7-ми элементов и можете задавать его как в двоичном формате, так и в шестнадцатеричном формате.
Давайте рассмотрим пример вывода на LCD надписи "ПАЯЛЬНИК":
#include "Wire.h" #include "LiquidCrystal_I2C.h" uint8_t bukva_P[8] = {0x1F,0x11,0x11,0x11,0x11,0x11,0x11}; uint8_t bukva_Ya[8] = { B01111, B10001, B10001, B01111, B00101, B01001, B10001 }; uint8_t bukva_L[8] = {0x3,0x7,0x5,0x5,0xD,0x9,0x19}; uint8_t bukva_Mz[8] = {0x10,0x10,0x10,0x1E,0x11,0x11,0x1E}; uint8_t bukva_I[8] = {0x11,0x13,0x13,0x15,0x19,0x19,0x11}; LiquidCrystal_I2C lcd(0x27,16,2); // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2) void setup() { lcd.init(); // инициализация LCD lcd.backlight(); // включаем подсветку lcd.clear(); // очистка дисплея lcd.createChar(0, bukva_P); // создаем символ и записываем его в память LCD lcd.createChar(1, bukva_Ya); lcd.createChar(2, bukva_L); lcd.createChar(3, bukva_Mz); lcd.createChar(4, bukva_I); lcd.home(); lcd.print(0, BYTE); // отображаем символ в памяти LCD по 0 адресу lcd.print("A"); lcd.print(1, BYTE); lcd.print(2, BYTE); lcd.print(3, BYTE); lcd.print("H"); lcd.print(4, BYTE); lcd.print("K"); } void loop() { }
Символы П,Л,Ь,И мы задали массивом из шестандцатеричных значений. А символ Я задан массивом из двоичных значений. Фото вывода на LCD:
- arduino67.rar (1531 Кб)
Комментарии (37) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:81: error: conflicting return type specified for 'virtual void LiquidCrystal_I2C::write(uint8_t)'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:48: error: overriding 'virtual size_t Print::write(uint8_t)'
Разобрался! На моем ARDUINO MEGA 2560 надо подключать I2C не на А4 А5 как везде пишут, а на SDA 20 и SCL 21! Может кому поможет. Я 6 часов на это потерял!
Подключал к arduino uno на контакты A5-A4 или у меня сам экран сдох?
У меня этот экран один в один, но программатор пишет так : LiquidCrystal does not name a type, а на экране только в верхнем ряду прямоугольники и всё. В общем какие скетчи не пробовал, какие только библиотеки не пробовал, - не работает
Кроме того, в коде нужно добавить
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
А также заменить все обращения lcd.print(x,BYTE); на lcd.printByet(x);
И всё шикарно заработает!
Вот код ошибки
sketch_feb07a:39: error: 'class LiquidCrystal_I2C' has no member named 'printByet'
На краях там или не видно ни чего на экране или белые квадраты. Я только минут через 20 допёр его покрутить, оказалось всё работает, просто нужно было покрутить.
После удаления других -Уура!, Заработало!
Потом методом тыка нашел ноги SCL и SDA и увидел в итоге единственное устройство с адресом 3F. Кстати SCL и SDA у меня работают и на А4, А5, и на ногах обозначенных как SCL и SDA. Плата Uno.
Пришлось коряво выводить по ОДНОМУ символу с помощью махонькой функции типа так:
====================================
void lcdPrint(char string[], int sizestring)
{
int j;
for ( j = 0; j < sizestring; j = j+1 )
{
lcd.print(string[j]);
}
}