Учебный курс. Подключение lcd к микроконтроллеру. Получение первых результатов. Arduino. Подключаем LCD-дисплей

При создании собственного устройства не редко возникает необходимость оперативного вывода разнообразной информации. Например, если вы создаёте контроллер умного дома, то разумно оснастить прибор устройством вывода, позволяющим быстро узнать текущее состояние систем. Лучшим решением является жидкокристаллический дисплей. Энергопотребление при отключённой подсветке минимально а работа с дисплеем предельно проста и не требует сильного вмешательства в код программы. Фактически, вывод информации на ЖК дисплей не многим отличается от вывода в серийный порт. В статье рассмотрено подключение знакогенерирующего дисплея на базе популярного чипа HD44780 к контроллеру Arduino.

Как работает жидкокристаллический текстовый дисплей

Для понимания некоторых нюансов полезно знать как работает знакогенерирующий дисплей. Особенностью работы дисплеев такого типа является наличие своего контроллера с собственной памятью. DDRAM — память дисплея. Для вывода символа на экран необходимо загрузить символ в ячейку памяти, а затем передать команду на отображение ячейки памяти. При передаче символы кодируются ASCII кодами. Например, при записи в память кода 0×31 на дисплей будет выведен символ «1 ». Соответствие кода символа его отображению на экране (т.е. «картинке» символа) хранится в памяти CGROM. CGROM не изменяемая память. Поэтому, дисплей может отображать только те символы, которые «зашиты» в контроллер. Именно поэтому не каждый дисплей способен отображать, например, русские символы. Дисплеи, продающиеся в нашем магазине, к сожалению, не русифицированы. Есть ещё CGRAM память. Она изменяемая. Мы можем создавать собственные символы и отображать их на дисплее. Стоит учитывать, что можно создать не более восьми символов.

Вся эта «подкапотная» работа важна только для понимания некоторых нюансов. Для Arduino существует простая и понятная библиотека, которая выполняет за вас всю черновую работу, позволяя контролировать вывод на дисплей легко и просто.

Подключение жидкокристаллического дисплея к Arduino

Для подключения дисплея его, разумеется, нужно установить на макетную плату. Обратите внимание: дисплеи, продающиеся у нас в магазине продаются без припаянного штырькового разъёма. Если вы хотите получить дисплей сразу готовый к установке на макетку, отметьте галочку «припаять разъём» на странице товара и мы припаяем разъём для вас. Передача данных на дисплей может быть организована двумя способами: по 4 или по 8 бит за раз. Соответственно, потребуется либо 4, либо 8 выводов Arduino. На практике, выигрыша в скорости при использовании восьмибитного интерфейса не будет. Поэтому, нам потребуется только 4 цифровых вывода для передачи данных. Ещё 3 вывода потребуются для задания режима работы дисплея. Итого для подключения дисплея понадобится всего 7 цифровых выходов контроллера. Контакты на дисплее подписаны, что позволит не запутаться при подключении:

Выводы нумеруем слева направо:

  • 1-(VSS ) Земля дисплея. Подключается к рельсе земли.
  • 2-(VDD ) Питание дисплея. Подключается к рельсе питания.
  • 3-(VO ) Вход потенциометра (входит в комплект). С помощью потенциометра регулируется контрастность дисплея. К выводу дисплея подключается средний выход потенциометра.
  • 4-(RS ) Вход «командного» сигнала. Подключается к любому цифровому выводу Arduino. В примере подключён к выводу №12.
  • 5-(RW ) Устанавливает режим «чтения» или «записи». Мы собираемся записывать. Подключаем контакт к земле.
  • 6-(E ) Enable. Ещё один «командный» вывод. Когда на вывод подаётся единица, дисплей выполняет переданную ранее команду. Подключается к любому цифровому выводу. В примере подключен к выводу №11.
  • 7-10 (D0-D3 ) оставляем не подключёнными. Это контакты передачи данных, который используются в восьмибитном интерфейсе. Нам не нужны.
  • 11-14 (D4-D7 ) Контакты для передачи данных в четырёхбитном режиме. Подключаются опять таки к любым цифровым выводам. В примере подключены соответственно к 5,4,3 и 2 выводам (D4 к 5 выводу, D5 к 4 и т.д.).
  • 15 (A ) Анод светодиода подсветки. Токоограничительный резистор уже установлен в дисплее, поэтому анод подключается просто к рельсе питания. Поскольку в подсветке используется самый обычный светодиод, вы можете подключить его к любому выводу, поддерживающему и управлять яркостью подсветки программно.
  • 16 (K ) Катод подсветки. Подключается к рельсе земли.

Визуальная схема подключения:

Программирование

Вместе с Arduino IDE поставляется прекрасная библиотека для жидкокристаллических дисплеев - LiquidCrystal . Библиотека содержит примеры, полностью раскрывающие возможности экрана. Для начала воспользуйтесь стандартным примером «HelloWorld» (Файл -> Примеры -> LiquidCrystal -> HelloWorld) или загрузите в плату следующий код:

