Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека LiquidCrystal

LCD

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. Но, оказывается, это вполне достаточно. Я помогу вам разобраться.

14131211 10987 6543 211615

Таблица контактов

КонтактОбозначениеНазначение
1VssЗаземление
2VddПитание 5В
3VoРегулировка контрастности (потенциометр)
4RsВыбор режим (командный или отображения данных)
5RWЧтение/Запись
6EnГотовность данных
7D0Линия передачи данных 0 (не используется)
8D1Линия передачи данных 1 (не используется)
9D2Линия передачи данных 2 (не используется)
10D3Линия передачи данных 3 (не используется)
11D4Линия передачи данных 4
12D5Линия передачи данных 5
13D6Линия передачи данных 6
14D7Линия передачи данных 7
15AАнод подсветки
16KКатод подсветки

Вкратце, чтобы самому не забыть. Втыкаем дисплей своими 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() не проверяет длину строк, поэтому самостоятельно следите за своими данными.

Рассмотрим поставляемые примеры.

Autoscroll

Бегущая строка. Выводится первая строка, затем вторая.


#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);
}

Cursor

Выводим строку 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);
}

CustomCharacter

Выводим собственные символы: сердечко, смайлик. Небольшая анимация человечка.


#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);
}

Display

Выводим мигающий текст.


#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);
}

HelloWorld

Выводим на первой строке сообщение, а на второй время в секундах с момента запуска.


#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);
}

Scroll

Выводим бегущую строку, которая движется вправо и влево.


#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);

}

SerialDisplay

Вводим текст в 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());
    }
  }
}

SetCursor

Выводим символы алфавита во все доступные позиции экрана.


#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);
      }
    }
  }
}

TextDirection

Выводим символы в разных направлениях, используя функции 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);
}
Progressbar

Кириллица

Не все дисплеи имеют кириллицу. Дисплей от Мэлт поддерживает русский язык. Но просто напечатать текст на русском не получится. Так например, букве «Я» соответствует код B1 в шестнадцатиричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:


lcd.print("\xB1ndex");

Можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x, он считывает за ним все символы, которые могут являться разрядами шестнадцатиричной системы даже если их больше двух. Из-за этого вы не можете просто использовать символы из диапазона 0-9, a-f следом за двузначным кодом символа: это вызовет ошибку компиляции. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются. Так, если вы хотите написать «Яeee»:


lcd.print("\xB1eee"); // ошибка
lcd.print("\xB1""eee"); // правильно

Полную таблицу символов с кодами можно найти в документации к экрану.

Я на скорую руку написал скрипт на JavaScript, который конвертирует слова в нижнем регистре в нужные последовательности. Если в слове встречаются повторяющие буквы, то нажмите на кнопку несколько раз.



Библиотека LiquidCrystalRus с поддержкой кириллицы

Совсем не обязательно мучиться с байтами, чтобы вывести русский символ. Существует библиотека 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);
}

Функции библиотеки LiquidCrystal

autoscroll()

Функция autoscroll() включает автоматическую прокрутку экрана жидкокристаллического индикатора и заставляет каждый вывод символа на экран индикатора перемещать предыдущие символы на одно знакоместо. Если текущее направление вывода символов слева направо (значение по умолчанию) — экран индикатора прокручивается влево; если текущее направление вывода символов справа налево — экран индикатора прокручивается вправо. Это производит эффект вывода каждого нового символа в одно и то же знакоместо на экране жидкокристаллического индикатора.

Синтаксис:


lcd.autoscroll()

Параметр:

  • lcd — переменная типа LiquidCrystal

begin()

Функция begin() определяет размерность (количество символов в ширину и высоту) индикатора.

Синтаксис:


lcd.begin(cols, rows)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • cols — количество символов в строке
  • rows — количество строк

lcd.begin(16, 2);

Функция blink() выводит на экран жидкокристаллического индикатора мигающий курсор. Если она используется в комбинации с функцией cursor(), результат будет зависеть от конкретного индикатора.

Синтаксис:


lcd.blink()

Параметр:

  • lcd — переменная типа LiquidCrystal

clear()

Функция clear() очищает экран жидкокристаллического индикатора и располагает курсор в верхнем левом углу.

Синтаксис:


lcd.clear()

Параметр:

  • lcd — переменная типа LiquidCrystal

createChar()

Функция createChar() создаёт пользовательский символ (глиф) для использования на жидкокристаллическом дисплее. Поддерживаются до восьми символов 5×8 пикселов (нумерация с 0 до 7). Создание каждого пользовательского символа определяется массивом из восьми байтов — один байт для каждой строки. Пять младших значащих битов каждого байта определяют пикселы в этой строке. Чтобы вывести пользовательский символ на экран, используйте функцию write() с номером символа в качестве параметра.

Синтаксис:


lcd.createChar(num, data)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • num — номер создаваемого символа (0 to 7)
  • data — данные символьных пикселов

Примеры создания собственных символов ниже.

cursor()

Функция cursor() выводит на экран жидкокристаллического индикатора курсор — подчёркивание знакоместа в позиции, в которую будет записан следующий символ.

Синтаксис:


lcd.cursor()

Параметр:

  • lcd — переменная типа LiquidCrystal

display()

Функция display() включает жидкокристаллический индикатор после того, как он был выключен функцией noDisplay(). Эта функция восстанавливает текст (и курсор), который был на дисплее.

Синтаксис:


lcd.display()

