Все давно привыкли, что у каждого электронного устройства есть экран, с помощью которого оно дает человеку всякую полезную информацию. MP3-плеер показывает название играемого трека, пульт квадрокоптера отображает полетную телеметрию, даже стиральная машина выводит на дисплей время до конца стирки, а на смартфоне вообще размещается целый рабочий стол персонального компьютера!
Скорее всего, вашему очередному устройству тоже не помешает какой-нибудь небольшой дисплейчик 🙂 Попробуем сделать простые электронные часы! А в качестве табло используем распространенный и дешевый символьный жидкокристаллический дисплей 1602. Вот прямо такой, как на картинке:
Кроме 16х2, достаточно популярным считается символьный дисплей 20х4 (четыре строки по 20 символов), а также графический дисплей с разрешением 128х64 точек. Вот они на картинках:


Список необходимых компонентов
Для выполнения простого примера с дисплеем 1602, кроме самого модуля дисплея, потребуется Ардуино-совместимый контроллер, макетная плата, переменный резистор и немного проводов вилка-вилка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Подключение символьного ЖК дисплея 1602
У дисплея 1602 есть 16 выводов. Обычно они нумеруются слева-направо, если смотреть на него так как на картинке. Иногда выводы подписываются, типа: DB0, DB1, EN и т.п. А иногда просто указывают номер вывода. В любом случае, список выводов всегда одинаковый:
1 — «GND», земля (минус питания);
2 — «Vcc», питание +5В;
3 — «VEE», контраст;
4 — «RS», выбор регистра;
5 — «R/W», направление передачи данных (запись/чтение);
6 — «EN», синхронизация;
7-14 — «DB0», «DB1», .., «DB7″- шина данных;
15 — анод подсветки (+5В);
16 — катод подсветки (земля).
Линии VEE, RS и четыре линии данных DB4, DB5, DB6, DB7 подключаем к цифровым выводам контроллера. Линию «R/W» подключим к «земле» контроллера (так как нам потребуется только функция записи в память дисплея). Подсветку пока подключать не будем, с этим, я полагаю, вы сами легко разберетесь 🙂
Принципиальная схема подключения дисплея к Ардуино Уно

Внешний вид макета

На всякий случай еще и в виде таблички:
ЖК дисплей 1602 | 1 | 2 | 4 | 6 | 11 | 12 | 13 | 14 | 15 | 16 |
Ардуино Уно | GND | +5V | 4 | 5 | 6 | 7 | 8 | 9 | +5V | GND |
Программируем «Hello, world!»
Для работы с ЖК дисплеями различных размеров и типов, в редакторе Arduino IDE имеется специальная библиотека LiquidCrystal. Чтобы подключить библиотеку, запишем первой строчкой нашей программы следующее выражение:
#include <LiquidCrystal.h>
Далее, нам потребуется указать какие выводы Ардуино мы использовали для подключения дисплея. Эту информацию мы укажем при инициализации модуля:
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
Здесь первые два аргумента — это выводы RS и EN, а оставшиеся четыре — линии шины данных DB4-DB7.
Далее, укажем размер дисплея с помощью команды «begin»:
lcd.begin(16, 2);
Напоминаю, в нашем дисплее имеется две строки, по 16 символов в каждой.
Наконец, для вывода текста нам понадобится простая функция «print». Вывод с помощью этой функции всем известной фразы будет выглядеть следующим образом:
lcd.print( "Hello, world!" );
Полностью программа будет выглядеть так:
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
void setup(){
lcd.begin(16, 2);
lcd.print( "Hello, world!" );
}
void loop(){
}
Загружаем её на Ардуино Уно, и смотрим что творится на дисплее. Может быть три основных ситуации 🙂
1) На дисплее отобразится надпись «Hello, world!». Значит вы все правильно подключили, и контраст каким-то чудесным образом оказался изначально правильно настроен. Радуемся, и переходим к следующей главе.
2) На дисплее отобразится целый ряд черных прямоугольников — требуется настройка контраста! Именно для этого мы добавили в цепь потенциометр с ручкой. Крутим его от одного края, до другого, до момента пока на дисплее не появится четкая надпись.
3) Два ряда черных прямоугольников. Скорее всего, вы что-то напутали при подключении. Проверьте трижды все провода. Если не найдете ошибку — попросите кота проверить!
Программируем часы
Теперь когда дисплей точно работает, попробуем превратить наше нехитрое устройство в настоящие электронные часы.
Внимание! Для вывода времени нам потребуется библиотека «Time». Если она еще не установлена, то можно скачать архив по ссылке. Подключим ее:
#include <Time.h>
Затем установим текущие дату и время с помощью функции «setTime»:
setTime( 23, 59, 59, 12, 31, 2015 );
Здесь все понятно: часы, минуты, секунды, месяц, число, год.
Для вывода даты используем кучу функции:
- year() — вернет нам год;
- month() — месяц;
- day() - день;
- hour() - час;
- minute() — вернет минуту;
- second() - секунду.
Теперь обратим внимание вот на какой факт. Если посчитать количество символов в типовой записи даты: «31.12.2015 23:59:59», получим 19. А у нас всего 16! Не влазит, однако, в одну строчку.
Решить проблему можно еще одной полезной функцией — «setCursor». Эта функция устанавливает курсор в нужную позицию. Например:
lcd.setCursor(0,1);
Установит курсор в начало второй строчки. Курсор — это место символа, с которого начнется вывод текста следующей командой «print». Воспользуемся этой функцией для вывода даты в первой строчке, а времени во второй.
С выводом даты и времени теперь все ясно. Остались рутинные вещи. Например, после каждого заполнения дисплея, мы будем его чистить функцией «clear()»:
lcd.clear();
А еще нам нет смысла выводить данные на дисплей чаще чем раз в секунду, поэтому между двумя итерациями сделаем паузу в 1000 миллисекунд.
Итак, сложив все вместе, получим такую программу:
#include <Time.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
void setup(){
lcd.begin(16, 2);
setTime(7,0,0,1,10,2015); // 7 утра, десятого января 2015 года
}
void loop(){
lcd.clear();
lcd.print( day() );
lcd.print( "." );
lcd.print( month() );
lcd.print( "." );
lcd.print( year() );
lcd.setCursor(0, 1);
lcd.print( hour() );
lcd.print( ":" );
lcd.print( minute() );
lcd.print( ":" );
lcd.print( second() );
delay(1000);
}
Загружаем скетч на Ардуино Уно, и наблюдаем за ходом часиков! 🙂 Для того чтобы закрепить полученные знания, рекомендую прокачать наши часы до полноценного будильника. Всего-то на всего потребуется добавить пару кнопок и зуммер 🙂
Но ведь, код часов не верный. Пишет ошибку в строке:
setTime(7,0,0,1,10,2015);
sketch_jun08a:4: error: stray ‘\’ in programs
Спасибо! Поправили.
Ничего не получилось пишет:
exit status 1
‘setTime’ was not declared in this scope
Нужно непременно установить библиотеку Time. Без нее этот скетч работать не будет.
http://www.pjrc.com/teensy/td_libs_Time.html
Там переводит на скачивание другой программы
нужно подключить библеотеку
А как управлять округлением данных при выводе на экран? Вот у меня приходит температура в виде float, выводится с сотыми долями. Если округлять функцией round и присваивать значение переменно типа int то получается только целое. А хочется округлить до десятых. Стирать последний символ на дисплее не хочется, из-за разного размера значений температуры.
Вот тут хорошо пишут про округление: http://www.instructables.com/id/Temperature-Control-For-Kitchen-Appliances/step2/Sensing-Temperature/
Ну может и хорошо, но я сделал проще и понятнее для своего LCD
было
lcd.print(Temperature*0.1);
тут умножение на 0.1 заводское, датчик в таком формате отдаёт, что надо *0.1 корректировать
стало
int temp1, temp2;
temp1=Temperature*0.1;
temp2=Temperature-(temp1*10);
lcd.print(temp1);
lcd.print(«.»);
lcd.print(temp2);
было
lcd.print(Temperature*0.1);
Сделай
lcd.print(Temperature*0.1, 1);
И будет отображение только десятых для float.
Округление через INT:
lcd.print((int(arg*10))/10)
Часы в таком варианте секундами дёргано немножко тикают, я сталкивался с вариантом, когда используется дополнительный вывод часов, на котором 1 секунда импульсы, он заведён на прерывание, по прерыванию данные на дисплее обновляются.
Ну может и хорошо, но я сделал проще и понятнее для своего LCD
было
lcd.print(Temperature*0.1);
тут умножение на 0.1 заводское, датчик в таком формате отдаёт, что надо *0.1 корректировать
стало
int temp1, temp2;
temp1=Temperature*0.1;
temp2=Temperature-(temp1*10);
lcd.print(temp1);
lcd.print(«.»);
lcd.print(temp2);
Ответить
Aleksandr_lal(jndtn)
говорит 22.11.2015 в 16:07:
было
lcd.print(Temperature*0.1);
Сделай
lcd.print(Temperature*0.1, 1);
здравствуйте. а можно с помощью ардуино сделать захват данных с дисплея лсд на 24 пина и выводит данни на тфт. Спасибо
Arduino слишком слабая платформа для подобного конвертирования данных на лету. Тут поможет разве что STM32, но там уже совсем другой уровень программирования.
А что за задача? Может быть проще свой контроллер сделать, и вывод данных сразу ну нужный дисплей.
Не знаю что поправили но скетч не компилируется.
А какая ошибка пишется? Библиотека Time установлена?
Код для дисплея не компилируется:
exit status 1
expected ‘,’ or ‘;’ before ‘?’ token
Код :
#include
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
void setup(){
lcd.begin(16, 2);
lcd.print( «Hello, world!» );
}
void loop(){
}
Исправлено. Теперь копи-паст должен нормально сработать.
сейчас на экране идет отображение данных времени в таком формате 0:0:36
0 часов 0 минут 36 секунд. можно ли сделать отображение 00:00:36?
и еще вопрос как сделать так чтобы сперва отображалось время а затем через секунду отображение с датчика DHT11
Можно сделать так:
char buf[16];
sprintf( buf, «%.02d», hour() );
lcd.print( buf );
Выручил! %.02d только у меня 4 цыфри %.04d. И теперь цыфри стираються! Спасибо Олег!)
Тоже ,поначалу скетч не компилировался. Надо просто ,уже скачаную «Time»
добавить в сам скетч:в заголовке скетча появится новый инклуд-
#include
сейчас на экране идет отображение данных времени в таком формате 0:0:36
0 часов 0 минут 36 секунд. можно ли сделать отображение 00:00:36?
Дата сейчас 27:3:2018
Надо 27:03:2018
Всё вроде сделал правильно: подключил TimeLib, setTime введён правильно, но всё что пишет на LCD экране — это 4 чёрных квадрата. Как решить?
А просто вывод текста на экран работает, безо всяких часов? Может подключен неправильно? Проверьте всё 7 раз.
Подскажите пожалуйста, как с монитор порта я могу изменять время на дисплее(настраивать его) и т.д.?
как скачать библиотека? то exe файл качает то нет ничего по ссылкам/
Cкачайте библиотеку timelib что бы пройти ошибку setTime.
а умене не 16 а 21 шо робить
когда я ввёл первый код отобразилиссь целый ряд черных прямоугольников.сколько бы я не крутил потенциометр ряд черных прямоугольников то появлялся то исчезал