Что он из себя представляет? Да ничего особенного - просто экран с кнопками, который можно подключить без лишних проводов.
Единственной особенностью является потенциометр на плате. Поначалу я не мог понять, для чего он нужен, но потом выяснилось, что он меняет цвет текста. Если его подкручивать, то цвет теста может быть белый, черный, серый, и голубой (или прозрачный - я так и не понял;)
Собственно вот он:
Подключать мы будем его к Arduino Mega (вы уже и сами догадались по фотографии).
Сложностей при подключении просто быть не может - расположение ног само подскажет вам как и куда правильно его воткнуть.
После установки вся наша конструкция будет выглядеть следующим образом:
А теперь приступим к написанию кода: для начала проверим дисплей на работоспособность.
#include
#include
void setup()
{
lcd.begin(16, 2);
lcd.print("https://сайт");
Serial.begin(9600);
}
void loop(){}
И получим, как видно из кода, следующее:
Если подкрутить потенциометр, то можно изменить цвет шрифта с белого на черный:
Итак, экран работает. Перейдем к нажатию на кнопки на шилде.
Они работают как-то странно и выдают мне частенько разные значения, но, после тестов, я определился, что от 0 до 100 - право, от 200 до 400 - лево и так далее.
Полный список диапазонов вы можете посмотреть в следующем скетче:
#include
#include
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int getButt()
{
int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)
Serial.println(buttonValue);
if (buttonValue < 100) {
return 1;
}
else if (buttonValue < 200) {
return 2;
}
else if (buttonValue < 400){
return 3;
}
else if (buttonValue < 600){
return 4;
}
else if (buttonValue < 800){
return 5;
}
return 0;
}
void setup()
{
lcd.begin(16, 2);
lcd.print("https://сайт");
Serial.begin(9600);
}
void loop()
{
button = getButt();
if(button != 0){ // если кнопка нажата то очищаем экран
lcd.setCursor(0, 0);
lcd.clear();
}
switch (button)
{
case 1:
lcd.print("RIGHT");
break;
case 2:
lcd.print("LEFT");
break;
case 3:
lcd.print("UP");
break;
case 4:
lcd.print("DOWN");
break;
case 5:
lcd.print("SELECT");
break;
}
}
Код достаточно простой, поэтому фото приводить не буду, но есть одно небольшое но - когда кнопка зажата, вызов очистки и отрисовки экрана происходит каждый раз, вследствие этого экран начинает переливаться как на фото снизу:
Лечится все это просто - добавляем последнюю нажатую кнопку и сверяемся с ней. Если изменений не было, то не делаем ничего.
Int button, last_button; // так должна выглядеть строка 6
// меняем строку 39 на следующий код
button = getButt();
if(button == last_button){
return;
}
last_button = button;
Как видите, в отличии от сенсорного дисплея, данный дисплей подключается очень легко.
Or Freeduino board. It includes a 2x16 LCD display and 6 momentary push buttons. Pins 4, 5, 6, 7, 8, 9 and 10 are used to interface with the LCD. Analog Pin 0 is used to read the push buttons. The LCD shield supports contrast adjustment and backlit on/off functions. It also expands analog pins for easy analog sensor reading and display.
Sample Code
/******************************************************* Description: Reads an analog input on pin 1, prints the result to the LCD. This program takes the temperture sensor LM35 for example. Connection: Plug the LCD Keypad to the UNO(or other controllers) Temperture sensor: S(blue) -- A1() Note: A0 has been occupied. VCC(red) -- VCC GND(black) -- GND ********************************************************/ #includeExpected Results
FAQ
Q&A | Some general Arduino Problems/FAQ/Tips |
---|---|
Q1 | I do not understand your schematic. There are too many connectors illustrated than are actually on the shield. Could you show me a mapping? |
A1 | The J1-J8 include the both the user interface, i.e. Analog pins, APC220(Serial) pins, Digital pins, and the pins connected with the lower Arduino card, e.g. Uno/ Leonardo. Here is a simple mapping picture. |
Q2 | Why my LCD keypad cannot display anything on the while all right on ? |
A2 | It works well if uploaded by Arduino 1.5.3 version, however, the latest 1.6.* have discard pin Definition for Edison . So you have to add pinMode(); into the setup() like this: |
Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок – только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.
Основные области применения шилда: создание управляющих модулей, реализующих настройки устройства с помощью интерфейса меню. Экран шилда можно использовать для вывода информации, получаемой с датчиков, с возможностью выполнения пользователем каких-либо действий путем нажатия на встроенные кнопки. Естественно, можно найти и другие способы использования платы: например, реализовать игру типа тетрис.
Технические характеристики
- Тип дисплея: LCD 1602, символьный, 4-х битный режим.
- Разрешение: 16×2 (две строки по 16 символов каждая). Знакоместо 5×8 точек.
- Цвет дисплея: синий (возможны варианты с желтым и зеленым цветом). Буквы белого цвета.
- Технология: STN, Transflective, Positive.
- Контроллер дисплея: HD44780U.
- Предельная частота обновления экрана: 5Гц
- Питание дисплея: 5 Вольт
- Кнопки: 6 кнопок (5 кнопок управления и Reset).
- Дополнительные элементы: регулировка яркости подсветки (потенциометр).
- Рабочая температура экрана: от -20 °С до +70 °С;
- Температура хранения экрана: от -30 °С до +80 °С.
Распиновка LCD shield для подключения к Arduino
Контакт дисплея LCD 1602 | Описание | Контакт на LCD Shield |
Пины LCD экрана | ||
GND | Земля | |
VDD | Питание 5В | |
Contrast | Управление контрастом | Потенциометр |
RS | Команды/Данные | 8 |
R/W | Чтение/Запись | |
Enable | Включение (активирование) | 9 |
DB0 | Не используется | |
DB1 | Не используется | |
DB2 | Не используется | |
DB3 | Не используется | |
DB4 | Дата 1 | 4 |
DB5 | Дата 2 | 5 |
DB6 | Дата 3 | 6 |
DB7 | Дата 4 | 7 |
Back LED + | Включение подсветки | 10 |
Back LED – | Питание подсветки | |
Пины для кнопок | ||
Кнопка UP | Управляющая кнопка | A0 |
Кнопка DOWN | Управляющая кнопка | A0 |
Кнопка LEFT | Управляющая кнопка | A0 |
Кнопка RIGHT | Управляющая кнопка | A0 |
Кнопка SELECT | Управляющая кнопка | A0 |
Reset | Reset | |
ICSP | ICSP для перепрошивки встроенного микроконтроллера HD44780U | |
UART | Контакты для UART соединения | 0, 1 |
Дополнительные элементы шилда
- Индикаторный светодиод (включается при подключении питания к плате).
- Контактные площадки для подключения аналоговых устройств (GND, VSS, пин данных).
- Потенциометр для регулирования контрастностью экрана.
Подключение платы LCD Shield к Arduino
Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.
Скетч для экрана на Arduino LCD shield
Для работы с LCD экранами обычно используют популярную библиотеку LiquidCrystal . На этапе инициализации создается объект класса LiquidCrystal, в конструкторе которого мы указываем пины с подключенными контактами экрана. Для нашего шилда требуется использовать такой вариант: LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Последовательность аргументов конструктора:
- RS (8)
- Enable (9)
- data(4)
- data(5)
- data(6)
- data(7)
Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:
Lcd.begin(16, 2);
Для вывода информации на дисплей используем метод print():
Lcd.print (“Arduino Master!”);
Текст выведется в место текущего нахождения курсора (в начале работы скетча это первая строка и первый символ). Для указания произвольного положения курсора можно использовать функцию setCursor(<столбец>, <строка>):
Lcd.setCursor(0, 0); // Первый символ первой строки lcd.setCursor(0, 1); // Первый символ второй строки lcd.setCursor(2, 1); // Третий символ второй строки
Кнопки LCD Keypad Shield
На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции ;
Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:
Нажатие кнопки | Значение на аналоговом пине |
RIGHT | 0-100 |
UP | 100-200 |
DOWN | 200-400 |
LEFT | 400-600 |
SELECT | 600-800 |
Клавиша не нажата | 800-1023 |
Пример скетча работы с кнопками LCD Keypad Shield:
Int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right // Выполняем какое-то действие для кнопки вправо. } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP // Выполняем какое-то действие для кнопки вверх } else if (keyAnalog < 400) { // Значение больше 200, но меньше 400 – нажата кнопка DOWN // Выполняем действие для кнопки вниз } else if (keyAnalog < 600) { // Значение больше 400, но меньше 600 – нажата кнопка LEFT // Выполняем действие для кнопки влево } else if (keyAnalog < 800) { // Значение больше 600, но меньше 800 – нажата кнопка SELECT // Выполняем действие для кнопки выбора пункта меню } else { // Все остальные значения (до 1023) будут означать, что нажатий не было }
В выбранном методе кодирования есть два главных недостатка:
- Нельзя отслеживать одновременное нажатие нескольких кнопок;
- Возможные искажения сигнала могут привести к ложным срабатываниям.
Нужно учитывать эти ограничения, выбирая этот шлд в своих проектах, если вы планируете использовать устройство в системах с большим количеством помех, которые могут искажать сигнал на входе A0, из-за чего АЦП может сформировать ошибочное значение и скетч в результате выполнит другие инструкции.
Пример скетча для работы с экраном и кнопками меню
В данном примере мы определяем текущую нажатую кнопку и выводим ее название на экран. Обратите внимание, что для удобства мы выделили операцию определения кнопки в отдельную функцию. Также в скетче мы выделили отдельный метод для вывода текста на экран. В ней мы показываем сообщение (параметр message) и очищаем его через секунду. Нужно помнить, что в течение этой секунды нажатия кнопок не обрабатываются
#include
Краткие выводы по плате расширения LCD keypad shield
Плата расширения LCD Keypad достаточно популярная, она проста и удобна для использования в проектах Arduino. Сегодня ее можно легко купить практически в любом интернет-магазине.
Плюсы LCD Shield:
- Упрощает подключение жидкокристаллического экрана.
- Уменьшает общие размеры устройства, т.к. убирает выступающие провода и монтажные платы.
- Сокращает количество ошибок, связанных с неправильным монтажом и подключением.
- Добавляет функциональность кнопочного управления, если на плате установлены кнопки (LCD Keypad shield).
Недостатки:
- Стоимость шилда выше, чем стоимость отдельного экрана.
- Не всегда нужна дополнительная функциональность в виде кнопок.
- Шилд потребляет больше энергии, чем отдельные элементы платы.
Проект, который отлично впишется в интерьер вашего DIY угла, комнаты, гаража или офиса, в котором вы собираете роботов и всякие гиковские автоматизированные проекты на Arduino.
На выходе проекта вы получите в пределах одного модуля следующие фичи:
- Часы!;
- Отображение даты и времени на LCD экране;
- Встроенный счетчик времени (для того, чтобы засекать время, затраченное на один проект);
- Будильник (чтобы напоминать о том, что вы засиделись и пора устроить себе разминку);
- Отслеживание движения (сберегает заряд аккумулятора, отключая LCD экран, когда вас нет рядом);
- Отлично впишется в ваш интерьер Arduino-разработчика!
Необходимые материалы для проекта
- LCD Keypad Shield (LCD шилд с кнопками) для Arduino (в данном случае - от производителя DFRobot)
- Часы реального времени (RTC) DS1307 (от Adafruit);
- Закрывающийся бокс (можно найти в радиомагазине или заказать у китайцев);
- Зуммер (Piezo Buzzer);
- PIR (Пассивный инфракрасный датчик движения);
- Проводники мама/мама;
- Джек 2.1 мм;
- Переходник для батарейки 9 В 5.5 мм / 2.1 мм;
- Крона 9 В.
Сборка модуля часов реального времени
Порой модуль часов реального времени (например, от компании Adafruit DS1307), поставляется в виде отдельных компонентов. Сборка не должна вызвать проблем. Тем более, есть отличная инструкция по использованию и сборке модуля часов реального времени . Как правило, батарейка идет в комплектации модуля. Работать от одной батарейки он будет не меньше трех лет.
Коннектор для питания
Для того, чтобы не возникало проблем с подключением Arduino, используется джек на 2.1 мм, к которому припаены контакты. В боксе сделано отверстие, джек посажен на клей. Теперь подключение Arduino не составляет проблем.
Батарейка (крона) на 9 В просто устанавливается на заднюю часть бокса.
Если вы обратили внимание, в боксе есть еще одно отверстие. Это была первая неудачная попытка. Джек в это отверстие не поместился.
Подсоединяем провода ко всем элементам
Очень рекомендую закупить разноцветные проводники типа мама/мама. Стоят они недорого, а процесс сборки облегчают очень сильно. Подключаем проводники к модулю часов реального времени, ПИР датчику движения , зуммеру, чтобы в дальнейшем подключить их к LCD шилду.
Подключаем все к LCD шилду
После этого добавлен кусок кода из скетча от DFRobot для LCD шилда (включая опцию управления кнопками). Этот скетч можно скачать .
Функции кнопок
На LCD шилде кнопки подписаны (смотрите на фото). Первые пять из шести доступных кнопок (button) были запрограммированы следующим образом:
Кнопка #1 (подписана SELECT) - это кнопка Menu. Эта кнопка отвечает за отображение листаемого списка доступных функций (таймер, установка будильника).
Кнопка #2 (подписана LEFT) - кнопка Select. Служит для выбора функции. Примечание: также используется для инкремента на 10 , когда выбраны часы, минуты и т.п.
Кнопки #3 и 4 (подписаны UP и DOWN) - кнопки Increment и Decrement (инкремент и декремент). Используются для уменьшения и увеличения часов и минут при настройке таймера или будильника. Используются также для переключения между временами суток AM и PM.
Кнопка #5 (подписана RIGHT) - GO! Используется для принятия выбранного значения (например, настроенных минут или часов).
Кнопка #6 (отмечена RST) - Reset, которая перезагружает наш Arduino.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
В процессе поиска компонентов для проекта «Бани на Ардуино» наткнулся на модуль LCD 1602 keypad shield. На борту модуля имеется 5 кнопок и экран 1602. Кнопки + дисплей - это отличное сочетание. Можно организовать многоуровневое меню и с помощью кнопок реализовать перемещение в нем. Модуль отлично подойдет для быстрой отладки приложений, работающих с дисплеем 1602.
Пример программы для работы Ардуино с модулем LCD 1602 keypad shield
Представленный ниже алгоритм, выводит на экран модуля 1602 LCD keypad shield Arduino две строки. В первой строке отображается надпись Temp.: C – место для вывода показаний с датчика температуры. Во второй строке отображается таймер, считающий время после запуска программы. Алгоритм в будущем отлично подойдет для проекта .
#include "Time.h" //библиотека для работы со временем #include "LiquidCrystal.h" //библиотека для работы с дисплеем LCD 1602. Некоторые люди ищут в сети русификатор библиотеки LCD 1602 keypad shield, не понимаю зачем, но с уверенностью могу сказать, что его нет))) LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //выводы необходимые для работы дисплея. //При работе с модулем 1602 LCD keypad shield Arduino эти выводы заняты всегда и их не поменять, //в противном случае возникнут проблемы с отладкой void setup() { //настройки дисплея pinMode(9, OUTPUT); analogWrite(9,100); lcd.begin(16,2); //настройки времени setTime(0,0,0,1,10,2015); } void loop() { //вывод данных на дисплей lcd.clear(); lcd.print("Temp.: "); lcd.print(" C"); lcd.setCursor(0, 1); lcd.print("Time: "); lcd.print(hour()); lcd.print(":"); lcd.print(minute()); lcd.print(":"); lcd.print(second()); delay(1000); //без задержки дисплей будет мерцать, //поэтому лучше использовать ее кратную времени таймера }
Для тех, кому не терпится проверить, как работают кнопки модуля LCD 1602 keypad shield, привожу рабочий демонстрационный скетч для Ардуино. Код был найден в сети, мною добавлены исчерпывающие комментарии и исправлены ошибки.
#include "Wire.h" // библиотека для работы с протоколом I2C #include "LiquidCrystal.h" //библиотека для работы с дисплеем LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //как обычно, пины необходимые для работы LCD 1602 keypad shield int button; //переменная хранит данные о текущей активированной кнопке // константы нажатых кнопок const int BUTTON_NONE = 0;//ничего не нажато const int BUTTON_RIGHT = 1;//нажата кнопка вправо const int BUTTON_UP = 2;//нажата кнопка вверх const int BUTTON_DOWN = 3;//нажата кнопка вниз const int BUTTON_LEFT = 4;//нажата кнопка влево const int BUTTON_SELECT = 5;//нажата кнопка выбор //процедура определения нажатой кнопки int getPressedButton() { int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue < 100) { return BUTTON_RIGHT; } else if (buttonValue < 200) { return BUTTON_UP; } else if (buttonValue < 400){ return BUTTON_DOWN; } else if (buttonValue < 600){ return BUTTON_LEFT; } else if (buttonValue < 800){ return BUTTON_SELECT; } return BUTTON_NONE; } void setup() { lcd.begin(16, 2); lcd.print("сайт"); } //в основном цикле также нет ничего сложного, переменной button передается информация о нажатой кнопке //и с помощью оператора выбора на экран выводится информация сигнализирующая какая кнопка была нажата void loop() { button = getPressedButton(); switch (button) { case BUTTON_RIGHT: // при нажатии кнопки выводим следующий текст lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: RIGHT"); break; case BUTTON_LEFT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: LEFT"); break; case BUTTON_UP: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: UP"); break; case BUTTON_DOWN: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: DOWN"); break; case BUTTON_SELECT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: SELECT"); break; } }
Примеры проектов на 1602 LCD keypad shield Arduino поражают. В сети можно найти алгоритмы программ от часов до игр!