Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 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

Raspberry Pi 2
Raspberry Pi 2
Бокс для хранения компонентов Конструктор: DDS генератор сигналов
вверх