Arduino с символьными LCD дисплеями на базе HD44780
Содержание:
Введение
Библиотеки Arduino
Параллельный интерфейс: начало работы с JHD162A 16x2
Интерфейс I2C: начало работы с 20x4 дисплеем
Пользовательские символы
Введение
LCD-дисплеи, совместимые с HD44780, бывают разных форм и размеров. Два очень распространённых варианта – 16x2 и 20x4 символов. Хотя большинство экранов оснащены подсветкой, некоторые – нет. И хотя оригинальный интерфейс параллельный, некоторые экраны поставляются с предустановленным I2C-адаптером (их можно купить и отдельно).
LCD-дисплеи 16x2 и 20x4
С подсветкой и без подсветки
Модули без подсветки не так распространены, но всё же стоит проверить перед покупкой.
С I2C-адаптером и без I2C-адаптера
LCD без адаптера требуют 8 или 12 подключений (см. 4-бит / 8-бит ниже), а экраны с адаптером – всего 4 подключения. Это делает модули с I2C-адаптерами значительно проще в подключении.
Ещё один момент – набор символов. HD44780 может иметь один из двух наборов: европейский или азиатский.
Два возможных набора символов
Библиотеки Arduino
Ключевое преимущество использования библиотеки – не нужно беспокоиться о технических деталях. Библиотека делает всё за нас. Недостаток – когда разные библиотеки пытаются использовать одни ресурсы, найти проблему сложно.
Arduino IDE поставляется с предустановленной библиотекой LiquidCrystal (только параллельный интерфейс). Работает хорошо, но с ограничениями.
Я рекомендую две библиотеки:
NewLiquidCrystal от Francisco Malpartida – поддерживает почти все HD44780-совместимые дисплеи, включая I2C. Заменяет стандартную библиотеку.
Extensible hd44780 LCD library от Bill Perry – новая, но хорошо работающая.
Скачивание NewLiquidCrystal:
На wiki-странице нажмите Download.
Скачайте последнюю версию (на момент написания – 1.3.4).
Скачанный zip-архив. Извлеките папку NewLiquidCrystal.
Удалите стандартную библиотеку LiquidCrystal из папки библиотек Arduino.
Скопируйте NewLiquidCrystal в папку библиотек Arduino.
Если IDE открыта – перезапустите её.
Сравнение команд LiquidCrystal и NewLiquidCrystal:
Команда |
LiquidCrystal |
NewLiquidCrystal |
|---|---|---|
begin |
ДА |
ДА |
clear |
ДА |
ДА |
home |
ДА |
ДА |
ДА |
ДА |
|
println |
НЕТ |
ДА |
write |
ДА |
ДА |
setCursor |
ДА |
ДА |
cursor / noCursor |
ДА |
ДА |
blink / noBlink |
ДА |
ДА |
display / noDisplay |
ДА |
ДА |
scrollDisplayLeft/Right |
ДА |
ДА |
leftToRight / rightToLeft |
ДА |
ДА |
createChar |
ДА |
ДА |
moveCursorLeft/Right |
НЕТ |
ДА |
autoscroll / noAutoscroll |
НЕТ |
ДА |
backlight / noBacklight |
НЕТ |
ДА |
on / off |
НЕТ |
ДА |
setBacklightPin |
НЕТ |
ДА |
setBacklight |
НЕТ |
ДА |
Описание основных команд:
LiquidCrystal –
LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7)– создание объекта lcd. 4 пина – 4-битный режим, 8 пинов – 8-битный.LiquidCrystal_I2C –
LiquidCrystal_I2C LCD(I2C_ADDR);– создание I2C LCD объекта.begin –
lcd.begin(width, height);– инициализация экрана.clear –
lcd.clear();– очистка экрана, курсор в 0,0.home –
lcd.home();– курсор в 0,0.print –
lcd.print(data);– вывод данных (char, byte, int, long, string). Поддерживает BASE (BIN, OCT, DEC, HEX).write –
lcd.write(data);– запись одного символа.lcd.write(65)выводит «A».setCursor –
lcd.setCursor(x, y);– перемещение курсора. Координаты с 0.cursor / noCursor – вкл/выкл курсор (подчёркивание).
blink / noBlink – вкл/выкл мигание курсора.
noDisplay / display – скрыть/показать текст без стирания из памяти.
createChar –
createChar(номер, byteArray[]);– создание пользовательского символа (до 8).backlight / noBacklight – вкл/выкл подсветку.
setBacklight –
setBacklight(int);– 0=выкл, 255=вкл, 1-255 яркость.
Параллельный интерфейс: начало работы с JHD162A 16x2
Используем дисплей 16x2 JHD162A в 4-битном режиме с примером HelloWorld.
JHD162A HD44780 символьный LCD с параллельным интерфейсом
Пины JHD162A
HD44780-совместимые дисплеи имеют 16 пинов (14 + 2 для подсветки).
VSS – GND
VCC – питание
VEE – контрастность (подключить к потенциометру)
RS – Register Select. LOW=команда, HIGH=символ
R/W – Read/Write. LOW=запись, HIGH=чтение. Обычно подключён к GND
E – Enable, разрешение записи
DB0-DB7 – пины данных
LED+ / LED- – питание подсветки
4-битный и 8-битный режимы
В 4-битном режиме 4 пина данных, в 8-битном – 8. Разница в скорости минимальна. Всё зависит от доступных пинов: мало пинов – 4 бит; нужна скорость – 8 бит; совсем мало пинов – I2C (2 пина).
Подключение к Arduino
Дисплей |
VSS |
VCC |
VEE |
RS |
R/W |
E |
DB4 |
DB5 |
DB6 |
DB7 |
LED+ |
LED- |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
Arduino |
GND |
VCC |
POT |
D12 |
GND |
D11 |
D5 |
D4 |
D3 |
D2 |
VCC+RES |
GND |
Скетч
Пример Hello World. Если всё в порядке – «hello, world!» на верхней строке, счётчик секунд на нижней.
Если старая IDE – возможна ошибка компиляции:
D:\ProgsII\arduino-163\libraries\NewliquidCrystal\I2CIO.cpp:36:21: fatal error: Wire.h: No such file or directory
#include <Wire.h>
^
compilation terminated.
Error compiling.
Решение: скачайте последнюю IDE или отредактируйте файл I2CIO.cpp:
Найдите:
#if (ARDUINO < 10000)
#include <../Wire/Wire.h>
#else
#include <Wire.h>
#endif
Замените на:
#include <Wire.h>
Полный скетч Hello World:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}
Синий LCD с подсветкой
Зелёный LCD без подсветки
Основные части скетча
#include <LiquidCrystal.h>– подключение библиотекиLiquidCrystal lcd(12, 11, 5, 4, 3, 2);– создание объекта lcd (4-бит)lcd.begin(16, 2);– инициализация с размеромlcd.print("hello, world!");– вывод текстаlcd.setCursor(0, 1);– курсор на вторую строкуlcd.print(millis() / 1000);– вывод секунд
Управление подсветкой (параллельный интерфейс)
Полный контроль: вкл/выкл и регулировка яркости. Потенциометр – ручная регулировка, ШИМ – автоматическая.
Для ШИМ-управления используйте транзистор 2N2222:
LED+ через резистор 220 Ом к 5V
LED- к коллектору 2N2222
Эмиттер к GND
База через 1 кОм к пину 6 Arduino (ШИМ)
Скетч с ШИМ-управлением подсветкой:
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int backLightPWMpin = 6;
int brightness = 0;
void setup()
{
// set the back light pin to output
pinMode(backLightPWMpin, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop()
{
// increase the brightness
brightness = brightness + 10;
// the maximum value for analogeWrite is 255
if (brightness >255) { brightness = 0; }
// set the PWM speed to the brightness value
analogWrite(backLightPWMpin, brightness);
// display the brightness value on screen. The spaces clear the old value. Required when we go from 250 to 0.
lcd.setCursor(0, 1); lcd.print( " " );
lcd.setCursor(0, 1); lcd.print( brightness );
delay(1000);
}
Автоматическая регулировка яркости через ШИМ
В NewLiquidCrystal это встроено: setBacklightPin() + setBacklight() (0=выкл, 255=макс).
Интерфейс I2C: начало работы с 20x4 дисплеем
I2C дочерняя плата преобразует I2C-связь в параллельную. Два распространённых типа: с фиксированным адресом и с перемычками.
I2C адаптер с фиксированным адресом
I2C адаптер с перемычками для изменения адреса
Фиксированный адрес обычно 0x27 (может быть 0x20 или 0x3F). Модули с перемычками A0, A1, A2:
A0 |
A1 |
A2 |
Адрес |
|---|---|---|---|
OPEN |
OPEN |
OPEN |
0x27 |
CLOSED |
OPEN |
OPEN |
0x26 |
OPEN |
CLOSED |
OPEN |
0x25 |
CLOSED |
CLOSED |
OPEN |
0x24 |
OPEN |
OPEN |
CLOSED |
0x23 |
CLOSED |
OPEN |
CLOSED |
0x22 |
OPEN |
CLOSED |
CLOSED |
0x21 |
CLOSED |
CLOSED |
CLOSED |
0x20 |
Если адрес неизвестен – используйте I2C сканер.
Подключение: GND к GND, VCC к +5V, SDA к A4, SCL к A5. Рекомендуются подтягивающие резисторы 4.7 кОм.
Подсветка:
Замкните перемычку для включения подсветки. Яркость не регулируется через I2C без модификации.
Все I2C-платы используют чип PCF8574. Без „A“: адреса 0x20-0x27. С „A“: адреса 0x38-0x3F.
Схема подключения
Hello World (I2C)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print("Hello World!");
}
void loop()
{
;
}
Если в конструкторе указать только адрес без пинов:
LiquidCrystal_I2C lcd(0x38); // Set the LCD I2C address
Библиотека использует маппинг по умолчанию для LCDXIO, отличающийся от обычных адаптеров – поэтому пины нужно указывать.
Бледные блоки с мигающим блоком = неправильные пины
Управление подсветкой (I2C)
Команды lcd.backlight() и lcd.noBacklight(). Скетч с мигающей подсветкой:
// Simple 20x4 LCD with I2C adapter test
//
// Displays Hello World on the LCD and then flashes the back light on and off
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print("Hello World!");
delay(2000);
}
void loop()
{
lcd.noBacklight();
delay(1000);
lcd.backlight();
delay(1000);
}
Карта памяти 20x4 LCD
При переполнении: строка 1 -> строка 3, строка 2 -> строка 4.
Скетч-демонстрация переполнения:
// Demonstration of overflow on a 20x4 LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print("This is a large piece of text that overflows across four lines on the LCD.");
}
void loop()
{
;
}
Пользовательские символы
8 ячеек памяти для пользовательских символов (сетка 5x8). Создание через createChar(), отображение через lcd.write().
// Custom characters
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(20, 4);
byte chr1[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
B00000
};
byte chr2[8] = {
B00000,
B10001,
B00000,
B00000,
B01110,
B10001,
B00000,
B00000
};
lcd.createChar(1, chr1);
lcd.createChar(2, chr2);
lcd.setCursor(0, 0); lcd.write(1);
lcd.setCursor(2, 0); lcd.write(2);
}
void loop()
{
;
}
Хотя одновременно можно создать только 8 символов, их можно переопределить в любое время «на лету».
Онлайн-генераторы
Крупные шрифты:
Создатель: digimike (Arduino Forum)
Демо:
Библиотека Extensible hd44780 LCD
Скачать с GitHub. Включает диагностический скетч.
Заметки
Сброс Arduino не сбрасывает LCD.
clear()медленная. Заполнение пробелами быстрее.home()тоже медленная.Проблема подсветки на некоторых шилдах – hd44780 обходит программно.
Ссылки
8-Bit Guy – видео о ручном управлении HD44780 LCD без микропроцессора.