Lcd keypad shield

В данной статье мы проведем рестайлинг DIY платы, представляющей из себя  Шилд имеющий на своем борту  символьный дисплей размерности 16×2, а также 5 кнопок (не считая кнопку RESET) для отладки различных проектов на базе Arduino.

Встречайте DIY Z-LCD Keypad Shield V2 

Принципиальная схема: z-lcd-i2c-keypad-shield-diy-schematics

 


 

Функционал

Плата полностью повторяет функционал заводского шилда. Коротко расскажем о её функционале.

Итак, как уже говорилось, на своем борту плата имеет символьный дисплей. Размерность данного дисплея 16х2 символов (ячеек). Работа происходит в четырех битном режиме. Для настройки контрастности экрана служит подстроечный резистор. Для подключения пяти кнопок, благодаря не хитрой схеме с использованием резисторов, используется всего один аналоговый вход. На плате установлен сенсор шилд для аналоговых входов, в верхнем углу платы добавлены дополнительные разъемы +5V и GND. Как и на заводском варианте, имеется разъем для подключения блютуз модуля.

Плата также умеет программно регулировать яркость подсветки, для этого база транзистора соединяется с выводом D9 как показано на рисунке 1. В программном коде на данный вывод подается ШИМ сигнал, от скважности которого и зависит яркость подсветки. Однако, не всем нужна регулировка яркости, да и лишний ШИМ вывод всегда может пригодиться в проекте. В связи с этим, на плате предусмотрена возможность его отключения. Для этого необходимо кинуть перемычку между другими контактными площадками как показано на рисунке 2, тем самым подключив базу транзистора к линии +5V и включив подсветку на максимум. 


 

Задействуемые пины Arduino:

Выводы отвечающие за подключение дисплея:

D2, D3, D4, D5, D6, D7

Выводы отвечающие за яркость подсветки дисплея:

D9 при использовании регулировки подсветки

Выводы отвечающие за подключение кнопок:

A0


 

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

Шилд полностью совместим с программными кодами для заводского варианта, единственное что потребуется — подправить строку инициализации пинов.

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); заменить на LiquidCrystal lcd(2, 3, 4, 5, 6, 7 );

 

 

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

//Тестировалось на Arduino IDE 1.0.5 #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> LiquidCrystal lcd(2, 3, 4, 5, 6, 7 ); // Нажатые кнопкиint button; constint BUTTON_NONE = 0; constint BUTTON_RIGHT = 1; constint BUTTON_UP = 2; constint BUTTON_DOWN = 3; constint BUTTON_LEFT = 4; constint BUTTON_SELECT = 5; int getPressedButton() {   int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)   if (buttonValue < 100) {     return BUTTON_RIGHT;   }   elseif (buttonValue < 200) {     return BUTTON_UP;   }   elseif (buttonValue < 400){     return BUTTON_DOWN;   }   elseif (buttonValue < 600){     return BUTTON_LEFT;   }   elseif (buttonValue < 800){     return BUTTON_SELECT;   }   return BUTTON_NONE; } voidsetup() {   lcd.begin(16, 2);   lcd.print("zelectro.cc"); } voidloop() {   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;   } }

 


 

В архиве лежит шаблон под ЛУТ, Eagle файлы  и список деталей

Открываем изображение => Печать => Во всю страницу


 

Для облегчения распайки smd компонентов с обратной стороны платы, где нет маркировки, приведу кар
тинку. 

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

В процессе поиска компонентов для проекта «Бани на Ардуино» наткнулся на модуль LCD 1602 keypad shield. На борту модуля имеется 5 кнопок и экран 1602. Кнопки + дисплей — это отличное сочетание. Можно организовать многоуровневое меню и с помощью кнопок реализовать перемещение в нем. Модуль отлично подойдет для быстрой отладки приложений, работающих с дисплеем 1602.

Пример программы для работы Ардуино с модулем LCD 1602 keypad shield

Представленный ниже алгоритм, выводит на экран модуля 1602 LCD keypad shield Arduino две строки. В первой строке отображается надпись Temp.: C – место для вывода показаний с датчика температуры. Во второй строке отображается таймер, считающий время после запуска программы.

LCD KeyPad Shield For Arduino SKU: DFR0009

Алгоритм в будущем отлично подойдет для проекта «Ардуино и баня».

#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 &lt; 100) { return BUTTON_RIGHT; } else if (buttonValue &lt; 200) { return BUTTON_UP; } else if (buttonValue &lt; 400){ return BUTTON_DOWN; } else if (buttonValue &lt; 600){ return BUTTON_LEFT; } else if (buttonValue &lt; 800){ return BUTTON_SELECT; } return BUTTON_NONE; }   void setup() { lcd.begin(16, 2); lcd.print(«arduinomania.ru»); }   //в основном цикле также нет ничего сложного, переменной 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 поражают.

В сети можно найти алгоритмы программ от часов до игр!

Метки: Метки LCD 1602Shield

#include <Wire.h> // подключаем штатную библиотеку позволяющую взаимодействовать с I2C/TWI-устройствами
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с дисплеем