/* *RS вывод дисплея к 12 выводу arduino *Enable вывод дисплея к 11 выводу arduino *D4 вывод дисплея к 5 выводу arduino *D5 вывод дисплея к 4 выводу arduino *D6 вывод дисплея к 3 выводу arduino *D7 вывод дисплея к 2 выводу arduino *R/W вывод дисплея к земле *Выход потенциометра к VO выводу дисплея */ // подключаем библиотеку: #include ; // Инициализируем дисплей // Перечисляем выводы arduino к которым подключены // RS, E, D4, D5, D6, D7 контакты дисплея LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Указываем количество столбцов и строк дисплея: lcd.begin(16, 2); // Выводим сообщение на дисплей. lcd.print("hello, world!"); } void loop() { // устанавливаем курсор в 0 (нулевой) столбец первой строки // фактически курсор установится во вторую (нижнюю) строку // нумерация строк и столбцов начинается с нуля lcd.setCursor(0, 1); // выводим на дисплей количество секунд, // прошедших с момента загрузки платы: lcd.print(millis()/1000); }

*RS вывод дисплея к 12 выводу arduino

*Enable вывод дисплея к 11 выводу arduino

*D4 вывод дисплея к 5 выводу arduino

*D5 вывод дисплея к 4 выводу arduino

*D6 вывод дисплея к 3 выводу arduino

*D7 вывод дисплея к 2 выводу arduino

*R/W вывод дисплея к земле

*Выход потенциометра к VO выводу дисплея

// подключаем библиотеку:

#include ;

// Инициализируем дисплей

// Перечисляем выводы arduino к которым подключены

// RS, E, D4, D5, D6, D7 контакты дисплея