Параметр:

  • lcd — переменная типа LiquidCrystal

home()

Функция home() располагает курсор в верхнем левом углу жидкокристаллического индикатора. Используется для определения начального положения при выводе последовательного текста на экран индикатора. Чтобы ещё и очистить экран индикатора, используйте вместо этой функции функцию clear().

Синтаксис:


lcd.home()

Параметр:

  • lcd — переменная типа LiquidCrystal

leftToRight()

Функция leftToRight() устанавливает направление вывода символов на экран жидкокристаллического индикатора слева направо (значение по умолчанию). Это означает, что последующие символы, выводимые на экран индикатора, пойдут слева направо, но не повлияют на выведенный ранее текст.

Синтаксис:


lcd.leftTorRight();

Параметр:

  • lcd — переменная типа LiquidCrystal

LiquidCrystal()

Конструктор 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)

Параметры:

  • rs — номер контакта платы Arduino, который соединяется с контактом RS жидкокристаллического индикатора
  • rw — номер контакта платы Arduino, который соединяется с контактом RW жидкокристаллического индикатора (опционально)
  • enable — номер контакта платы Arduino, который соединяется с контактом ENABLE жидкокристаллического индикатора
  • d0, d1, d2, d3, d4, d5, d6, d7 — номера контактов платы Arduino, которые соединяются соответственно с контактами данных жидкокристаллического инди-катора. D0, D1, D2 И D3 опциональны — если они не задействованы, жидкокристаллический индикатор будет управляться только через 4 линии данных (D4, D5, D6, D7)

noAutoscroll()

Функция noAutoscroll() выключает автоматическую прокрутку экрана жидкокристаллического индикатора.

Синтаксис:


lcd.noAutoscroll()

Параметр:

  • lcd — переменная типа LiquidCrystal

Функция noBlink() выключает мигающий курсор на экране жидкокристаллического индикатора.

Синтаксис:


lcd.noBlink()

Параметр:

  • lcd — переменная типа LiquidCrystal

noCursor()

Функция noCursor() скрывает курсор с экрана жидкокристаллического индикатора.

Синтаксис:


lcd.noCursor()

Параметр:

  • lcd — переменная типа LiquidCrystal

noDisplay()

Функция noDisplay() выключает жидкокристаллический индикатор без потери отображаемой на нем информации.

Синтаксис:


lcd.noDisplay()

Параметр:

  • lcd — переменная типа LiquidCrystal

print()

Функция print() печатает текст на жидкокристаллическом индикаторе.

Синтаксис функции:


lcd.print(data)
lcd.print(data, BASE)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • data — данные для печати (тип char, byte, int, long или string)
  • BASE (опционально) — основание, по которому печатаются числа: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16)

rightToLeft()

Функция rightToLeft() устанавливает направление вывода символов на экран жидкокристаллического индикатора справа налево (значение по умолчанию — слева направо). Это означает, что последующие символы, выводимые на экран индикатора, пойдут справа налево, но не повлияют на выведенный ранее текст.

Синтаксис:


lcd.rightToLeft()

Параметр:

  • lcd — переменная типа LiquidCrystal

scrollDisplayLeft()

Функция scrollDisplayLeft() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо влево.

Синтаксис:


lcd.scrollDisplayLeft()

Параметр:

  • lcd — переменная типа LiquidCrystal

scrollDisplayRight()

Функция scrollDisplayRight() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо вправо.

Синтаксис:


lcd.scrollDisplayRight()

Параметр:

  • lcd — переменная типа LiquidCrystal

setCursor()

Функция setCursor() позиционирует курсор жидкокристаллического индикатора, т.е. устанавливает положение, в котором на его экран будет выведен последующий текст.

Синтаксис:


lcd.setCursor(col, row)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • col — номер знакоместа в ряду (начиная с 0 для первого знакоместа)
  • row — номер ряда (начиная с 0 для первого ряда)

write()

Функция write() записывает символ в жидкокристаллический индикатор.

Синтаксис:


lcd.write(data)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • 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

Код для скетча Arduino

#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/

Экран с I2C

Стандартный экран неудобно подключать, слишком много контактов задействовано в сборке. Существует альтернативный вариант, когда к экрану прилагается дополнительный модуль. В этом случае используется только четыре контакта (питание, земля и два аналоговых порта).


 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.

I2C

Купить на AliExpress ЖК-дисплей 1602 Синяя подсветка с адаптером

Стандартная библиотека не подойдёт. Нужно использовать библиотеку с поддержкой I2C LiquidCrystal I2C by Frank de Brabander (GitHub).

После установки библиотеки будут доступны несколько примеров: CustomChars, HelloWorld, SerialDisplay.

Если при запуске примера не видны символы на экране, то попробуйте покрутить винт на модуле для изменения контрастности. У меня был именно такой случай.

Библиотека i2cdetect

В примерах важно использовать правильный адрес. Самый типичный пример - использовать адрес 0х27.


// Задаем адрес и размерность дисплея.
LiquidCrystal_I2C lcd(0x27, 20, 4); // для экрана 20х4
LiquidCrystal_I2C lcd(0x27, 16, 2); // для экрана 16х2  

Если у вас попался нестандартный дисплей, то можно узнать используемый адрес устройства при помощи библиотеки i2cdetect, доступный через менеджер библиотек.

После установки библиотеки запустите прилагаемый к нему пример и через последовательный монитор увидите нужный адрес.

Дополнительные материалы

Шар судьбы

Реклама