LiquidCrystal_I2C lcd(0x3F,16,2); // устанавливаем адрес 0x27 или 0x3F, и дисплей 16 символов в 2 строки (16х2)
static byte addon_letters[16];
void init_rus(const char* letters_use )
{
  static byte letters[][8]   = {
        { B11110, B10000, B10000, B11110, B10001, B10001, B11110, B00000 },//Б
        { B11111, B10000, B10000, B10000, B10000, B10000, B10000, B00000 },//Г
        { B00110, B01010, B01010, B01010, B01010, B11111, B10001, B00000 },//Д
        { B10001, B10101, B10101, B01110, B10101, B10101, B10001, B00000 },//Ж
        { B01110, B10001, B00001, B00110, B00001, B10001, B01110, B00000 },//З
        { B10001, B10001, B10001, B10011, B10101, B11001, B10001, B00000 },//И
        { B10101, B10001, B10001, B10011, B10101, B11001, B10001, B00000 },//Й
        { B00110, B01001, B01001, B01001, B01001, B01001, B11001, B00000 },//Л
        { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 },//П
        { B10001, B10001, B10001, B01111, B00001, B10001, B01110, B00000 },//У
        { B01110, B10101, B10101, B10101, B01110, B00100, B00100, B00000 },//Ф
        { B10010, B10010, B10010, B10010, B10010, B10010, B11111, B00001 },//Ц
        { B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000 },//Ч
        { B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00000 },//Ш
        { B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001 },//Щ
        { B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000 },//Ь
        { B11000, B01000, B01000, B01110, B01001, B01001, B01110, B00000 },//Ъ
        { B10001, B10001, B10001, B11001, B10101, B10101, B11001, B00000 },//Ы
        { B01110, B10001, B00001, B00111, B00001, B10001, B01110, B00000 },//Э
        { B10010, B10101, B10101, B11101, B10101, B10101, B10010, B00000 },//Ю
        { B01111, B10001, B10001, B01111, B00101, B01001, B10001, B00000 },//Я
  };
  static char chars[] = {‘Б’,’Г’,’Д’,’Ж’,’З’,’И’,’Й’,’Л’,’П’,’У’,’Ф’,’Ц’,’Ч’,’Ш’,’Щ’,’Ь’,’Ъ’,’Ы’,’Э’,’Ю’,’Я’};
  static byte empty[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  int index = 0, cl = sizeof(chars)/sizeof(char),i,j,symb;
  memset(addon_letters,0,sizeof(addon_letters));
  for( j = 0; j < strlen(letters_use) && j < 16; j++ )
          lcd.createChar(j, empty);

  for( j = 0; j < strlen(letters_use) && j < 16; j++ )
  {
          symb = -1;
          for( i=0; i < cl; i++ ) if( chars[i] == letters_use[j] ) { symb = i; addon_letters[index] = letters_use[j]; break; }
          if( symb != -1 ) { lcd.createChar(index, letters[symb]); index++; }
  }
}
void print_rus(char *str) {
  static char rus_letters[] = {‘А’,’В’,’Е’,’Ё’,’К’,’М’,’Н’,’О’,’Р’,’С’,’Т’,’Х’};
  static char trans_letters[] = {‘A’,’B’,’E’,’E’,’K’,’M’,’H’,’O’,’P’,’C’,’T’,’X’};
  int lcount = sizeof(rus_letters)/sizeof(char), i, j;
  for( i=0; i<strlen(str); i++ )
  {
        if( byte(str[i]) == 208 ) continue; // 208 ignore
        int found = 0;
        for(j=0; j < 16; j++) if( addon_letters[j] != 0 && byte(str[i]) == byte(addon_letters[j]) ) { lcd.write(j); found = 1; break; }
        if(!found) for(j=0; j < lcount; j++) if( byte(str[i]) == byte(rus_letters[j]) ) { lcd.write(trans_letters[j]); found = 1; break; }
        if(!found) lcd.write(byte(str[i]));
  } 
}
void print_rus(int x, int y, char *str) {
  lcd.setCursor(x, y);
  print_rus(str);
}
void setup() // НАСТРОЙКИ
{
  lcd.init(); // инициализация LCD
  lcd.backlight(); // включаем подсветку
}

void loop() // ОСНОВНОЙ ЦИКЛ
{
  init_rus("ДЛЫЗЙЬЯЖ"); // можно выбрать 8 символов
  lcd.clear(); // устанавливаем курсор на 1 строку, 0 символ
  print_rus(0,0,"++++++++++++++++");
  print_rus(0,1,"ЛЕТО,ЯСНЫЙ ДЕНЬ.");
  delay(3000);
  lcd.clear();
  print_rus(0,0,"ОСЕНЬ СКОРО…");
  print_rus(0,1,"****************");
  delay(3000);
}

Этим уроком я продолжаю серию про шилды. Сегодня мы будем подключать LCD Keypad Shield.

Что он из себя представляет?

Подключение шилда LCD Keypad Shield 1602 к Arduino

Да ничего особенного — просто экран с кнопками, который можно подключить без лишних проводов.

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

Собственно вот он:

Подключать мы будем его к Arduino Mega (вы уже и сами догадались по фотографии).

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

После установки вся наша конструкция будет выглядеть следующим образом:


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

#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

void setup()
{
lcd.begin(16, 2);
lcd.print(«https://ROBOM.ru»);
Serial.begin(9600);
}

void loop(){}

И получим, как видно из кода, следующее:

Если подкрутить потенциометр, то можно изменить цвет шрифта с белого на черный:

Итак, экран работает. Перейдем к нажатию на кнопки на шилде.

Они работают как-то странно и выдают мне частенько разные значения, но, после тестов, я определился, что от 0 до 100 — право, от 200 до 400 — лево и так далее.

Полный список диапазонов вы можете посмотреть в следующем скетче:

#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

int button;

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://ROBOM.ru»);
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;

Как видите, в отличии от сенсорного дисплея, данный дисплей подключается очень легко.

Теги: #Arduino MEGA, #Shield, #LCD, #LCD keypad

Ваша оценка:

Рейтинг: 9.7 (Оценок: 3)

Товары, использованные в данной статье:

← Шаговый двигатель и его драйвер | Сенсорный дисплей TFT 2.4 дюйма →

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

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