Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Autoscroll
Blink
Cursor
CustomCharacter
Display
HelloWorld
Scroll
SerialDisplay
SetCursor
TextDirection
Индикатор прогресса яркости светодиода
Библиотека LiquidCrystalRus с поддержкой кириллицы
Функции библиотеки LiquidCrystal
Визуальный редактор
Экран с I2C
Библиотека i2cdetect
Выводить информацию удобно на экран. Очень популярным решением является текстовый жидкокристаллический экран, знакомый нам по древним звонилкам. Для опытов я использовал простой текстовый экран 16×2 от компании МЭЛТ.
Я думал, что работать с такими экранами очень сложно, оказалось, что ничего страшного.
Краткое описание дисплея: LCD-дисплей MT-16S2H компании Мэлт служит для вывода текста с подсветкой. По изображению похож на дисплеи старых мобильных телефонов вроде Nokia 3310 или Siemens C35. Экран имеет 16 контактов для подведения питания и взаимодействия с управляющей электроникой. Для управления выводом дисплея возможно использовать только 6 из них. Дисплей выполнен на чипе, совместимом с HD44780, который является де-факто стандартом для LCD-экранов.
Процесс подключения очень хорошо описан на сайте Амперки - Подключение текстового экрана к Arduino
Основная особенность дисплея - необычная нумерация выходов. Всего их 16, но идут они не по порядку, а весьма нетривиальным способом. И только три из них подписаны: 14, 1 и 16. Но, оказывается, это вполне достаточно. Я помогу вам разобраться.
14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 16 | 15 |
Таблица контактов
Контакт | Обозначение | Назначение |
---|---|---|
1 | Vss | Заземление |
2 | Vdd | Питание 5В |
3 | Vo | Регулировка контрастности (потенциометр) |
4 | Rs | Выбор режим (командный или отображения данных) |
5 | RW | Чтение/Запись |
6 | En | Готовность данных |
7 | D0 | Линия передачи данных 0 (не используется) |
8 | D1 | Линия передачи данных 1 (не используется) |
9 | D2 | Линия передачи данных 2 (не используется) |
10 | D3 | Линия передачи данных 3 (не используется) |
11 | D4 | Линия передачи данных 4 |
12 | D5 | Линия передачи данных 5 |
13 | D6 | Линия передачи данных 6 |
14 | D7 | Линия передачи данных 7 |
15 | A | Анод подсветки |
16 | K | Катод подсветки |
Вкратце, чтобы самому не забыть. Втыкаем дисплей своими 16 ножками в макетную плату. Подводим к рельсам питания макетки питание +5 В и землю с Arduino.
Фоновая подсветка дисплея — это отдельный контур, не связанный с остальным. Включить её можно подав +5 В на 15-й контакт дисплея и подключив 16-й контакт к земле. Соединив эти два контакта с соответствующими рельсами, можно включить Arduino и увидеть, что дисплей засветился.
Далее необходимо подключить цепь, отвечающую за отображение символов. Для этого предназначены контакты 1, 2 и 3 на дисплее. Перед подключением отключите Arduino от питания.
Первый — это земля. Соедините его с рельсой земли.
Второй — питание. Соедините его с рельсой +5 В.
Третий — контрастность. Для получение максимально контрастного изображения соедините его с рельсой земли. Вы можете подать на этот контакт произвольное напряжение от 0 до 5 В, чем оно выше, тем тусклее будет изображение, но вместе с этим снизится энергопотребление. Для возможности плавной регулировки контрастности можете подать на этот контакт выходной сигнал потенциометра.
После подключения, если включить Arduino, вы можете увидеть прямоугольные знакоместа. В зависимости от комбинации цветов текста и подсветки они могут быть как яркими и хорошо заметными, так и едва заметными. Это нормально: в любом случае, текст будет смотреться отлично.
Для коммуникации между Arduino и экраном необходимо использовать несколько линий взаимодействия:
2 или 3 для командования дисплеем
4 или 8 для передачи данных (кодов символов и команд)
Таким образом занятыми окажутся от 6-ти до 11-ти контактов от обоих устройств. Если вам не требуется считывать с дисплея, что подходит под большинство сценариев использования, для команд понадобится 2 линии.
Если скорость обновления данных так же не является проблемой, для передачи данных достаточно 4-х линий.
Итак, для подключения дисплея достаточно использовать 6 линий, 6 контактов на Arduino. Рассмотрим именно этот сценарий. Как упоминалось, нам не за чем считывать с дисплея, мы будем в него только писать. Поэтому соединим 5-й контакт дисплея, который отвечает за выбор чтение/запись с рельсой земли. Это означает «всегда писать».
Затем, соединяем Arduino и экран нашими 6-ю линиями коммуникации. Какие именно контакты будут выбраны на Arduino не имеет значения: мы зададим их в программе, но для примера была выбрана такая конфигурация:
4-й контакт дисплея — 4-й контакт Arduino. Это линия адресного сигнала. Известная как A0 или RS. В зависимости от того, 0 она или 1, дисплей понимает имеем ли мы на линии данных команду вроде «передвинуть курсор» или код символа для отображения.
6-й контакт дисплея — 5-й контакт Arduino. Это линия разрешения доступа к данным. Известная, как E или Enable. Когда эта линия становится единицей, дисплей исполняет команду или выводит символ с линии данных.
11-й, 12-й, 13-й, 14-й контакт дисплея — 10-й, 11-й, 12-й, 13-й контакт Arduino соответственно. Это линии данных. Известные как D4, D5, D6, D7.
Существует стандартная библиотека LiquidCrystal для работы с текстовыми жидкокристаллическими экранами.
В Arduino IDE выбираем меню Sketch | Import Library | LiquidCrystal. В начало скетча будет вставлена строка.
#include <LiquidCrystal.h>
Это удобно, если вы позабыли правильное написание библиотеки и убережёт от опечаток.
Также в состав Arduino IDE входят несколько примеров работы с библиотекой: File | Examples | LiquidCrystal.
Единственное, что вам нужно сделать - это менять строчку инициализации контактов в соответствии с вашими соединениями.
// в примере
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// заменить на
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
А ещё лучше использовать константы.
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Простейшая программа для вывода "Hello World"
// Подключаем стандартную библиотеку LiquidCrystal
#include <LiquidCrystal.h>
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
void setup()
{
// устанавливаем размер (количество столбцов и строк) экрана
lcd.begin(16, 2);
// печатаем первую строку
lcd.print("Hello world!");
// устанавливаем курсор в колонку 0, строку 1. То есть на
// самом деле это вторая строка, т.к. нумерация начинается с нуля
lcd.setCursor(0, 1);
// печатаем вторую строку
lcd.print("Hello Kitty");
}
void loop()
{
}
В данном случае функция loop() нам не требуется, поэтому оставляем её пустой.
Нужно помнить, что фуккция print() не проверяет длину строк, поэтому самостоятельно следите за своими данными.
Рассмотрим поставляемые примеры.
Бегущая строка. Выводится первая строка, затем вторая.
#include <LiquidCrystal.h>
// используйте свои значения
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
}
void loop() {
// устанавливаем курсор в позицию (0,0):
lcd.setCursor(0, 0);
// выводим цифры от 0 до 9:
for (int thisChar = 0; thisChar < 10; thisChar++) {
lcd.print(thisChar);
delay(500);
}
// устанавливаем курсор в (16,1):
lcd.setCursor(16, 1);
// включаем автоматическую прокрутку
lcd.autoscroll();
// печатаем от 0 до 9:
for (int thisChar = 0; thisChar < 10; thisChar++) {
lcd.print(thisChar);
delay(500);
}
// выключаем автоматическую прокрутку
lcd.noAutoscroll();
// очищаем экран для следующей итерации
lcd.clear();
}
Выводим строку hello, world! и мигающий курсор в виде знакоместа.
#include <LiquidCrystal.h>
// используйте свои значения
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
// выводим сообщение
lcd.print("hello, world!");
}
void loop() {
// Выключаем мигающий курсор
lcd.noBlink();
delay(3000);
// Включаем мигающий курсор
lcd.blink();
delay(3000);
}
Выводим строку hello, world! и мигающий символ в виде значка подчёркивания.
#include <LiquidCrystal.h>
// используйте свои значения
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
// выводим сообщение
lcd.print("hello, world!");
}
void loop() {
// Выключаем курсор
lcd.noCursor();
delay(500);
// Включаем курсор
lcd.cursor();
delay(500);
}
Выводим собственные символы: сердечко, смайлик. Небольшая анимация человечка.
#include <LiquidCrystal.h>
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// сердечко
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
// смайлик
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
byte frownie[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b00000,
0b01110,
0b10001
};
byte armsDown[8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp[8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
void setup() {
lcd.begin(16, 2);
// создаём новый символ сердечка
lcd.createChar(0, heart);
// создаём новый символ смайлика
lcd.createChar(1, smiley);
// создаём новый символ
lcd.createChar(2, frownie);
// создаём новый символ
lcd.createChar(3, armsDown);
// создаём новый символ
lcd.createChar(4, armsUp);
// устанавливаем курсор в левый верхний угол
lcd.setCursor(0, 0);
// выводим сообщение
lcd.print("I ");
lcd.write(byte(0)); // when calling lcd.write() '0' must be cast as a byte
lcd.print(" Arduino! ");
lcd.write((byte)1);
}
void loop() {
// read the potentiometer on A0:
int sensorReading = analogRead(A0);
// map the result to 200 - 1000:
int delayTime = map(sensorReading, 0, 1023, 200, 1000);
// set the cursor to the bottom row, 5th position:
lcd.setCursor(4, 1);
// draw the little man, arms down:
lcd.write(3);
delay(delayTime);
lcd.setCursor(4, 1);
// draw him arms up:
lcd.write(4);
delay(delayTime);
}
Выводим мигающий текст.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop() {
// выключаем дисплей
lcd.noDisplay();
delay(500);
// включаем дисплей
lcd.display();
delay(500);
}
Выводим на первой строке сообщение, а на второй время в секундах с момента запуска.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop() {
// Устанавливаем курсор в позицию столбец 0, ряд 1
// (напоминаю, что ряд 1 это вторая строка дисплея)
lcd.setCursor(0, 1);
// выводим число секунд с запуска скетча
lcd.print(millis() / 1000);
}
Выводим бегущую строку, которая движется вправо и влево.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
lcd.print("hello, world!");
delay(1000);
}
void loop() {
// сдвигаем на 13 позиций (длина строки) влево
for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
// сдвиг на одну позицию
lcd.scrollDisplayLeft();
delay(150);
}
// сдвиг на 29 позиций вправо (длина строки + длина дисплея)
for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
// сдвиг на одну позицию вправо
lcd.scrollDisplayRight();
delay(150);
}
// сдвиг на 16 позиций (длина дисплея + длина строки) влево
// чтобы вернуть текст в центр
for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
lcd.scrollDisplayLeft();
delay(150);
}
delay(1000);
}
Вводим текст в Serial Monitor, чтобы увидеть его на дисплее.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
delay(100);
// очистим экран
lcd.clear();
// считываем все символы
while (Serial.available() > 0) {
// выводим символы на экран
lcd.write(Serial.read());
}
}
}
Выводим символы алфавита во все доступные позиции экрана.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// мы не меняем эти значения, но вы можете изменить,
// если хотите в своих примерах
const int numRows = 2;
const int numCols = 16;
void setup() {
lcd.begin(numCols, numRows);
}
void loop() {
// проходим в цикле через символы ASCII от 'a' до 'z':
for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) {
// проходим все столбцы
for (int thisRow = 0; thisRow < numRows; thisRow++) {
// проходим все ряды
for (int thisCol = 0; thisCol < numCols; thisCol++) {
// устанавливаем позицию курсора
lcd.setCursor(thisCol, thisRow);
// выводим символ
lcd.write(thisLetter);
delay(200);
}
}
}
}
Выводим символы в разных направлениях, используя функции leftToRight() и rightToLeft().
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int thisChar = 'a';
void setup() {
lcd.begin(16, 2);
// включаем курсор
lcd.cursor();
}
void loop() {
// изменяем направление на символе 'm':
if (thisChar == 'm') {
// идём вправо до следующего символа
lcd.rightToLeft();
}
// меняем направление на 's':
if (thisChar == 's') {
// идём влево до следующего символа
lcd.leftToRight();
}
// сбрасываем настройки на 'z':
if (thisChar > 'z') {
// идём в (0,0):
lcd.home();
// начинаем сначала с позиции 0
thisChar = 'a';
}
// печатаем символ
lcd.write(thisChar);
// ждём секунду
delay(1000);
// следующий символ
thisChar++;
}
Создадим проект, в котором будем получать данные с потенциометра и выводить получаемые данные на экран в виде индикатора прогресса. Также будем менять яркость светодиода в соответствии с показаниями. Так как показания варьируются от 0 до 1024, необходимо преобразовать значения в пределах от 0 до 256 для светодиода и от 0 до 17 для экрана. Сам индикатор состоит из полностью закрашенного прямоугольника. Если выводить подобные прямоугольники с начала строки, то будет похоже на индикатор прогресса.
Потенциометр подключаем к выводу A0, светодиод к выводу 6. Подключение ЖК-дисплея стандартное, как описано в начале статьи.
// Подключаем стандартную библиотеку LiquidCrystal
#include
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
int potPin = A0; // потенциометр
int ledPin = 6; // светодиод на выводе с PWM
int potValue = 0; // значение от потенциометра
int brightness = 0; // конвертируем в яркость
int progress = 0; // индикатор прогресса
//int i = 0; // для цикла
//progress bar character for brightness
byte pBar[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
void setup()
{
Serial.begin(9600);
// устанавливаем размер (количество столбцов и строк) экрана
lcd.begin(16, 2);
// светодиод
pinMode(ledPin, OUTPUT);
// Выводим сообщение в первой строчке
lcd.print(" LED Brightness");
// Создаем символы для индикатора прогресса
lcd.createChar(0, pBar);
}
void loop()
{
// ощищаем экран
lcd.clear();
// выводим сообщение в первой строчке
lcd.print(" LED Brightness");
// устанавливаем курсор на второй строчке
lcd.setCursor(0, 1);
// считываем показания с потенциометра
potValue = analogRead(potPin);
// конвертируем значения в яркость от 0 до 255
brightness = map(potValue, 0, 1024, 0, 255);
// меняем яркость светодиода в зависимости от значений от потенциметра
analogWrite(ledPin, brightness);
// конвертируем значения яркость в проценты для индикатора от 0 до 17
progress = map(brightness, 0, 255, 0, 17);
// выводим индикатор
for (int i = 0; i < progress; i++)
{
lcd.setCursor(i, 1);
lcd.write(byte(0));
}
// пауза
delay(750);
}
Не все дисплеи имеют кириллицу. Дисплей от Мэлт поддерживает русский язык. Но просто напечатать текст на русском не получится. Так например, букве «Я» соответствует код B1 в шестнадцатиричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
lcd.print("\xB1ndex");
Можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x, он считывает за ним все символы, которые могут являться разрядами шестнадцатиричной системы даже если их больше двух. Из-за этого вы не можете просто использовать символы из диапазона 0-9, a-f следом за двузначным кодом символа: это вызовет ошибку компиляции. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются. Так, если вы хотите написать «Яeee»:
lcd.print("\xB1eee"); // ошибка
lcd.print("\xB1""eee"); // правильно
Полную таблицу символов с кодами можно найти в документации к экрану.
Я на скорую руку написал скрипт на JavaScript, который конвертирует слова в нижнем регистре в нужные последовательности. Если в слове встречаются повторяющие буквы, то нажмите на кнопку несколько раз.
Совсем не обязательно мучиться с байтами, чтобы вывести русский символ. Существует библиотека LiquidCrystalRus, которая поддерживает кириллицу. Исходники лежат на Гитхабе. Скачайте файл LiquidCrystalRus-1.6.0.zip и распакуйте его в папку libraries. У вас получится что-то типа D:\Arduino\libraries\LiquidCrystalRus. В папке находятся файлы библиотеки и папка examples, содержащая три скетча. После этого примеры будут доступны из Arduino IDE. Запустите пример File | Examples | LiquidCrystalRus | HelloWorldRus и убедитесь, что экран способен выводить русские символы.
#include <LiquidCrystalRus.h>
// initialize the library with the numbers of the interface pins
LiquidCrystalRus lcd(4, 5, 10, 11, 12, 13);
void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Котёнок по имени!");
lcd.setCursor(5, 1);
lcd.print("Гав");
}
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);
}
Функция autoscroll() включает автоматическую прокрутку экрана жидкокристаллического индикатора и заставляет каждый вывод символа на экран индикатора перемещать предыдущие символы на одно знакоместо. Если текущее направление вывода символов слева направо (значение по умолчанию) — экран индикатора прокручивается влево; если текущее направление вывода символов справа налево — экран индикатора прокручивается вправо. Это производит эффект вывода каждого нового символа в одно и то же знакоместо на экране жидкокристаллического индикатора.
Синтаксис:
lcd.autoscroll()
Параметр:
Функция begin() определяет размерность (количество символов в ширину и высоту) индикатора.
Синтаксис:
lcd.begin(cols, rows)
Параметры:
lcd.begin(16, 2);
Функция blink() выводит на экран жидкокристаллического индикатора мигающий курсор. Если она используется в комбинации с функцией cursor(), результат будет зависеть от конкретного индикатора.
Синтаксис:
lcd.blink()
Параметр:
Функция clear() очищает экран жидкокристаллического индикатора и располагает курсор в верхнем левом углу.
Синтаксис:
lcd.clear()
Параметр:
Функция createChar() создаёт пользовательский символ (глиф) для использования на жидкокристаллическом дисплее. Поддерживаются до восьми символов 5×8 пикселов (нумерация с 0 до 7). Создание каждого пользовательского символа определяется массивом из восьми байтов — один байт для каждой строки. Пять младших значащих битов каждого байта определяют пикселы в этой строке. Чтобы вывести пользовательский символ на экран, используйте функцию write() с номером символа в качестве параметра.
Синтаксис:
lcd.createChar(num, data)
Параметры:
Примеры создания собственных символов ниже.
Функция cursor() выводит на экран жидкокристаллического индикатора курсор — подчёркивание знакоместа в позиции, в которую будет записан следующий символ.
Синтаксис:
lcd.cursor()
Параметр:
Функция display() включает жидкокристаллический индикатор после того, как он был выключен функцией noDisplay(). Эта функция восстанавливает текст (и курсор), который был на дисплее.
Синтаксис:
lcd.display()
Параметр:
Функция home() располагает курсор в верхнем левом углу жидкокристаллического индикатора. Используется для определения начального положения при выводе последовательного текста на экран индикатора. Чтобы ещё и очистить экран индикатора, используйте вместо этой функции функцию clear().
Синтаксис:
lcd.home()
Параметр:
Функция leftToRight() устанавливает направление вывода символов на экран жидкокристаллического индикатора слева направо (значение по умолчанию). Это означает, что последующие символы, выводимые на экран индикатора, пойдут слева направо, но не повлияют на выведенный ранее текст.
Синтаксис:
lcd.leftTorRight();
Параметр:
Конструктор LiquidCrystal() создаёт переменную типа LiquidCrystal. Индикатором можно управлять, используя 4 или 8 линий данных. Для подключения по 4-м линиям пропустите контакты от D0 до D3 и оставьте эти линии неподключёнными. Контакт RW может быть соединён с "землёй" вместо соединения с контактом платы Arduino. Если в вашей схеме так — пропустите этот параметр функции.
Синтаксис:
LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
Параметры:
Функция noAutoscroll() выключает автоматическую прокрутку экрана жидкокристаллического индикатора.
Синтаксис:
lcd.noAutoscroll()
Параметр:
Функция noBlink() выключает мигающий курсор на экране жидкокристаллического индикатора.
Синтаксис:
lcd.noBlink()
Параметр:
Функция noCursor() скрывает курсор с экрана жидкокристаллического индикатора.
Синтаксис:
lcd.noCursor()
Параметр:
Функция noDisplay() выключает жидкокристаллический индикатор без потери отображаемой на нем информации.
Синтаксис:
lcd.noDisplay()
Параметр:
Функция print() печатает текст на жидкокристаллическом индикаторе.
Синтаксис функции:
lcd.print(data)
lcd.print(data, BASE)
Параметры:
Функция rightToLeft() устанавливает направление вывода символов на экран жидкокристаллического индикатора справа налево (значение по умолчанию — слева направо). Это означает, что последующие символы, выводимые на экран индикатора, пойдут справа налево, но не повлияют на выведенный ранее текст.
Синтаксис:
lcd.rightToLeft()
Параметр:
Функция scrollDisplayLeft() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо влево.
Синтаксис:
lcd.scrollDisplayLeft()
Параметр:
Функция scrollDisplayRight() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо вправо.
Синтаксис:
lcd.scrollDisplayRight()
Параметр:
Функция setCursor() позиционирует курсор жидкокристаллического индикатора, т.е. устанавливает положение, в котором на его экран будет выведен последующий текст.
Синтаксис:
lcd.setCursor(col, row)
Параметры:
Функция write() записывает символ в жидкокристаллический индикатор.
Синтаксис:
lcd.write(data)
Параметры:
Пример:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
lcd.write(Serial.read());
}
Собственные символы рисуются с помощью функции createChar(). Пример, предлагаемый на сайте Arduino:
// Рисуем смайлик
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
void setup() {
lcd.createChar(0, smiley);
lcd.begin(16, 2);
lcd.write(byte(0));
}
void loop() {}
Вы можете нарисовать несколько собственных символов и вывести их на экран.
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
// degree centigrade
byte newChar1[8] = {
B01000,
B10100,
B01000,
B00011,
B00100,
B00100,
B00011,
B00000
};
// degree fahrenheit
byte newChar2[8] = {
B01000,
B10100,
B01000,
B00011,
B00100,
B00111,
B00100,
B00000
};
// arrow right
byte newChar3[8] = {
B00000,
B00100,
B00010,
B11111,
B00010,
B00100,
B00000,
B00000
};
// arrow left
byte newChar4[8] = {
B00000,
B00100,
B01000,
B11111,
B01000,
B00100,
B00000,
B00000
};
// diameter sign (ø)
byte newChar5[8] = {
B00000,
B01101,
B10010,
B10101,
B01001,
B10110,
B00000,
B00000
};
// boldface "h"
byte newChar6[8] = {
B11000,
B11000,
B11110,
B11111,
B11011,
B11011,
B11011,
B00000
};
// ohm sign
byte newChar7[8] = {
B00000,
B01110,
B10001,
B10001,
B10001,
B01010,
B11011,
B00000
};
// micro sign
byte newChar8[8] = {
B00000,
B00000,
B00000,
B10010,
B10010,
B10010,
B11100,
B10000
};
int i = 0;
void setup() {
lcd.createChar(0, newChar1);
lcd.createChar(1, newChar2);
lcd.createChar(2, newChar3);
lcd.createChar(3, newChar4);
lcd.createChar(4, newChar5);
lcd.createChar(5, newChar6);
lcd.createChar(6, newChar7);
lcd.createChar(7, newChar8);
lcd.begin(16, 2);
for(int n = 0; n < 8; n++)
{
lcd.setCursor(n*2, 0);
lcd.write(n);
}
}
void loop() {
}
Редактор для создания собственных символов для дисплеев HD44780
Щёлкайте по квадратам для генерации кода.byte customChar[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 };
LCD Module | Arduino Pin |
---|---|
RS | |
RW | GND |
Enable | |
D4 | |
D5 | |
D6 | |
D7 |
#include <LiquidCrystal.h>
// initialize the library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte customChar[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 };
void setup() { // create a new custom character lcd.createChar(0, customChar); // set up number of columns and rows lcd.begin(16, 2); // print the custom char to the lcd lcd.write((uint8_t)0); } void loop() { }
Источник генератора: https://omerk.github.io/lcdchargen/
Стандартный экран неудобно подключать, слишком много контактов задействовано в сборке. Существует альтернативный вариант, когда к экрану прилагается дополнительный модуль. В этом случае используется только четыре контакта (питание, земля и два аналоговых порта).
LED | Arduino Uno
------------------
GND | GND
VCC | 5V
SDA | A4
SCL | A5
На других микроконтроллерах сигнальные выводы отличаются (Leonardo: SDA-D2, SCL-D3; MEGA, ADK, DUE: SDA-D20, SCL-D21).
Модуль может поставляться отдельно и его нужно припаять самостоятельно. Но проще сразу приобрести готовый собранный модуль с экраном. Встречаются различные модификации экранов - 4х20, 2х16.
Купить на AliExpress ЖК-дисплей 1602 Синяя подсветка с адаптером
Стандартная библиотека не подойдёт. Нужно использовать библиотеку с поддержкой I2C LiquidCrystal I2C by Frank de Brabander (GitHub).
После установки библиотеки будут доступны несколько примеров: CustomChars, HelloWorld, SerialDisplay.
Если при запуске примера не видны символы на экране, то попробуйте покрутить винт на модуле для изменения контрастности. У меня был именно такой случай.
В примерах важно использовать правильный адрес. Самый типичный пример - использовать адрес 0х27.
// Задаем адрес и размерность дисплея.
LiquidCrystal_I2C lcd(0x27, 20, 4); // для экрана 20х4
LiquidCrystal_I2C lcd(0x27, 16, 2); // для экрана 16х2
Если у вас попался нестандартный дисплей, то можно узнать используемый адрес устройства при помощи библиотеки i2cdetect, доступный через менеджер библиотек.
После установки библиотеки запустите прилагаемый к нему пример и через последовательный монитор увидите нужный адрес.