1Описание FC-113 преобразователя последовательного интерфейса в параллельный
- Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
- R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
- Джампер J1 используется для включения подсветки дисплея.
- Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
- Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: «0» соответствует разрыву цепи, «1» – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.
I2C модуль FC-113 для подключения ЖК экрана
Генерация пользовательских символов для LCD
Если вы находите символы на дисплее неподходящими и неинтересными, вы можете создать свои собственные символы (глиф) для своего ЖК-дисплея. Пользовательские символы чрезвычайно полезны в том случае, когда вы хотите отобразить символ, который не является частью стандартного набора символов ASCII.
Как мы уже обсуждали ранее в этом руководстве, символ на дисплее формируется в матрице 5×8 пикселей, поэтому вам нужно определить свой пользовательский символ в этой матрице. Для определения символа необходимо использовать функцию createChar() библиотеки LiquidCrystal.
Для использования createChar() сначала необходимо назначить массив из 8 байт. Каждый байт (учитывается только 5 бит) в массиве определяет одну строку символа в матрице 5×8. В то время как нули и единицы в байте указывают, какие пиксели в строке должны быть включены, а какие-выключены.
Генератор символов LCD
Создание собственного символа до сих пор было непросто! Поэтому было создано небольшое приложение под названием «Генератор пользовательских символов» для LCD.
Вы видите синюю сетку ниже? Вы можете нажать на любой из 5 × 8 пикселей, чтобы установить/очистить этот конкретный пиксель. И когда вы нажимаете на пиксели, код для символа генерируется рядом с сеткой. Этот код может быть непосредственно использован в вашем скетче Arduino.
Единственным ограничением является то, что библиотека LiquidCrystal поддерживает только восемь пользовательских символов.
Следующий скриншот демонстрирует, как вы можете использовать эти пользовательские символы на дисплее.
// подключаем библиотеку LiquidCrystal: #include <LiquidCrystal.h> // Создаем LCD объект. Выводы: (rs, enable, d4, d5, d6, d7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // создадим несколько пользовательских символов byte Heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; byte Bell = { 0b00100, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100, 0b00000 }; byte Alien = { 0b11111, 0b10101, 0b11111, 0b11111, 0b01110, 0b01010, 0b11011, 0b00000 }; byte Check = { 0b00000, 0b00001, 0b00011, 0b10110, 0b11100, 0b01000, 0b00000, 0b00000 }; byte Speaker = { 0b00001, 0b00011, 0b01111, 0b01111, 0b01111, 0b00011, 0b00001, 0b00000 }; byte Sound = { 0b00001, 0b00011, 0b00101, 0b01001, 0b01001, 0b01011, 0b11011, 0b11000 }; byte Skull = { 0b00000, 0b01110, 0b10101, 0b11011, 0b01110, 0b01110, 0b00000, 0b00000 }; byte Lock = { 0b01110, 0b10001, 0b10001, 0b11111, 0b11011, 0b11011, 0b11111, 0b00000 }; void setup() { // инициализируем LCD и устанавливаем количество столбцов и строк: lcd.begin(16, 2); // создание нового символа lcd.createChar(0, Heart); // создание нового символа lcd.createChar(1, Bell); // создание нового символа lcd.createChar(2, Alien); // создание нового символа lcd.createChar(3, Check); // создание нового символа lcd.createChar(4, Speaker); // создание нового символа lcd.createChar(5, Sound); // создание нового символа lcd.createChar(6, Skull); // создание нового символа lcd.createChar(7, Lock); // Очищаем LCD дисплей lcd.clear(); // Печатаем сообщение на LCD. lcd.print("Custom Character"); } // Печатаем все пользовательские символы void loop() { lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(2, 1); lcd.write(byte(1)); lcd.setCursor(4, 1); lcd.write(byte(2)); lcd.setCursor(6, 1); lcd.write(byte(3)); lcd.setCursor(8, 1); lcd.write(byte(4)); lcd.setCursor(10, 1); lcd.write(byte(5)); lcd.setCursor(12, 1); lcd.write(byte(6)); lcd.setCursor(14, 1); lcd.write(byte(7)); }
После включения библиотеки нам нужно инициализировать пользовательский массив из восьми байтов.
byte Heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 };
В настройках мы должны создать пользовательский символ, используя функцию createChar(). Эта функция принимает два параметра. Первый — это число от 0 до 7, чтобы зарезервировать один из 8 поддерживаемых пользовательских символов. Второй параметр — это имя массива байтов.
// создание нового символа lcd.createChar(0, Heart);
Далее в цикле для отображения пользовательского символа мы используем функцию write(), а в качестве параметра мы используем номер символа, который мы зарезервировали.
// byte(0) покажет символ Heart (сердце). lcd.write(byte(0));
About LCD 16×2
Pinout
LCD has up to 16 pins. In the most common uses, we do NOT use all pins.
With the support of LiquidCrystal library, we even can use LCD WITHOUT knowing the meaning of these pins. However, if you are curious or want to know in-depth, let’s see these pins and their functionality:
-
GND pin needs to be connected to GND (0V).
-
VCC pin the power supply for the LCD, needs to be connected to VCC (5V).
-
Vo (LCD Contrast) pin controls the contrast and brightness of the LCD, can be connected to 5V (the highest contrast and brightness), or connected to a potentiometer (to adjust to the contrast and brightness)
-
RS (Register Select) pin There are two kinds of data that need to send to LCD: command (to control LCD) and data. These two are sent on the same data bus. RS pin tells the LCD whether the data on the data bus is the commands or the data.
-
If we want to send the command to control LCD, we need to set RS pin to LOW (like set the cursor to a specific location, clear the display …).
-
If we want to send the data to display on LCD, we need to set RS pin to HIGH.
-
-
R/W (Read/Write) pin is to select READ mode or WRITE mode.
-
If we want to read data from LCD, this pin needs to be set to HIGH.
-
If we want to send data to LCD, this pin needs to be set to LOW. Since we’re just using this LCD as an OUTPUT device, we’re going to tie this pin LOW.
-
-
EN (Enable) pin is used to enable the LCD. HIGH to enable the LCD, LOW to disable the LCD.
-
D0-D7 (Data Bus) pins carries data and command between Arduino and LCD. There are two modes to send data: 4-bit mode and 8-bit mode.
-
A-K (Anode & Cathode) pins are used to power the LCD backlight. A pin needs to be connected to VCC. K pin needs to be connected to GND.
4-bit mode and 8-bit mode
-
8-bit mode: 8 bits of a byte are sent at the same time in pin D0 to D7.
-
4-bit mode: 8 bits of a byte is sent two times, each time 4 bits in pin D4 to D7.
8-bit mode is faster than the 4-bit mode, but use more pins than 4-bit mode. The mode selection is performed at the initialization process by sending a command to LCD.
This tutorial uses 4-bit mode, which is the most common-used.
In this mode, LCD’s pins:
-
6 pins (RS, EN, D4, D5, D6, and D7) are connected to Arduino’s pin.
-
4 pins (D0, D1, D2, and D3) are NOT connected.
-
6 remaining pins are connected to GND/VCC or potentiometer.
LCD pin table in 4-bit mode
LCD PIN | CONNECTED TO | |
---|---|---|
01 | GND | GND |
02 | VCC | 5V |
03 | Vo | 5V or potentiometer’s pin |
04 | RS | An Arduino’s pin |
05 | R/W | GND |
06 | EN | An Arduino’s pin |
07 | D0 | NOT connected |
08 | D1 | NOT connected |
09 | D2 | NOT connected |
10 | D3 | NOT connected |
11 | D4 | An Arduino’s pin |
12 | D5 | An Arduino’s pin |
13 | D6 | An Arduino’s pin |
14 | D7 | An Arduino’s pin |
15 | A | 5V |
16 | K | GND |
LCD 16×2 includes 16 columns and 2 rows. the conlums and rows are indexed from 0.
How It Works
This section is the in-depth knowledge. DON’T worry if you don’t understand. Ignore this section if it overloads you, and come back in another day. Keep reading the next sections.
The process of sending data (to be displayed) to LCD:
- Arduino sets RS pin to HIGH (to select data register)
- Arduino writes data to D4 → D7 pins (data bus).
- LCD receives data on the data bus.
- LCD stores the received data in the data resistor since the RS pin is HIGH. Then, LCD displays the data on the screen
The process of sending command (to control) to LCD (e.g, blink LCD, set the cursor to a specific location, clear the display …):
- Arduino sets RS pin to LOW (to select command register)
- Arduino writes command to D4 → D7 pins (data bus).
- LCD receives data on the data bus.
- LCD stores the received data in the command resistor since the RS pin is LOW. Then, LCD takes action based on the value of the command.
Русификация LCD 1602 I2C дисплея
Перед загрузкой следующего скетча, необходимо установить библиотеку LCD_1602_RUS.h для русификации дисплея 1602 Ардуино. Архив с библиотекой можно скачать на нашем сайте на странице — Библиотеки для Ардуино. После установки библиотеки из архива загрузите в микроконтроллер небольшой пример с кодом для LCD, который значительно упростит для вас вывод кириллицы на дисплей.
Скетч с библиотекой LCD_1602_RUS.h
#include <Wire.h> // библиотека для управления устройствами по I2C #include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS LCD_1602_RUS LCD(0x27,16,2); // присваиваем имя LCD для дисплея void setup() { LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея LCD.setCursor(2,0); // ставим курсор на 3 символ первой строки LCD.print("РУСИФИКАЦИЯ!"); // печатаем символ на первой строке } void loop() { }
Подключение LCD 1602 к Arduino
Прежде чем мы приступим к загрузке скетча и отправке данных на дисплей, давайте подключим LCD 1602 к Arduino.
LCD дисплей имеет много контактов (16 контактов). Но, хорошая новость заключается в том, что не все эти контакты необходимы для нас, чтобы подключиться к Arduino.
Мы знаем, что есть 8 выводов данных, по которым передаются данные на дисплей. Но, ЖК-дисплеи на HD44780 разработаны таким образом, что мы можем общаться с ЖК-дисплеем, используя только 4 вывода данных (4-разрядный режим) вместо 8 (8-разрядный режим). Таким образом мы можем сэкономить 4 вывода Arduino!
Итак, что мы будем работать с LCD дисплеем, используя 4-битный режим, и, следовательно, нам нужно только 6 контактов: RS, EN, D7, D6, D5 и D4.
Теперь давайте подключим ЖК-дисплей к Arduino. Четыре контакта данных (D4-D7) дисплея подключаем к цифровым контактам Arduino #4, #5, #6, #7. Вывод EN подключим к Arduino вывод #2, а вывод RS к выводу #1.
Подключение 16-символьного ЖК-дисплея к Arduino UNO
Как вывести свой символ на LCD 1602
Вывести свой символ или кириллическую букву на дисплей поможет таблица знакогенератора (CGROM). Такой вид памяти в Ардуино, как CGRAM, может хранить собственные символы, но размер памяти ограничен и может вместить лишь 8 собственных символов. Один из нестандартных символов, который пригодится для создания домашней метеостанции — знак градуса. Давайте нарисуем символ.
Создаем свой символ для LCD дисплея 1602
Для начала возьмите листок бумаги и нарисуйте на нем таблицу, где будет 5 столбцов и 8 строчек. Далее заштрихуйте в таблице клеточки (смотри фото выше), которые должны высвечиваться на дисплее. Дело в том, что каждый символ на дисплее состоит из пикселей (5 пикселей в ширину и 8 пикселей в высоту). Далее представим наш символ в виде массива данных, состоящего из восьми элементов — восьми строк.
Распиновка 16х02 символов
Перед тем, приступить к сборке и написанию кода, давайте сначала взглянем на распиновку LCD 1602.
Профессиональный цифровой осциллограф
Количество каналов: 1, размер экрана: 2,4 дюйма, разрешен…
Подробнее
- GND — должен быть подключен к земле Arduino.
- VCC — это вывод питание для ЖК-дисплея, к которому мы подключаем 5-вольтовый контакт Arduino.
- Vo (LCD Contrast) — вывод контролирует контрастность и яркость ЖК-дисплея. Используя простой делитель напряжения с потенциометром, мы можем точно отрегулировать контрастность.
- RS (Register Select) — этот вывод позволяет Arduino сообщать ЖК-дисплею, отправляются команды или данные. В основном этот вывод используется для дифференциации команд от данных. Например, когда на выводе RS установлено значение LOW, мы отправляем команды на ЖК-дисплей (например, установить курсор в определенном месте, очистить дисплей, сдвинуть дисплей вправо и т. д.). Когда вывод RS установлено значение HIGH, мы отправляем данные/символы на ЖК-дисплей.
- R/W (Read/Write) — вывод предназначен для контроля того, что необходимо сделать — считать данные или передать их на ЖК-дисплй. Поскольку мы просто используем этот ЖК-дисплей в качестве устройства вывода, то достаточно на этот вывод подать HIGH уровень, тем самым мы перейдем в режим записи.
- EN (Enable) — вывод используется для включения дисплея. Это означает, что когда на этом выводе установлено значение LOW ЖК-дисплей не реагирует на то, что происходит с R/W, RS и линиями шины данных. Когда же на этом выводе HIGH ЖК-дисплей обрабатывает входящие данные.
- D0-D7 (Data Bus) — это выводы, по которым передаются 8-битные данные на дисплей. Например, если мы хотим отобразить символ «A» в верхнем регистре, мы отправляем на LCD дисплей 0100 0001 (в соответствии с таблицей ASCII) .
- AK (Anode & Cathode) используются для управления подсветкой LCD дисплея.
Установка библиотеки LiquidCrystal I2C
Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.
Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
- В строке поиска вводим «LiquidCrystal I2C», находим библиотеку Фрэнка де Брабандера (Frank de Brabander), выбираем последнюю версию и кликаем Установить.
- Библиотека установлена (INSTALLED).
Синтаксис
- – это экземпляр , – положение символа изображения, 0,0 = верхний/левый угол, 12,0 = верхний/правый угол у LCD размером 16×2. Дисплей 20×16 пикселей, который создает LCDBitmap, – это участок размером 4 символа в ширину и 2 символа в высоту.
- Инициализировать изображение LCD.
- Очистить дисплей изображения (автоматически обновляет дисплей изображения), но не очищает текст.
- Инвертировать изображение, автоматически обновляет дисплей изображения.
- Обновить дисплей изображения.
- Очистить только текст на дисплее (изображение остается).
- Переместить курсор на домашнюю позицию . Выполняет , добавлен только для удобства.
- Переместить позицию LCD изображения на указанную позицию символа.
- Добавить пиксель в , – (включен) или (выключен), – (обновить) или (не обновлять).
- Нарисовать линию от до , color и update – то же самое, что и в .
- Нарисовать прямоугольник от до , и – то же самое, что и в .
- Нарисовать заполненный прямоугольник от до , и – то же самое, что и в .
- Нарисовать полосковый индикатор (гистограмму), – количество полос , – массив, который содержит значения высот, и – то же самое, что и в .
Установка библиотеки для модуля OLED
Контроллер SSD1306 OLED дисплея имеет гибкие, но сложные драйверы. Для использования контроллера SSD1306 необходимы огромные знания по адресации памяти. К счастью, была написана библиотека Adafruit SSD1306, которая позволяет довольно простыми и понятными командами управлять OLED дисплеем.
Чтобы установить библиотеку, перейдите в раздел Sketch > Include Library > Manage Libraries…. Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.
Отфильтруйте результаты поиска, введя adafruit ssd1306. Там должна быть пара записей. Ищите Adafruit SSD1306 от Adafruit. Нажмите на эту запись, а затем выберите Установить.
Библиотека Adafruit SSD1306 представляет собой аппаратную библиотеку, которая выполняет функции более низкого уровня. Она должна быть сопряжена с библиотекой Adafruit GFX для отображения графических примитивов, таких как точки, линии, круги, прямоугольники и т. д. Также установите и эту библиотеку.
#1 Пример
Выводим надпись на дисплей LCD1602 подключённый по шине I2C. Для работы с дисплеем LCD2004 нужно изменить 3 строку на LiquidCrystal_I2C lcd(0x27,20,4);
#include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
// Если надпись не появилась, замените адрес 0x27 на 0x3F
void setup(){ //
lcd.init(); // Инициируем работу с LCD дисплеем
lcd.backlight(); // Включаем подсветку LCD дисплея
lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка)
lcd.print(«LCD»); // Выводим текст «LCD», начиная с установленной позиции курсора
lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка)
lcd.print(«www.iarduino.ru»); // Выводим текст «www.iarduino.ru», начиная с установленной позиции курсора
} //
//
void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop
Сканер I2C интерфейса (шины) Ардуино
Для этого занятия нам потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- два текстовых дисплея 1602 I2C;
- любое устройство с I2C интерфейсом;
- провода «папа-папа», «папа-мама».
Подключение двух дисплеев 1602 I2C к Ардуино
Перед тем, как управлять несколькими объектами, подключенных к IIC шине, необходимо узнать их адреса. Для этого используется программа — сканер I2C Arduino, которая позволяет узнать адреса всех устройств, подключенных в данный момент к шине. Соберите схему из двух текстовых экранов с IIC модулем (можно подключить только одно устройство), подключенных к Ардуино Уно, и загрузите следующий скетч.
Скетч. Сканер шины i2c для Arduino
#include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); } void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 8; address < 127; address++ ){ Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0){ Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknow error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); }
Пояснения к коду:
- данный код позволяет узнать все адреса устройств, подключенных к шине IIC. Если устройство не было подключено или подключено неправильно — на мониторе порта будет выходить сообщение, что устройства не найдены;
- ниже, на скриншоте монитора порта Arduino IDE, выводится адрес LCD 1602.
Сканер шины i2c для Arduino с LCD дисплеем
Экран с I2C
Стандартный экран неудобно подключать, слишком много контактов задействовано в сборке. Существует альтернативный вариант, когда к экрану прилагается дополнительный модуль. В этом случае используется только четыре контакта (питание, земля и два аналоговых порта).
На других микроконтроллерах сигнальные выводы отличаются (Leonardo: SDA-D2, SCL-D3; MEGA, ADK, DUE: SDA-D20, SCL-D21).
Модуль может поставляться отдельно и его нужно припаять самостоятельно. Но проще сразу приобрести готовый собранный модуль с экраном. Встречаются различные модификации экранов — 4х20, 2х16.
Стандартная библиотека не подойдёт. Нужно использовать библиотеку с поддержкой I2C LiquidCrystal I2C by Frank de Brabander (GitHub).
После установки библиотеки будут доступны несколько примеров: CustomChars, HelloWorld, SerialDisplay.
Если при запуске примера не видны символы на экране, то попробуйте покрутить винт на модуле для изменения контрастности. У меня был именно такой случай.
Модуль светодиодной матрицы с микросхемой MAX7219
Модуль представляет из себя плату с микросхемой, необходимой для неё обвязкой и, собственно, матричным индикатором. Обычно индикатор не впаивают в плату, а вставляют в разъем. Это сделано для того, чтобы группу модулей можно было сначала закрепить на какой то поверхности винтами, а затем вставить в них матрицы.
У модуля есть пять выводов на каждой стороне. С одной стороны данные входят в модуль, с другой стороны данные выходят из модуля и передаются в следующий. Это позволяет соединять матрицы у цепочку.
Входной разъем / Выходной разъем:
- VCC, GND — питание;
- DIN — вход данных;
- CS — выбор модуля (chip select);
- CLK — синхроимпульс.
Работает модуль от напряжения 5 Вольт.
Общие сведения
Китайские производители модулей LCD1602A v.2.0, программируют английский алфавит в памяти модуля, включая цифры и еще кучу символом (все символы можно посмотреть в мануале). Если необходимого символа нет, можно нарисовать собственный, но не более 8 шт., то есть мы можем одновременно отобразить не более восьми собственных символов. Теперь немного подробнее, для отображения символов, модуль LCD1602A содержит 32 ячейки, каждая из этих ячеек, содержит восемь строк и пять столбцов (5х8). Наглядно можно приставить, как таблицу из 8 на 5 точек, если в любой точке таблицы мы укажем единицу, точка будет светится, если ноль нет.
Ниже продемонстрирован небольшой кусок кода, точно такой же как и в основном примере отличие только в написание.
некая доработка библиотеки LCD_1602_RUS
отличается от оригинала тем, что заводится без танцев с бубном
код либы/примеров чуть-чуть переоформлен в отличии от оригинала
Arduino LCD 16×02 display with I2C interface RUSSIAN with NO CYRILLIC symbols set
Библиотека позволяет использовать русские символы при использовании LCD дисплеев, подключенных по интерфейсу I2C, без встроенной кириллицы. Максимально возможно отображение 8 уникальных по начертанию русских символа (например Ж, Д, И, Ю и т.п.) Символы, одинаковые по начертанию с английскими (A, B, C, O, P и т.п.) используются из английского набора символов. Дополнительно встроена возможность печати знака градуса Цельсия. Для этого в тексте программы необходимо набрать код UTF-8 (Alt+0176)
Должна быть установелна базовая библиотека LiquidCrystal_I2C: https://github.com/marcoschwartz/LiquidCrystal_I2C
HelloWorld — простой пример вывода кириллических символов на LCD экран
SerialToLCD — Ввод символов (в т.ч. кириллических) с монитора порта и их вывод на LCD экран
некая доработка библиотеки LCD_1602_RUS
отличается от оригинала тем, что заводится без танцев с бубном
код либы/примеров чуть-чуть переоформлен в отличии от оригинала
Arduino LCD 16×02 display with I2C interface RUSSIAN with NO CYRILLIC symbols set
Библиотека позволяет использовать русские символы при использовании LCD дисплеев, подключенных по интерфейсу I2C, без встроенной кириллицы. Максимально возможно отображение 8 уникальных по начертанию русских символа (например Ж, Д, И, Ю и т.п.) Символы, одинаковые по начертанию с английскими (A, B, C, O, P и т.п.) используются из английского набора символов. Дополнительно встроена возможность печати знака градуса Цельсия. Для этого в тексте программы необходимо набрать код UTF-8 (Alt+0176)
Должна быть установелна базовая библиотека LiquidCrystal_I2C: https://github.com/marcoschwartz/LiquidCrystal_I2C
HelloWorld — простой пример вывода кириллических символов на LCD экран
SerialToLCD — Ввод символов (в т.ч. кириллических) с монитора порта и их вывод на LCD экран
3Библиотека для работы по протоколу I2C
Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, (ссылка в строке «Download Sample code and library»).
Библиотека для работы по протоколу I2C
Скачанный архив LiquidCrystal_I2Cv1-1.rar разархивируем в папку \libraries\, которая находится в директории Arduino IDE.
Библиотека поддерживает набор стандартных функций для LCD экранов:
Функция | Назначение |
---|---|
LiquidCrystal() | создаёт переменную типа LiquidCrystal и принимает параметры подключения дисплея (номера выводов); |
begin() | инициализация LCD дисплея, задание параметров (кол-во строк и символов); |
clear() | очистка экрана и возврат курсора в начальную позицию; |
home() | возврат курсора в начальную позицию; |
setCursor() | установка курсора на заданную позицию; |
write() | выводит символ на ЖК экран; |
print() | выводит текст на ЖК экран; |
cursor() | показывает курсор, т.е. подчёркивание под местом следующего символа; |
noCursor() | прячет курсор; |
blink() | мигание курсора; |
noBlink() | отмена мигания; |
noDisplay() | выключение дисплея с сохранением всей отображаемой информации; |
display() | включение дисплея с сохранением всей отображаемой информации; |
scrollDisplayLeft() | прокрутка содержимого дисплея на 1 позицию влево; |
scrollDisplayRight() | прокрутка содержимого дисплея на 1 позицию вправо; |
autoscroll() | включение автопрокрутки; |
noAutoscroll() | выключение автопрокрутки; |
leftToRight() | задаёт направление текста слева направо; |
rightToLeft() | направление текста справа налево; |
createChar() | создаёт пользовательский символ для LCD-экрана. |
ЖК-экран – автоматическое смещение текста [1]
Библиотека LiquidCrystal позволяет вам управлять ЖК-экранами, которые совместимы с драйвером Hitachi HD44780. Моделей этих экранов встречается довольно много, а их управление осуществляется, как правило, через 16-контактный интерфейс.
Этот пример показывает, как при помощи функций autoscroll() и noAutoscroll() автоматически перемещать весь текст на дисплее влево или вправо.
Функция autoscroll() включает «автосмещение», т.е. каждый раз при добавлении символа перемещает весь текст на одну позицию влево.
Функция noAutoscroll() отключает «автосмещение».
Что касается конкретно этого скетча, то он сначала печатает символы от 0 до 9 (с выключенным «автосмещением»), затем двигает курсор в правую нижнюю часть экрана, включает «автосмещение» и снова печатает эти цифры.
Программа 2
Теперь будем выводить такую строку: “температура с момента запуска программы” -> “текущая температура”. Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её . При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус }
Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.
- У нас есть функция , которая возвращает время работы программы в миллисекундах.
- даст нам секунды, запишем в переменную .
- Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60:
- Чтобы получить количество минут из общего количества секунд – нужно выполнить операцию остаток от деления, опять же на 60:
- Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие:
- Обернём вывод времени в функцию для лучшей читаемости кода
#include <LiquidCrystal_I2C.h> // подключаем библу LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк #include <microDS18B20.h> MicroDS18B20<2> sensor; float prevT; // переменная для хранения температуры void setup() { lcd.init(); // инициализация lcd.backlight(); // включить подсветку sensor.requestTemp(); // запрос температуры delay(1000); // ждём prevT = sensor.getTemp(); // запомнили } void loop() { sensor.requestTemp(); // запрос температуры delay(1000); // ждём lcd.home(); // курсор в 0,0 lcd.print(prevT, 1); // вывод prevT с точностью 1 знак lcd.write(223); // градус lcd.print(' '); // пробел lcd.write(126); // стрелочка lcd.print(' '); // пробел lcd.print(sensor.getTemp(), 1); // текущая температура lcd.write(223); // градус printTime(); // выводим время } // функция вывода времени void printTime() { lcd.setCursor(0, 1); // курсор на вторую строку int sec = millis() / 1000; // общее количество секунд byte thisM = sec / 60; // количество минут if (thisM < 10) lcd.print(0); // ведущий 0 lcd.print(thisM); // минуты lcd.print(':'); // двоеточие byte thisS = sec % 60; // количество секунд if (thisS < 10) lcd.print(0); // ведущий 0 lcd.print(thisS); // секунды }
Выводим на LCD 1602 русский шрифт
QAPASS дисплей поддерживает 8 новых символов (пронумерованных от 0 до 7) размером 5 на 8 пикселей. Букву на кириллице, как и символ, можно задать массивом из восьми байт, характеризующих соответствующую строку. Можно добавить до 8 символов, поэтому используйте при выводе сочетание латинских и кириллических букв, как на примере. Загрузите скетч с надписью «Я РОБОТЕХНИКА18.РФ»
Скетч с русскими буквами на LCD I2C
#include <Wire.h> // библиотека для управления устройствами по I2C #include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 1602 LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея // создаем символ сердца и четырех букв на кириллице byte heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; byte I = { 0b01111, 0b10001, 0b10001, 0b01111, 0b00101, 0b01001, 0b10001, 0b00000 }; byte B = { 0b11111, 0b10000, 0b10000, 0b11110, 0b10001, 0b10001, 0b11110, 0b00000 }; byte N = { 0b10001, 0b10001, 0b10011, 0b10101, 0b11001, 0b10001, 0b10001, 0b00000 }; byte F = { 0b01110, 0b10101, 0b10101, 0b10101, 0b01110, 0b00100, 0b00100, 0b00000 }; void setup() { LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея // присваиваем символам порядковый номер LCD.createChar(1, heart); LCD.createChar(2, I); LCD.createChar(3, B); LCD.createChar(4, N); LCD.createChar(5, F); LCD.setCursor(6,0); // устанавливаем курсор на 6 символ первой строки LCD.print(char(2)); LCD.print(" "); LCD.print(char(1)); LCD.setCursor(0,1); // устанавливаем курсор на начало второй строки LCD.print("PO"); LCD.print(char(3)); LCD.print("OTEXH"); LCD.print(char(4)); LCD.print("KA18.P"); LCD.print(char(5)); } void loop() { }
Пояснения к коду:
- массивы строк в функции можно прописывать в строку;
- слово РОБОТЕХНИКА18.РФ использует набор русских и латинских букв.
Вывод информации:
Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h
Функционал библиотеки LiquidCrystal.h
//Работа с курсором
lcd.setCursor(0, 0); // Устанавливаем курсор (номер ячейки, строка)
lcd.home(); // Установка курсора в ноль (0, 0)
lcd.cursor(); // Включить видимость курсора (подчеркивание)
lcd.noCursor(); // Убрать видимость курсора (подчеркивание)
lcd.blink(); // Включить мигание курсора (курсор 5х8)
lcd.noBlink(); // Выключить мигание курсора (курсор 5х8)
//Вывод информации
lcd.print(«Mikrotok.ru»); // Вывод информации
lcd.clear(); // Очистка дисплея, (удаление всех данных) установка курсора в ноль
lcd.rightToLeft(); // Запись производится справа на лево
lcd.leftToRight(); // Запись производится слева на право
lcd.scrollDisplayRight(); // Смещение всего изображенного на дисплее на один символ вправо
lcd.scrollDisplayLeft(); // Смещение всего изображенного на дисплее на один символ влево
//Информация полезная для шпионов:)
lcd.noDisplay(); // Информация на дисплее становится невидимой, данные не стираются
// если, в момент когда данная функция активна, ничего не выводить на дисплей, то
lcd.display(); // При вызове функции display() на дисплее восстанавливается вся информация которая была
1 |
//Работа с курсором lcd.setCursor(,);// Устанавливаем курсор (номер ячейки, строка) lcd.home();// Установка курсора в ноль (0, 0) lcd.cursor();// Включить видимость курсора (подчеркивание) lcd.noCursor();// Убрать видимость курсора (подчеркивание) lcd.blink();// Включить мигание курсора (курсор 5х8) lcd.noBlink();// Выключить мигание курсора (курсор 5х8) lcd.print(«Mikrotok.ru»);// Вывод информации lcd.clear();// Очистка дисплея, (удаление всех данных) установка курсора в ноль lcd.rightToLeft();// Запись производится справа на лево lcd.leftToRight();// Запись производится слева на право lcd.scrollDisplayRight();// Смещение всего изображенного на дисплее на один символ вправо lcd.scrollDisplayLeft();// Смещение всего изображенного на дисплее на один символ влево lcd.noDisplay();// Информация на дисплее становится невидимой, данные не стираются // если, в момент когда данная функция активна, ничего не выводить на дисплей, то lcd.display();// При вызове функции display() на дисплее восстанавливается вся информация которая была |
Сам же дисплей может работать в двух режимах :
• 8-битный режим – для этого используются и младшие и старшие биты (BB0- DB7)
• 4-битный режим – для этого используются и только младшие биты (BB4- DB7)
Использование 8-битного режима на данном дисплее не целесообразно. Для его работы требуется на 4 ноги больше, а выигрыша в скорости практически нет т.к. частота обновления данного дисплея упирается в предел < 10раз в секунду.
Для вывода текста необходимо подключить выводы RS, E, DB4, DB5, DB6, DB7 к выводам контроллера. Их можно подключать к либым пинам Arduino, главное в коде задать правильную последовательность.
Пример Программного кода
Тест LCD Код с символом
#include <LiquidCrystal.h> // Добавляем необходимую библиотеку
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)
void setup(){
lcd.begin(16, 2); // Задаем размерность экрана
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print(«LCD 16×2 Arduino»); // Выводим текст
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print(«Mikrotok.ru «); // Выводим текст
}
1 |
#include <LiquidCrystal.h> // Добавляем необходимую библиотеку LiquidCrystal lcd(7,6,5,4,3,2);// (RS, E, DB4, DB5, DB6, DB7) voidsetup(){ lcd.begin(16,2);// Задаем размерность экрана lcd.setCursor(,);// Устанавливаем курсор в начало 1 строки lcd.print(«LCD 16×2 Arduino»);// Выводим текст lcd.setCursor(,1);// Устанавливаем курсор в начало 2 строки lcd.print(«Mikrotok.ru «);// Выводим текст |
Результат:
Символ я добавил потом. Что касается символов