void setup () {

// Указываем количество столбцов и строк дисплея:

lcd . begin (16 , 2 ) ;

// Выводим сообщение на дисплей.

lcd . print ("hello, world!" ) ;

void loop () {

// нумерация строк и столбцов начинается с нуля

lcd . setCursor (0 , 1 ) ;

// выводим на дисплей количество секунд,

// прошедших с момента загрузки платы:

lcd . print (millis () / 1000 ) ;

После загрузки этого кода в плату Arduino на экране отобразится надпись «hello, world!»(англ. «привет, Мир!» ) на первой строке и таймер, отсчитывающий секунды на второй строке.

Как обычно и бывает, код простой и понятный. Однако, мы всё же разберём его более подробно:

  • LiquidCrystal lcd (12, 11, 5, 4, 3, 2) - эта строка создаёт объект дисплея, с которым мы будем работать в будущем. В скобках в качестве аргументов передаются номера пинов, к которым подключены контакты дисплея. Соответственно: RS, E, D4, D5, D6, D7. Как уже отмечалось выше, номера выводов при подключении можно выбирать совершенно произвольно.
  • lcd.begin (16, 2) - здесь мы настроили размеры дисплея. В данном примере 16 столбцов и 2 строки. Для нашего дисплея 20Х4 эта строчка выглядела бы так: lcd.begin (20, 4).
  • lcd.print («hello, world!») - выводит текст на дисплей. После указания размера дисплея (lcd.begin) курсор устанавливается в левый верхний угол дисплея. Поэтому, этот текст будет выведен на первой (верхней) строке слева.
  • lcd.setCursor (0, 1) - устанавливает курсор на указанную позицию. В данном случае указана крайняя левая позиция второй строки. В скобках задаётся номер столбца, затем номер строки. И строки и столбцы нумеруются с нулевой позиции. Таким образом: lcd.setCursor(0, 0) - установит курсор в левый верхний угол, lcd.setCursor(15, 0) - правый нижний.
  • lcd.print (millis()/1000) - уже описано выше. Здесь вместо текста в качестве параметра передаётся формула для вычисления. Результат выводится на экран.

Теперь, когда мы разобрались с простейшим примером, можно перейти к примерам посложнее. А если вы уже всё поняли и готовы купить ЖК дисплей, то я собрал для вас ссылки на проверенных мной китайских продавцов дисплеев:

Символьные ЖК дисплеи

Размер дисплея (столбцы*строки) Цвет подстветки Статус
20*4 Синий проверено
20*4 Жёлтый проверено
16*2 Синий проверено
16*2 Жёлтый проверено
16*2 Зелёный проверено

Обзор других примеров библиотеки LiquidCrystal

В стандартных примерах, поставляющихся вместе с библиотекой LiquidCrystal можно найти следующие скетчи:

    • Autoscroll - демонстрирует возможность прокрутки текста в автоматическом режиме. Некое подобие бегущей строки. При выводе символа предыдущие символы сдвигаются. Таким образом, новый символ выводится на одном и том же месте.

    • Blink - демонстрирует возможность включить отображение мигающего курсора в виде прямоугольника.

    • Cursor - демонстрирует возможность включить отображение курсора в виде мигающей горизонтальной черты.

    • CustomCharacter - показана возможность создания собственных символов для отображения их на дисплее. Кстати, в этом скетче ошибка. Подробности ниже.

    • Display - показывает способ «выключать» дисплей. То есть показывать или скрывать выведенный текст.

    • Scroll - демонстрирует возможность прокрутки текста в ручном режиме.

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

Рассмотрим более подробно процедуры, возможности которых демонстрируют эти примеры:

lcd.autoscroll()

После вызова этой процедуры, текст на экране будет автоматически прокручиваться. Для остановки прокрутки, следует вызвать lcd.noAutoscroll() .

lcd.blink()

После вызова процедуры курсор примет вид мигающего прямоугольника. Для отключения следует вызвать lcd.noBlink()

lcd.cursor()

После вызова процедуры курсор примет вид мигающей горизонтальной черты. Для отключения следует вызвать lcd.noСursor() . Курсор снова станет невидимым.

lcd.createChar()

Процедура загружает в изменяемую таблицу символов экрана (в память CGRAM) символ, описанный в виде байтового массива. В качестве аргумента передаётся номер символа и массив байт, описывающий символ. Остановимся на этом более подробно. Внести в память дисплея можно не более восьми символов. Для добавления своего символа нужно:

  1. Создать байтовый массив, описывающий символ.
  2. Записать символ в память дисплея, присвоив ему номер в таблице символов. Символы нумеруются в диапазоне от нуля до семи.
  3. Вывести символ на экран с помощью процедуры lcd.write() (не путать с lcd.print() ), в качесте аргумента которой передать номер символа.

Баг среды разработки и особенности библиотеки вылились в невозможность вывести на экран символ под номером 0 (ноль). Компилятор повстречав строку lcd.write(0) выдаст ошибку: «call of overloaded ‘write(int)’ is ambiguous «. Именно такая строка встречается в примере CustomCharacter библиотеки. При попытке скомпилировать стандартный пример, вы получите ошибку:

CustomCharacter.ino: In function ‘void setup()’: CustomCharacter:115: error: call of overloaded ‘write(int)’ is ambiguous /home/nazarovd/arduino-1.0.5/libraries/LiquidCrystal/LiquidCrystal.h:82: note: candidates are: virtual size_t LiquidCrystal::write(uint8_t) /home/nazarovd/arduino-1.0.5/hardware/arduino/cores/arduino/Print.h:49: note: size_t Print::write(const char*)

CustomCharacter . ino : In function ‘void setup () ’:

CustomCharacter : 115 : error : call of overloaded ‘write (int ) ’is ambiguous

/ home / nazarovd / arduino - 1.0.5 / libraries / LiquidCrystal / LiquidCrystal . h : 82 : note : candidates are : virtual size_t LiquidCrystal :: write (uint8_t )

/ home / nazarovd / arduino - 1.0.5 / hardware / arduino / cores / arduino / Print . h : 49 : note : size_t Print :: write (const char * )

Для устранения ошибки достаточно изменить строку lcd.write(0 ) на lcd.write((byte)0 ).
Теперь небольшой пример по созданию своего символа. Давайте выведем на дисплей символ рубля .

// Подключаем библиотеку #include ; // Инициализируем дисплей LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Описываем свой символ. // Просто "рисуем" символ единицами // Единицы при выводе на экран окажутся закрашенными точками, нули - не закрашенными byte rubl = { 0b00000, 0b01110, 0b01001, 0b01001, 0b01110, 0b01000, 0b11110, 0b01000, }; void setup() { // записываем свой символ в память экрана // аргументами передаём номер символа // и байтовый массив, описывающий наш символ lcd.createChar(0, rubl); // настраиваем дисплей lcd.begin(16, 2); } void loop() { // устанавливаем курсор в левый верхний угод экрана lcd.setCursor(0,0); // выводим символ с номером ноль на экран lcd.write((byte)0); // ничего не делаем 10 секунд delay(10000); }

// Подключаем библиотеку

#include ;

// Инициализируем дисплей

LiquidCrystal lcd (12 , 11 , 5 , 4 , 3 , 2 ) ;

Каждый радиолюбитель после некоторого количества простых самоделок приходит к цели сконструировать что-то грандиозное с использование датчиков и кнопок. Ведь гораздо интереснее выводить данные на дисплей, нежели на монитор порта. Но тогда встает вопрос: какой дисплей выбрать? И вообще, как подключать его, что нужно для подключения? Ответы на эти вопросы будут рассмотрены в этой статье.

LCD 1602

Среди множества вариантов среди дисплеев отдельно хочется отметить именно дисплей LCD1602 на базе контроллера HD4478. Существует этот дисплей в двух цветах: белые буквы на синем фоне, черные буквы на желтом фоне. Подключение LCD 1602 к Arduino также не вызовет никаких проблем, так как есть встроенная библиотека, и ничего скачивать дополнительно не нужно. Дисплеи отличаются не только ценой, но и размером. Зачастую радиолюбителями используется 16 x 2, то есть 2 строки по 16 символов. Но существует также и 20 x 4, где 4 строки по 20 символов. Размеры и цвет не играют никакой роли в подключении дисплея lcd 1602 к Arduno, подключаются они одинаково. Угол обзора составляет 35 градусов, время отклика дисплея - 250 мс. Работать может при температурах от -20 до 70 градусов по Цельсию. При работе использует 4 мА на экран и на подсветку 120 мА.

Где используется?

Данный дисплей имеет свою популярность не только у радиолюбителей, но и у крупных производителей. Например, принтеры, кофейные аппараты так же используют LCD1602. Это обусловлено ее низкой ценой, стоит этот дисплей на китайских площадках 200-300 рублей. Покупать стоит именно там, так как в наших магазинах наценки на этот дисплей очень высокие.

Подключение к Arduino

Подключение LCD 1602 к Arduino Nano и Uno не отличается. С дисплеем можно работать в двух режимах: 4 бита и 8. При работе с 8-битным используются и младшие, и старшие биты, а с 4-битным - только младшие. Работать с 8-битным особого смысла нет, так как добавится для подключения еще 4 контакта, что не целесообразно, ведь скорости выше не будет, предел обновлений дисплея - 10 раз в секунду. Вообще, для подключения lcd 1602 к Arduino используется много проводов, что доставляет некие неудобства, но существует особые шилды, но об этом позже. На фотографии изображено подключение дисплея к Arduino Uno:

Пример программного кода:

#include // Добавляем необходимую библиотеку 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("Hello, world!"); // Выводим текст lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("сайт"); // Выводим текст } void loop(){ }

Что же делает код? Первым делом подключается библиотека для работы с дисплеем. Как уже говорилось выше, эта библиотека уже входит в состав Arduino IDE и дополнительно скачивать и устанавливать ее не надо. Далее определяются контакты, которые подключены к выводам: RS, E, DB4, DB5, DB6, DB7 соответственно. После чего задается размерность экрана. Так как мы работаем с версией, где 16 символов и 2 строки, то пишем такие значения. Устанавливаем курсор в начало первой строки и выводим наш первый текст Hello World. Далее ставим курсор на вторую строку и выводим название сайта. Вот и все! Было рассмотрено подключение lcd 1602 к Arduino Uno.

Что такое I2C и зачем он нужен?

Как уже говорилось выше, подключение дисплея занимает очень много контактов. Например, при работе с несколькими датчиками и дисплеем LCD 1602 контактов может просто не хватить. Зачастую радиолюбителями используются версии Uno или Nano, где не так много контактов. Тогда люди придумали специальные шилды. Например, I2C. Он позволяет подключать дисплей всего в 4 контакта. Это в два раза меньше. Продается модуль I2C как отдельно, где самому нужно припаивать, так и уже припаянный к дисплею LCD 1602.

Подключение с помощью I2C модуля

Подключение LCD 1602 к Arduino Nano с I2C занимает мало места, всего 4 контакта: земля, питание и 2 выхода для передачи данных. Питание и землю подключаем на 5V и GND на Arduino соответственно. Оставшиеся два контакта: SCL и SDA подключаем к любым аналоговым пинам. На фотографии можно увидеть пример подключения lcd 1602 к arduino с I2C модулем:

Программный код

Если для работы с дисплеем без модуля необходимо было воспользоваться только одной библиотекой, то для работы с модулем нужно две библиотеки. Одна из них уже есть в составе Arduino IDE - Wire. Другую библиотеку, LiquidCrystal I2C, надо скачивать отдельно и устанавливать. Для установки библиотеки в Arduino содержимое скачанного архива необходимо загрузить в корневую папку Libraries. Пример программного кода с использованием I2C:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей void setup() { lcd.init(); lcd.backlight();// Включаем подсветку дисплея lcd..setCursor(8, 1); lcd.print("LCD 1602"); } void loop() { // Устанавливаем курсор на вторую строку и нулевой символ. lcd.setCursor(0, 1); // Выводим на экран количество секунд с момента запуска ардуины lcd.print(millis()/1000); }

Как можно увидеть, код почти не отличается.

Как добавить свой символ?

Проблемой этих дисплеев является то, что нет поддержки кириллицы и символов. Например, необходимо вам какой-нибудь символ загрузить в дисплей, чтобы он мог его отражать. Для этого дисплей позволяет создать до 7 своих символов. Представьте таблицу:

0 0 0 1 0
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 0 0 0

Если 0 - там ничего нет, если 1 - это закрашенный участок. В примере выше можно увидеть создание символа "улыбающийся смайл". На примере программы в Arduino это будет выглядеть следующим образом:

#include #include // Лобавляем необходимую библиотеку // Битовая маска символа улыбки byte smile = { B00010, B00001, B11001, B00001, B11001, B00001, B00010, }; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup(){ lcd.begin(16, 2); // Задаем размерность экрана lcd.createChar(1, smile); // Создаем символ под номером 1 lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" } void loop(){ }

Как можно увидеть, была создана битовая маска такая же, как и таблица. После создания ее можно выводить как переменную в дисплей. Помните, что в памяти можно хранить лишь 7 символов. В принципе, этого и бывает достаточно. Например, если нужно показать символ градуса.

Проблемы при которых дисплей может не работать

Бывают такие случаи, когда дисплей не работает. Например, включается, но не показывает символы. Или вовсе не включается. Сначала посмотрите, правильно ли вы подключили контакты. Если вы использовали подключение lcd 1202 к Arduino без I2C, то очень легко запутаться в проводах, что может стать причиной некорректной работы дисплея. Также следует удостовериться в том, что контрастность дисплея увеличена, так как при минимальной контрастности даже не видно, включен ли LCD 1602 или нет. Если это ничего не помогает, то, возможно, проблема может кроется в пайке контактов, это при использовании модуля I2C. Также частой причиной, при которой дисплей может не работать, является неправильная установка I2C адреса. Дело в том, что производителей много, и они могут ставить разный адрес, исправлять нужно тут:

LiquidCrystal_I2C lcd(0x27,16,2);

В скобках можно увидеть два значения, 0x27 и 16,2 (16, 2 - является размером дисплея, а 0x27 как раз таки адрес I2C). Вместо этих значений можно попробовать поставить 0x37 или 0x3F. Ну и еще одной причиной является просто неисправный LCD 1602. Учитывая, что практически все для Arduino изготавливается в Китае, то нельзя быть уверенным на 100%, что приобретенный товар не является браком.

Плюсы и минусы LCD 1602

Рассмотрим плюсы и минусы дисплея LCD 1602.

  • Цена. Этот модуль можно приобрести совсем по демократичной цене в китайских магазинах. Цена составляет 200-300 рублей. Иногда продается даже вместе с I2C модулем.
  • Легко подключать. Вероятно, никто сейчас не подключает LCD 1602 без I2C. А с этим модулем подключение занимает всего 4 контакта, никаких "паутин" из проводов не будет.
  • Программирование. Благодаря готовым библиотекам работать с этим модулем легко, все функции уже прописаны. А при необходимости добавить свой символ затрачивается всего пару минут.
  • За время использования тысячами радиолюбителями никаких больших минусов выявлено не было, только бывают случаи покупки брака, так как в основном используются китайские варианты дисплеев.

В этой статье было рассмотрено подключение 1602 к Arduino, а также были представлены примеры программ для работы с этим дисплеем. Он действительно является в своей категории одним из лучших, не просто так его выбирают тысячи радиолюбители для своих проектов!

Инструкция

Действие ультразвукового дальномера HC-SR04 основано на принципе эхолокации. Он излучает звуковые импульсы в пространство и принимает отражённый от препятствия сигнал. По времени распространения звуковой волны к препятствию и обратно определяется расстояние до объекта.
Запуск звуковой волны начинается с подачи положительного импульса длительностью не менее 10 микросекунд на ножку TRIG дальномера. Как только импульс заканчивается, дальномер излучает в пространство перед собой пачку звуковых импульсов частотой 40 кГц. В это же время запускается алгоритм определения времени задержки отражённого сигнала, а на ножке ECHO дальномера появляется логическая единица. Как только датчик улавливает отражённый сигнал, на выводе ECHO появляется логический ноль. По длительности этого сигнала ("Задержка эхо" на рисунке) определяется расстояние до объекта.
Диапазон измерения расстояния дальномера HC-SR04 - до 4 метров с разрешением 0,3 см. Угол наблюдения - 30 градусов, эффективный угол - 15 градусов. Ток потребления в режиме ожидания 2 мА, при работе - 15 мА.

Питание ультразвукового дальномера осуществляется напряжением +5 В. Два других вывода подключаются к любым цифровым портам Arduino, мы подключим к 11 и 12.

Теперь напишем скетч, определяющий расстояние до препятствия и выводящий его в последовательный порт. Сначала задаём номера выводов TRIG и ECHO - это 12 и 11 пины. Затем объявляем триггер как выход, а эхо - как вход. Инициализируем последовательный порт на скорости 9600 бод. В каждом повторении цикла loop() считываем дистанцию и выводим в порт.
Функция getEchoTiming() генерирует импульс запуска. Она как раз создаёт ток 10 мксек импульс, который является триггером для начала излучения дальномером звукового пакета в пространство. Далее она запоминает время от начала передачи звуковой волны до прихода эха.
Функция getDistance() рассчитывает дистанцию до объекта. Из школьного курса физики мы помним, что расстояние равно скорость умножить на время: S = V*t. Скорость звука в воздухе 340 м/сек, время в микросекундах мы знаем, это "duratuion". Чтобы получить время в секундах, нужно разделить на 1.000.000. Так как звук проходит двойное расстояние - до объекта и обратно - нужно разделить расстояние пополам. Вот и получается, что расстояние до объекта S = 34000 см/сек * duration / 1.000.000 сек / 2 = 1,7 см/сек / 100, что мы и написали в скетче. Операцию умножения микроконтроллер выполняет быстрее, чем деления, поэтому "/ 100" я заменил на эквивалентное "* 0,01".

Также для работы с ультразвуковым дальномером написано множество библиотек. Например, вот эта: http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/ultrasonic-HC-SR04.zip. Установка библиотеки происходит стандартно: скачать, разархивировать в директорию libraries , которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться.
Установив библиотеку, напишем новый скетч. Результат его работы тот же - в мониторе последовательного порта выводится дистанция до объекта в сантиметрах. Если в скетче написать float dist_cm = ultrasonic.Ranging(INC); , то дистанция будет отображаться в дюймах.

Итак, мы с вами подключили к Arduino ультразвуковой дальномер HC-SR04 и получили с него данные двумя разными способами: с использованием специальной библиотеки и без.
Преимущество использования библиотеки в том, что количество кода значительно сокращается и улучшается читаемость программы, вам не приходится вникать в тонкости работы устройства и вы сразу же можете его использовать. Но в этом же кроется и недостаток: вы хуже понимаете, как работает устройство и какие в нём происходят процессы. В любом случае, каким способом пользоваться - решать только вам.

В этой инструкции показано, как подключать к Arduino и использовать LCD экраны на 16х2 и 20х4.

Эти экраны имеют встроенную подсветку на базе маломощного светодиода, работают от +5 В. Для подключения этих жидкокристаллических экранов понадобится 6 контактов. Можно использовать любые пины на вашем Arduino!

Инструкция написана на основании LCD экранов от компании Adafruit - blue&white 16x2, RGB 16x2 LCD, и blue&white 20x4, RGB 20x4. Если вы используете ЖК экран от другого производителя, нет 100% гарантии, что он сработает (хотя в 99% случаев все работает).

Символьные и графические LCD - в чем разница?

Существует огромное количество разных ЖК экранов. В этой статье мы рассмотрим символьные (character) LCD. Подобные экраны - отличный вариант для отображения текста. Можно настроить и отображение иконок, но размер этих иконок не должен превышать 7 пикселей (очень маленькие!).

На фото ниже показан пример работы LCD монитора на 16 символов с двумя строками:

Если вы присмотритесь повнимательнее, вы увидите маленькие прямоугольники, в которых отображаются символы. Каждый прямоугольник - это отдельная сетка пикселей. Для сравнения, ниже показан графический (graphical) LCD экран:

На графическом жидкокристаллическом дисплее одна большая сетка пикселей (в данном примере - 128х64). На нем можно отобразить текст, но лучше выводить изображения. Графические LCD обычно больше по размерам, на них больше контактов для подключения, использовать их несколько сложнее, чем текстовые.

В этой статье мы рассмотрим только текстовые/символьные экраны!

Разные модели LCD экранов

После того, как мы ограничили тип рассматриваемых экранов, рассмотрим, какие они бывают.


Несмотря на то, что они используются только для отображения текста, существуют разные модели и форм-факторы: в левом верхнем углу ЖК экран 20x4 с белым текстом на синем фоне, в правом верхнем - 16x4 с черным текстом на зеленом фоне, слева внизу - 16x2 с белым текстом на синем фоне и 16x1 с черным текстом на сером фоне.

Хорошая новость: все эти экраны взаимозаменяемы. Если вы настроили один из них, вы можете заменить его на другую модель. Скетч Arduino придется немного изменить, но подключение одинаковое!


В этой части мы используем LCD экраны с одной рельсой и 16 контактами для подключения (смотрите фото выше). Есть и LCD с 2 рельсами по 8 контактов для подключения (на рисунке ниже).


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

Подключение символьного LCD экрана к Arduino

Устанавливаем рельсы контактов


Помимо LCD экрана вам понадобится дополнительная обвязка. Во-первых - потенциометр на 10 КОм. С помощью потенциометра мы будем настраивать контрастность дисплея. На каждом ЖК экране различные настройки контрастности, так что без регулировки не обойтись. Кроме того, вам понадобится рельса контактов 0.1".


Если рельса с контактами слишком длинная, лишние контакты модно просто отрезать!

Вам надо припаять контакты к ЖК дисплею.

При пайке будьте предельно осторожны, не повредите ваш Breadboard ! Можете сначала "прихватить" первый и 16 контакты, а потом уже припаять остальные.


Питание и подсветка

Подключаем питание и подсветку

Пояснения


Мы начинаем подбираться к интересным вещам! Установите ваш LCD на breadboard.


Макетную плату запитываем от нашего Arduino. Подключите +5V к красной рельсе, а Gnd - к синей.


После этого подключим подсветку нашего LCD экрана. Подключите контакт 16 к gnd, а пин 15 - к +5V. На большинстве ЖК экранов предусмотрены резисторы для подсветки.

Если же на вашем модуле резисторов не оказалось, придется добавить один между 5V и пином 15. Для расчета номинала резисторов, уточните максимальный ток для питания подсветки и примерное значение падения напряжения из даташита. Отнимите значение падения напряжения от 5 В, после этого разделите на максимальную силу тока и округлите к ближайшему большему стандартному значению номинала резистора. Например, если падение напряжения составляет 3.5 В, а сила тока 16 мА, номинал резистора будет равен: (5 - 3.5)/0.016 = 93.75 Ом, или 100 Ом после округления к стандартному значению. Если вы не можете найти даташит, используйте резистор на 220 Ом. Правда, в этом случае подсветка может быть достаточно бледной.


Подключите ваш Arduino к питанию. Подсветка должна загореться.

Кстати, на некоторых дешевых LCD экранах подсветка не предусмотрена!

Схема для настройки контраста

Цепь для настройки контраста

Пояснения


Устанавливаем потенциометр. На фото он находится справа от пина 1.


Подключите одну сторону потенциометра к +5V, а вторую - к Gnd. Средний контакт потенциометра подключите к 3 пину на LCD.


Теперь подключаем логику нашего экрана - это отдельная от подсветки цепь! Пин 1 идет к Gnd, а пин 2 - к +5V.


Включите ваш Arduino. Если на LCD Мониторе предусмотрена подсветка, она должна загореться. Покрутите ручку потенциометра, чтобы увидеть первую прямоугольники пикселей на первой строке.

Если все сработало, поздравляем. Это значит, что логика, подсветка и контраст работают! Если не получилось, не переходите к следующим шагам инструкции, пока не выясните, в чем ошибка!

Окончательное подключение

От D0 до D7, RS, EN, и RW. D0-D7 - это контакты, на которых хранится значения, передаваемые на дисплей. Контакт RS сообщает контроллеру, будем ли мы отображать данные (например, ASCII символ) или это управляющий байт (например, смена положения курсора). Контакт EN - это сокращение от "enable" (доступно), с помощью этого контакта мы сообщаем LCD, когда данные готовы для считывания. Контакт RW используется для установки направления - мы хотим отобразить (обычно) или считать (используется реже) данные с дисплея.

Не все эти контакты надо подключать к Arduino. Например, использовать RW не надо, если мы только отображаем данные на экране, так что его достаточно "подтянуть" к контакту Gnd. Кроме того, можно обмениваться данными с LCD экраном, используя 4 контакта вместо 8. Вероятно, возникает закономерный вопрос, в каких случаях используют 8 контактов? Скорее всего, это влияет на скорость передачи данных. То есть, используя 8 контактов вместо 4, вы можете увеличить скорость обмена информацией в 2 раза. В данном случае, скорость не важна, так что мы используем 4 контакта для подключения LCD к Arduino.

Итак, нам понадобятся 6 контактов: RS, EN, D7, D6, D5, и D4.

Для работы с LCD экраном, будем использовать библиотеку LiquidCrystal library, которая значительно облегчает процесс настройки пинов. Одно из достоинств этой библиотеки: вы можете использовать любые пины на Arduino для подключения контактов ЖК дисплея. Так что по окончанию этого гайда вы сможете легко заменить контакты, если это критично для вашего проекта.

Окончательное подключение дисплея

Пояснения


Как упоминалось выше, мы не будем использовать пин RW, так что "подтягиваем" его к земле. Это пин 5.


После подключаем RS - это пин #4. Мы используем коричневый провод для его подключения к цифровому контакту #7 на Arduino.


Белым проводом подключаем контакт EN - пин #6 к цифровому пину digital #8 на Arduino.


Подошла очередь к контактам data. DB7 - это пин #14 на LCD. Он подключается оранжевым проводом к пину #12 на Arduino.


Осталось три контакта data, DB6 (пин #13 желтый), DB5 (пин #12 зеленый) и DB4 (пин #11 синий). Они подключаются к пинам #11, 10 и 9 на Arduino соответственно.


В результате Подключения у вас получится что-то похожее на фото слева.

Используем символьный LCD

Пришло время загрузить скетч на Arduino для управления LCD экраном. Библиотека LiquidCrystal library установлена в Arduino IDE по умолчанию. Так что нам достаточно загрузить один из примеров и немного подкорректировать в соответствии с теми пинами, которые мы использовали для подключения.

Откройте скетч File→Examples→LiquidCrystal→HelloWorld.

Обновляем информацию о пинах. Ищем следующую строку:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

И меняем ее на:

Теперь можете компилировать и загружать скетч на Arduino.


Если надо, настройте контраст


Естественно, вы можете использовать ЖК дисплей с любыми размерами. Например, на фото ниже показана работа LCD 20x4.


Или черный текст на зеленом фоне:


Одно из достоинств экранов с черным текстом на зеленом фоне - возможность отключения подсветки.


Задействуем насколько строк

Давайте разберемся, как ЖК экран обрабатывает длинные сообщения и задействует несколько строк. Например, если вы измените следующую строку:

lcd.print("hello, world!");

На следующую:

lcd.print("hello, world! this is a long long message");

LCD дисплей 16x2 обрежет все после 16-го символа:


Но LCD дисплей 20x4 перенесет не отображенные символы с первой строки на третью (вторая строка продолжится на четвертой). Не очень удобно, но на этом этапе придется смириться. Так что при отображении длинных строк, считайте символы, чтобы не превысить допустимую длину.


LCD с RGB подсветкой

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

После подключения LCD и его проверки в соответствии с инструкциями выше, подключите светодиоды к ШИМ аналоговым пинам вашего Arduino для точной настройки цвета. Если вы используете Arduino Uno, у вас должно было остаться три свободных ШИМ контакта. подключите красный светодиод (16 контакт на LCD) к Digital 3, зеленый светодиод (контакт 17) - к Digital 5, а синий светодиод (18 контакт на LCD) - к digital 6. На LCD модуле уже предусмотрены резисторы, так что подключать дополнительные не надо.


Теперь загрузите приведенный ниже скетч на Arduino.

// включаем в скетч библиотеки:

#include

#include

#define REDLITE 3

#define GREENLITE 5

#define BLUELITE 6

// объявляем количество контактов, которые используем

// для передачи данных

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// яркость можно изменять в диапазоне 0 -> 255

int brightness = 255;

// настраиваем количество столбцов и строк на LCD:

lcd.begin(16, 2);

// отображаем сообщение на LCD.

lcd.print("RGB 16x2 Display ");

lcd.setCursor(0,1);

lcd.print(" Multicolor LCD ");

pinMode(REDLITE, OUTPUT);

pinMode(GREENLITE, OUTPUT);

pinMode(BLUELITE, OUTPUT);

brightness = 100;

for (int i = 0; i < 255; i++) {

setBacklight(i, 0, 255-i);

for (int i = 0; i < 255; i++) {

setBacklight(255-i, i, 0);

for (int i = 0; i < 255; i++) {

setBacklight(0, 255-i, i);

void setBacklight(uint8_t r, uint8_t g, uint8_t b) {

// настраиваем красный светодиод - он ярче остальных!

r = map(r, 0, 255, 0, 100);

g = map(g, 0, 255, 0, 150);

r = map(r, 0, 255, 0, brightness);

g = map(g, 0, 255, 0, brightness);

b = map(b, 0, 255, 0, brightness);

// общий анод, так что инвертируем!

r = map(r, 0, 255, 255, 0);

g = map(g, 0, 255, 255, 0);

b = map(b, 0, 255, 255, 0);

Serial.print("R = "); Serial.print(r, DEC);

Serial.print(" G = "); Serial.print(g, DEC);

Serial.print(" B = "); Serial.println(b, DEC);

analogWrite(REDLITE, r);

analogWrite(GREENLITE, g);

analogWrite(BLUELITE, b);

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

Команда createChar

Вероятно, вы захотите использовать специальные символы. Например, если вы разрабатываете проект с использованием датчика температуры (термопары), вам пригодится символ (°).

Реализовать это можно с помощью команды createChar. Кроме того, вам может пригодиться отличный веб-сайт, который выполнит за вас всю грязную работу по созданию новых символов !

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Как подружить плату Ардуино с символьным дисплеем? Довольно просто! Все ниже по порядку и с подробностями.

Если есть желание получать информацию от Ардуино без подключения к компьютеру и вывода на серийный порт, можно использовать символьный дисплей. Сделать это не так сложно. Полученное удобство от общения неоценимо.
Для работы я использовал символьный LCD-дисплей J204A на базе чипа HD44780, на eBay часто встречается как LCD2004. 4 строки по 20 символов, инвертированный. Куплен с кучей других на eBay, за сущие копейки, от 60 до 100 рублей за штуку. Русский язык не поддерживается по-умолчанию, но это решаемая проблема, об этом как нибудь в следующий раз. И еще коннекторы на схеме не распаяны, придется поработать паяльником.
Для работы с дисплеями используется библиотека LiquidCrystal.h входящая в дефолтную постаку Arduino IDE.

А вот даташита по дисплею LCD2004 я не нашел, но зато в интернетах полным полно таблиц по дисплею . Но они практически не отличаются друг от друга. По управлению и подключению полностью идентичны. Отличие только в количестве строк/символов на дисплее. Но это абсолютно не повлияет если у вас 1602.

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

# Контакты Для чего используется Примечание
1 VSS (VSS) GND. Земля. Питание микроконтроллера дисплея. 0V
2 VDD (VCC) Питающее напряжение для микроконтроллера дисплея. +5V
3 V0 (VEE) Контраст символов на дисплее. Подключать лучше через потенциометр. от 0v до +5V
4 RS (RS) Выбор регистра.
5 RW (R/W) Переключение режима чтения/записи. Утянем на землю, нам нужно только передавать информацию на дисплей. 0-запись +5V-чтение
6 E Тактирование
7 D0 (DB0) Данные
8 D1 (DB1) Передача данных. (Не будем использовать) Данные
9 D2 (DB2) Передача данных. (Не будем использовать) Данные
10 D3 (DB3) Передача данных. (Не будем использовать) Данные
11 D4 (DB4) Данные
12 D5 (DB5) Передача данных. (Задействуется) Данные
13 D6 (DB6) Передача данных. (Задействуется) Данные
14 D7 (DB7) Передача данных. (Задействуется) Данные
15 A (LED+) +5V Напряжение, подсветка дисплея, через потенциометр можно регулировать яркость дисплея. +5V
16 K (LED-) GND Земля, подсветка дисплея 0V

v

Передача данных к дисплею возможна в двух вариантах: по 8 и по 4 бит за такт. Т.к. Ардуино имеет мало контактов, мы будем использовать 4 — этого с лихвой хватает, чтоб обновлять информацию на дисплее с запредельной для восприятия скоростью.

Вот так все это дело у меня подключено. Возможно кажется что это хаос, но тут есть система. Можно выделить красные, зеленые, желтые и оранжевые провода. Красные всегда идут на +5V, зеленые — GND, а желтые и оранжевые — это провода для подключения к Ардуино, по которым идут данные.

Самая важная часть — физическое подключение дисплея. По клику открывается в большом разрешении, где все хорошо видно.
R1 — Резистор 200OM. Сопротивление ограничивающее ток, проходящий через подсветку дисплея.
R2 — Потенциометр с сопротивлением до 10kOM. Кутим ручку, подбираем контраст символов.


И крайне простой скетч, для вывода на экран пары строк.

H> // Подключаем библиотеку для работы с дисплеем. /* Командой LiquidCrystal lcd(rs, enable, d4, d5, d6, d7); создаем переменную типа LiquidCrystal И определяем через какие контакты Ардуино рабоает с дисплеем. подробнее про эту команду тут http://arduino.cc/en/Reference/LiquidCrystalConstructor */ LiquidCrystal lcd(6, 7, 8, 9, 10, 11); void setup() { lcd.begin(20, 4); // определяем характеристики дисплея (20 Символов в строке, 4 строки) // Для дисплея 1602 надо указывать lcd.begin(16, 2); lcd.setCursor(1, 1); // Указываем с какой позиции начать выводить текст. строки и символы начинаются с 0!!! // 1 уже отодвинет каретку на одно деление от начала экрана и сдвинет текст на одну строку ниже lcd.print("compblog.vlukyanov"); // выводим текст начиная с указанной позиции. lcd.setCursor(7, 2); // выводим с 8го символа на экране в третьей строке. lcd.print(".com"); // текст для вывода. } void loop() { // в цикле ни чего больше не делаем все уже сделано во время инициализации платы. }

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

Также дисплей может выполнять некоторые функции самостоятельно, а еще есть возможность задать некоторые параметры.

Например:

  • Скролить текст;
  • Мигать позицией курсора;
  • Включаться/выключаться.

А теперь бонус!
Подсветка дисплея тратит энергию, которую, при питании от батареи, например, хотелось бы экономить. Я сделал для себя такой вариант — при нажатии на кнопку, включается подсветка дисплея на 5 секунд.

H> // Подключаем библиотеку для работы с дисплеем. int buttonInt = 0; // Номер прерывания, которое будет вызыватся. int screenLed = 4; // Номер пина к которому подключен экран. +5V volatile long x = 5000; // переменная для хранения времени LiquidCrystal lcd(6, 7, 8, 9, 10, 11); void setup() { attachInterrupt(buttonInt, screenon, FALLING); // параметры прерывания lcd.begin(20, 4); pinMode(screenLed, OUTPUT); digitalWrite(screenLed,HIGH); // включаем дисплей lcd.setCursor(0, 0); lcd.print("Start screenon test!"); } // Функция которая будет выполнятся при нажатии на кнопку. void screenon() { x = millis()+5000; // Запоминаем время, когда надо выключить подсветку. Текущее время работы +5 секунд. digitalWrite(screenLed,HIGH); // Подаем напряжение на подсветку дисплея. } void loop() { lcd.setCursor(0, 2); // переходим к третей строке lcd.print(x); // и выводим время когда дисплей выключится lcd.setCursor(0, 3); // переходим к четвертой строке lcd.print(millis()); // печатаем текущее время работы if (x < millis()) // если время работы выключения наступило > { digitalWrite(screenLed,LOW); // то гасим дисплей } }

И результат: