Ардуино: вывод текста на ЖК дисплей 1602

Все давно привыкли, что у каждого электронного устройства есть экран, с помощью которого оно дает человеку всякую полезную информацию. MP3-плеер показывает название играемого трека, пульт квадрокоптера отображает полетную телеметрию, даже стиральная машина выводит на дисплей время до конца стирки, а на смартфоне вообще размещается целый рабочий стол персонального компьютера!

Скорее всего, вашему очередному устройству тоже не помешает какой-нибудь небольшой дисплейчик 🙂 Попробуем сделать простые электронные часы! А в качестве табло используем распространенный и дешевый символьный жидкокристаллический дисплей 1602. Вот прямо такой, как на картинке:

ЖК дисплей и DHT11 на Ардуино

Кроме 16х2, достаточно популярным считается символьный дисплей 20х4 (четыре строки по 20 символов), а также графический дисплей с разрешением 128х64 точек. Вот они на картинках:

AMC2004A-B-Y6WFDY_arduino_10
CFAG12864BYYH

Список необходимых компонентов

Для выполнения простого примера с дисплеем 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» подключим к «земле» контроллера (так как нам потребуется только функция записи в память дисплея). Подсветку пока подключать не будем, с этим, я полагаю, вы сами легко разберетесь 🙂

Принципиальная схема подключения дисплея к Ардуино Уно

lcdx1&potx1_схема

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

lcdx1_bb

На всякий случай еще и в виде таблички:

ЖК дисплей 16021246111213141516
Ардуино УноGND+5V456789+5VGND

Программируем «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);
}

Загружаем скетч на Ардуино Уно, и наблюдаем за ходом часиков! 🙂 Для того чтобы закрепить полученные знания, рекомендую прокачать наши часы до полноценного будильника. Всего-то на всего потребуется добавить пару кнопок и зуммер 🙂


Изменено:

Ардуино: вывод текста на ЖК дисплей 1602: Один комментарий

  1. Но ведь, код часов не верный. Пишет ошибку в строке:
    setTime(7,0,0,1,10,2015);

    sketch_jun08a:4: error: stray ‘\’ in programs

  2. А как управлять округлением данных при выводе на экран? Вот у меня приходит температура в виде float, выводится с сотыми долями. Если округлять функцией round и присваивать значение переменно типа int то получается только целое. А хочется округлить до десятых. Стирать последний символ на дисплее не хочется, из-за разного размера значений температуры.

  3. Часы в таком варианте секундами дёргано немножко тикают, я сталкивался с вариантом, когда используется дополнительный вывод часов, на котором 1 секунда импульсы, он заведён на прерывание, по прерыванию данные на дисплее обновляются.

  4. Ну может и хорошо, но я сделал проще и понятнее для своего 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);

  5. здравствуйте. а можно с помощью ардуино сделать захват данных с дисплея лсд на 24 пина и выводит данни на тфт. Спасибо

    • Arduino слишком слабая платформа для подобного конвертирования данных на лету. Тут поможет разве что STM32, но там уже совсем другой уровень программирования.
      А что за задача? Может быть проще свой контроллер сделать, и вывод данных сразу ну нужный дисплей.

  6. Код для дисплея не компилируется:
    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(){
    }

  7. сейчас на экране идет отображение данных времени в таком формате 0:0:36
    0 часов 0 минут 36 секунд. можно ли сделать отображение 00:00:36?
    и еще вопрос как сделать так чтобы сперва отображалось время а затем через секунду отображение с датчика DHT11

      • Выручил! %.02d только у меня 4 цыфри %.04d. И теперь цыфри стираються! Спасибо Олег!)

  8. Тоже ,поначалу скетч не компилировался. Надо просто ,уже скачаную «Time»
    добавить в сам скетч:в заголовке скетча появится новый инклуд-
    #include

  9. сейчас на экране идет отображение данных времени в таком формате 0:0:36
    0 часов 0 минут 36 секунд. можно ли сделать отображение 00:00:36?
    Дата сейчас 27:3:2018
    Надо 27:03:2018

  10. Всё вроде сделал правильно: подключил TimeLib, setTime введён правильно, но всё что пишет на LCD экране — это 4 чёрных квадрата. Как решить?

    • А просто вывод текста на экран работает, безо всяких часов? Может подключен неправильно? Проверьте всё 7 раз.

  11. Подскажите пожалуйста, как с монитор порта я могу изменять время на дисплее(настраивать его) и т.д.?

  12. когда я ввёл первый код отобразилиссь целый ряд черных прямоугольников.сколько бы я не крутил потенциометр ряд черных прямоугольников то появлялся то исчезал

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

This site uses Akismet to reduce spam. Learn how your comment data is processed.