Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 100 руб.
От пользователей

Похожие статьи:


Arduino UNO урок 11 - Serial LCD

В предыдущем уроке мы рассмотрели подключение 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 интерфейса.

Serial LCD

Как видно из фото выше, модуль имеет всего 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);
}

Код я постарался хорошо прокомментировать, поэтому вопросов по его работе возникнуть не должно.

Serial LCD

Создание пользовательских символов

На экране можно выводить пользовательские символы, создавать их очень просто. Размер одного символа составляет 5 пикселей по горизонтали и 7 пикселей по вертикали. Для создания символа необходимо начертить табличку 5х7 и закрасить необходимые клетки. В них ставим 1, а в пустых 0. Затем формируем семь строк в двоичном формате. Например русская буква "П":

Свой символ на LCD

Первая строка полностью закрашена, т.е. в двоичном формате это 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:

Вывод надписи Паяльник на LCD

Прикрепленные файлы:

Теги:

Колтыков А.В. Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (37) | Я собрал (0) | Подписаться

0
Юрий #
Для какой версии программы библиотеки?
Ответить
0
talibanich #
022 или 023
Ответить
0
Юрий #
У меня версия 1.0.5. При компиляции выдает ошибку:
In file included from arduino67.pde:2:
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)'
Ответить
0
Andrey #
Здесь исправленная библиотека под 1.0.5: http://www.dfrobot.com/wiki/index.php/I2C/TWI_LCD1602_Module_(SKU:_DFR0063)
Ответить
0
Виктор #
Девайс у меня один в один, но не могу с ним справиться. Какие уж библиотеки не качал, ни чего не показывает!
Разобрался! На моем ARDUINO MEGA 2560 надо подключать I2C не на А4 А5 как везде пишут, а на SDA 20 и SCL 21! Может кому поможет. Я 6 часов на это потерял!
Ответить
0
hhdusha #
Виктор, спасибо! Помогли! Те же грабли... обошел!
Ответить
0
Артем #
У меня этот экран один в один, но программатор пишет так : LiquidCrystal does not name a type, а на экране только в верхнем ряду прямоугольники и всё. В общем какие скетчи не пробовал, какие только библиотеки не пробовал, - не работает
Подключал к arduino uno на контакты A5-A4 или у меня сам экран сдох?
Ответить
0
Сергей #
Артем 02.12.2013 18:48 #
У меня этот экран один в один, но программатор пишет так : LiquidCrystal does not name a type, а на экране только в верхнем ряду прямоугольники и всё. В общем какие скетчи не пробовал, какие только библиотеки не пробовал, - не работает
Такая же проблема, ошибка при компиляции.
Ответить
+1
Ivan #
Вот тут обновлённая библиотека
Кроме того, в коде нужно добавить
#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);
И всё шикарно заработает!
Ответить
0
Сергей #
Респект!
Ответить
0
олег #
Сделал как ты казал (заменил lcd.print(x,BYTE); на lcd.printByet(x);) не помогает
Вот код ошибки
sketch_feb07a.ino: In function 'void setup()':
sketch_feb07a:39: error: 'class LiquidCrystal_I2C' has no member named 'printByet'
Ответить
0
Ivan #
Опечатка, конечно. Не printbYET(x), а printbYTE(x)
Ответить
0
Николай #
Возможно ли подключить его не к пинам А4 А5, а скажем к другим пинам например А1 А2, а на А4 А5 повесить другой датчик?
Ответить
0
Игорь #
На выводы А4, А5 (они же sda и scl) помимо LCD можно подключить несколько датчиков работающих по I2C. У меня на эти выводы подключен экран, датчик давления и модуль RTC.
Ответить
0
max #
Учтите ещё, что текст виден только на небольшом участке потенциометра регулировки контрастности.
На краях там или не видно ни чего на экране или белые квадраты. Я только минут через 20 допёр его покрутить, оказалось всё работает, просто нужно было покрутить.
Ответить
-1
Сергей #
А возможно залить в LCD русский шрифт?
Ответить
0
talibanich #
А вы статью вообще читали или только заголовок?
Ответить
0
Сергей #
Читал конечно и очень внимательно, но про русский шрифт там нет ничего. Здесь описывается создание пользовательских символов, их можно создать всего 8, и размещаются они в начале таблицы встроенного шрифта под номерами от 0х00 до 0х07. В русском алфавите, помнится со школы, букавок вроде немного больше.
Ответить
0
Дмитрий #
Непонимаю..... Скачал библиотеку http://www.dfrobot.com/wiki/index.php/I2C/TWI_LCD1602_Module_%28SKU:_DFR0063%29#Projects скетч успешно откомпилировался и залился в ардуинку, но все равно ничего не работает, вторая строка полностью забита квадратами, никакой реакции, вытыкивал провода А4 и А5 из ардуинки, все тоже самое. Такое впечатление что в Ардуине не работает А4 и А5, хотя проверял, подключал переменный резистор, данные с портов читаются отлично. Грешу на библиотеку
Ответить
+1
Newfie #
Попробуйте 0x3f. По крайней мере просканируйте I2-адреса для проверки отклика.
Ответить
0
Максим #
Подскажите, пожалуйста, при работе со скетчем для I2C на дисплее 1602 отображается только первый символ из строки и не важно с какой позиции... пробовал так по одному символу - слова можно собрать...
Ответить
0
Bikmop #
Скачай версию 1.6.4. На ней отображается норм! Такая же проблема была.
Ответить
0
Bikmop #
Такая же проблема, только первая буква из строки отображается
Ответить
+1
Ghost #
Максим, это ошибка была связана с библиотекой "LiquidCrystal_I2C" Версия 1.6.6 Замени ее прикрепленной, должно вылечиться.
Прикрепленный файл: LiquidCrystal_I2C-fix-write.zip
Ответить
0
Максим #
Спасибо Вам! Теперь всё в порядке, вылечил!
Ответить
0
Олег М. #
Спасибо, Ghost, за библиотеку.
После удаления других -Уура!, Заработало!
Ответить
0
Aleksandr #
Спасибо! Заработало как надо
Ответить
0
Topdesign #
Ребята, у меня не работало по другой причине. Дисплей имел адрес в сети I2C не 0x27, как во всех примерах, а 0х3F. Обнаружил я это, когда не мог понять, на каких ногах платы у меня SCL и SDA. Запустил сканер адресов I2C http://blog.jacobean.net/?p=653
Потом методом тыка нашел ноги SCL и SDA и увидел в итоге единственное устройство с адресом 3F. Кстати SCL и SDA у меня работают и на А4, А5, и на ногах обозначенных как SCL и SDA. Плата Uno.
Ответить
0
chega #
Была таже проблема с адресом и в результате адрес действительно оказался 3F, но дисплей все равно ничего не показывает, пробовал ноги а4 а5 и SCL SDA
Ответить
0
HS #
Имеется такой модуль с экраном, не могу завести, там где заказывал пишут что отзывается 0x3F, но у меня работать не хочет, квадратики на экране и все, пробовал разные адреса, крутил контраст, мк шьется, но модуль с ним работать не хочет.
Ответить
0
Олег М. #
Все пляски с бубнами и "новыми" библиотеками не помогают :(
Пришлось коряво выводить по ОДНОМУ символу с помощью махонькой функции типа так:
lcdPrint("Test", 4), где цифра 4 - длина выводимой строки.

====================================
void lcdPrint(char string[], int sizestring)
{
int j;
for ( j = 0; j < sizestring; j = j+1 )
{
lcd.print(string[j]);
}
}
Ответить
0
yurka_ #
Спасибо большое за библиотеку. Пол дня искал решение по аналогичному багу с печатанием лишь одного символа...
Ответить
0
yuribak #
Танцы с бубном, подмены библиотек, замена модуля ничего не дали. Баг с печатанием лишь одного символа. Откатился до IDE 1.6.5. Заработало на всех библиотеках.
Ответить
0
Ivan #
Народ подскажите что за такое только начальные буквы и цифра, итак с разным текстом дисплей 1602а i2c (на фото) вот такой вот
Прикрепленный файл: 20160410_185944.jpg
Прикрепленный файл: 20160410_185958.jpg
Ответить
0
Sm1th #
В первом примере надо названия библиотек поместить или в кавычки "" или скобки . А иначе не заработает. (По крайней мере лично у меня не заработало IDE 1.6.5)
Ответить
0
yurist #
1602A на i2c Не печатает нижняя строка. На разных библиотеках. Как только при объявлении указываю, что дисплей 16,2 - перестает печатать и верхняя.. 16,1 - печатает нормально. UNO rev 3
Ответить
0
Vitaliy #
Добрых суток, может кому поможет. У меня экран 1602 китайской сборки, на стандартном адресе 0Х27 ни чего не выдавал. После сканирования I2C адрес оказался 0x3F!!! Поменял в скече и все нормальзовалось.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Модуль измерения тока на ACS712 (30А) Raspberry Pi 2
вверх