Мы в социальных сетях

подчеркивание красное для правой колонки

Наш официальный YouTube канал

подчеркивание красное для правой колонки

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

LCD Keypad Shield и Ардуино

Мы уже давно познакомились с LCD дисплеем, который помогал нам выводить полезную информацию с датчиков. Сегодня же мы познакомимся с улучшенной версией LCD дисплея, которую называют LCD Keypad Shield. Данный shield является очень удобным тем, что к нему подключены 5 активных кнопок, а также 1 кнопка для перезагрузки контроллера, с помощью которых вы сможете управлять некой системой. Его очень удобно использовать для создания проектов из-за того, что он занимает мало места. Подключение кнопок произведено с помощью разных резисторов, подключенных к одному аналоговому выводу. Это позволило сэкономить 5 дискретных пинов, которые мы сможем использовать в других полезных целях. Перейдем к техническим характеристикам для подробного изучения шилда.

Технические характеристики LCD Keypad Shield

LCD Keypad Shield имеет следующие характеристики :

  • Работа дисплея: в 4 битном режиме
  • 5 активных кнопок и 1 кнопка перезагрузки контроллера
  • Максимально разрешение экрана 16x2
  • Для питания шилда необходимо 5 Вольт
  • Частота обновления экрана до 5 Гц

При подключении shielda к Arduino пины "4", "5", "6", "7", "8", "9" будут задействованы для управления LCD дисплея. На аналоговый пин "0" считываются сигналы с кнопок, которые различаются за счет резисторов разного сопротивления. Для управления яркостью и подсветкой шилда используется цифровой пин "10".

Ниже на фотографии показана схема соединения самого шилда. Эта схема нам поможет разобраться в том, как работает LCD Keypad Shield.

LCD Keypad Shield и его соединение

Необходимые компоненты для подключения и описание того, чем мы будем заниматься

Для нашей работы необходимо всего несколько компонентов:

Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.

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


Так чем мы собственно займемся для изучения LCD Keypad Shield ? Мы будем использовать два скетча для подробного изучения. В первом скетче будет показан принцип работы шилда, он будет не сложным для того, чтобы вы поняли, как же работать с ним. Во втором скетче мы рассмотрим более сложный процесс, и в итоге мы получим таймер, которым сможем управлять с помощью наших активных кнопок.

Схема подключения

Подключение LCD Keypad Shield производится стандартным способом. Таким образом мы подключали Motor Shield L293D, Arduino Sensorshield, Uno Protoshield, а также Ethernet Shield и это устройство не является исключением. Для того чтобы напомнить способ подключения, мы привели фотографию ниже. Для работы с данным типом шилда этого подключения хватит, так как дополнительных элементов для осуществления нашей задумки не требуется.

Подключение LCD Keypad Shield к Arduino Подключение LCD Keypad Shield к Ардуино

После подключения перейдем к скетчу, разберемся в нем и сделаем то, что мы затеяли практически.

Первый скетч для освоения работы LCD Keypad Shield

Как уже говорилось раннее, мы сначала рассмотрим простейший скетч для анализа работы шилда. Каждая строчка в скетче подробна расписана после двойного "//"


#include  <LiquidCrystal.h> //подключаем библиотеку

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
int button;  //вводим числовые значения для кнопок
const int BUTTON_NONE   = 0; //присваиваем постоянное значение для BUTTON_NONE 
const int BUTTON_RIGHT  = 1; //присваиваем постоянное значение для BUTTON_RIGHT
const int BUTTON_UP     = 2; //присваиваем постоянное значение для BUTTON_UP
const int BUTTON_DOWN   = 3; //присваиваем постоянное значение для BUTTON_DOWN 
const int BUTTON_LEFT   = 4; //присваиваем постоянное значение для BUTTON_LEFT
const int BUTTON_SELECT = 5; //присваиваем постоянное значение для BUTTON_SELECT

int getPressedButton() //инициализация переменной
{
  int buttonValue = analogRead(0); // считываем значения с аналогового входа
  if (buttonValue < 100) { //если при нажатии кнопки значение меньше 100
    return BUTTON_RIGHT;   // выводим значение BUTTON_RIGHT
  }
  else if (buttonValue < 200) { //если при нажатии кнопки значение меньше 200
    return BUTTON_UP; // выводим значение BUTTON_UP
  }
  else if (buttonValue < 400){ //если при нажатии кнопки значение меньше 400
    return BUTTON_DOWN; // выводим значение BUTTON_DOWN
  }
  else if (buttonValue < 600){ //если при нажатии кнопки значение меньше 600
    return BUTTON_LEFT; // выводим значение BUTTON_LEFT
  }
  else if (buttonValue < 800){ //если при нажатии кнопки значение меньше 800
    return BUTTON_SELECT; // выводим значение BUTTON_SELECT
  }
  return BUTTON_NONE; //иначе, выводим значение BUTTON_NONE
}

void setup()
{
  lcd.begin(16, 2); //Инициализируем дисплей: 2 строки по 16 символов            
  lcd.print("www.helpduino.ru");  //Выводи надпись www.helpduino.ru      
}

void loop()
{
  button = getPressedButton();
  //Присваиваем занчение переменной getPressedButton к переменной button 
  switch (button) //перебираем значения в цикле
  {
  case BUTTON_RIGHT: // при нажатии кнопки со значением BUTTON_RIGHT 
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("                 "); //стираем текст дисплея
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("BUTTON: RIGHT");//выводим надпись BUTTON: RIGHT на экран
    break; //переходим к следующему значению цикла
  case BUTTON_LEFT: // при нажатии кнопки со значением BUTTON_LEFT
     lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("                 "); //стираем текст дисплея
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("BUTTON: LEFT"); //выводим надпись BUTTON: LEFT на экран
    break; //переходим к следующему значению цикла
  case BUTTON_UP: // при нажатии кнопки со значением BUTTON_UP
     lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("                 "); //стираем текст дисплея
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("BUTTON: UP"); //выводим надпись BUTTON: UP на экран
    break; //переходим к следующему значению цикла
  case BUTTON_DOWN: // при нажатии кнопки со значением BUTTON_DOWN
     lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("                 "); //стираем текст дисплея
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("BUTTON: DOWN"); //выводим надпись BUTTON: DOWN на экран
    break; //переходим к следующему значению цикла
  case BUTTON_SELECT: // при нажатии кнопки со значением BUTTON_SELECT
     lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("                 "); //стираем текст дисплея
    lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
    lcd.print("BUTTON: SELECT"); //выводим надпись BUTTON: SELECT на экран
    break; //переходим к следующему значению цикла
  }
}

Пояснения к скетчу

Проект с LCD Keypad Shield и Arduino

И так, когда вы выгрузите скетч в программу и загрузите ее к вашему Arduino, то у вас откроется стартовая страница. При нажатии кнопки на экране шилда появится название кнопки, на которую вы нажали. Этот скетч помогает разобраться в управлении самого LCD Keypad Shield и понять принцип его работы.

Ниже мы представили текст, который получается при нажатии различных кнопок.

Второй скетч для освоения работы LCD Keypad Shield

К вашему вниманию представлен скетч, который при загрузке в Arduino сделает из LCD Keypad Shield настоящий таймер. Причем вы сможете с помощью кнопок устанавливать время до срабатывания. Этот скетч - пример интерпретации шилда в очень интересный проект.

#include  <LiquidCrystal.h> //подключаем библиотеку 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
int x; //шина кнопок                
unsigned long currentTime; //текущее время
unsigned long loopTime; //время окончания
unsigned long LimitTime = 0; //добавочное время таймера
boolean running = false; //Флаг Запуска отсчета

 
void setup()
{
   lcd.begin(16, 2); //Инициализируем дисплей: 2 строки по 16 символов
   lcd.print("Timer"); //заставка 
   delay(500); //ждем половину секунды
   lcd.begin(16, 2); //очистить экран
   lcd.print("www.Helpduino.ru"); //заставка 
   delay(500); //ждем половину секунды
   lcd.begin(16, 2); //очистить экран
   currentTime = millis(); 
   // считываем время, прошедшее с момента запуска программы 
}
void loop()
{                           
   if (running == true) {    //Выбран РЕЖИМ ОТСЧЕТА 
   currentTime = millis();
  
  loopTime = currentTime + LimitTime; 
  //Указываем время окончания (текущее время + добавочное время таймера)
  while(currentTime < loopTime){
  // сравниваем текущее время с вр окончания
  //Пока текущее время меньше времени окончания
  //Проверяем кнопку "Прервать"
  x = analogRead (0); //считываем шину кнопок
  delay(200); //защита от дребезга
  if (x < 100) { // Если нажата кнопка "Right "
  //"прервать" кнопка "Right " 
  lcd.begin(16, 2); //очистить экран
  lcd.print("Interrupted"); //выводим прервано
  //устанавливаем начальные значения
  running = false; //останавливаем таймер
  LimitTime = 0; //устанавливаем начальные значения
  delay(3000); //пауза 3 секунды
  lcd.begin(16, 2); //очистить экран
  goto bailout; //переход на опрос клавиатуры
   } 
  lcd.begin(16, 2); //очистить экран
  lcd.setCursor(0, 0); //курсор в 0
  lcd.print("Time to off: "); //время до окончания
  lcd.setCursor(13, 0); //Устанавливаем курсор
  lcd.print(LimitTime/1000);
  //Указываем добавочное время, переводя миллисекунды в секунды 
  delay(800); //ждем 0.8 секунды
  LimitTime = LimitTime - (millis() - currentTime);
  //уменьшаем таймер для вывода на экран 
  currentTime = millis(); //получаем новое время 
   } 
  //окончание работы таймера
  lcd.print("             "); //стираем экран
  lcd.setCursor(0, 0); // установка курсора на нулевую строку
  lcd.print("Timer: OFF"); //Выводим надпись "Timer: OFF"
  running = false; //останавливаем таймер
  delay (3000); //ждем 3 секунды
  lcd.begin(16, 2); //очистить экран
   }
  else { //иначе, выбираем режим отсчета
  bailout:
  keypad ();
  }  
 } 
  void keypad () { //функция опроса клавиш: вверх, вниз и выбор
  x = analogRead (0); //считываем шину кнопок 
  delay(200); //ожидаем 0.2 секунды
  lcd.setCursor(0,1); //устанавливаем курсор
  lcd.print ("                "); //стираем экран
  lcd.setCursor(0,0);  //устанавливаем курсор
  lcd.print ("Time:");  //выводим слово "Time:"
   
  if (x < 200) { // если нажата клавиша вверх
    
    if ((LimitTime + 60000) <= 300005)
    //если мы указываем время меньше или равно 5 минутам минут 
    {
    LimitTime += 60000; // прибавляем 1 минуту
    lcd.setCursor(7,0); //устанавливаем курсор
    lcd.print (LimitTime/60000); //выводим значение таймера в секундах 
    }
    else {
    //иначе, при попытке прибавить больше 5 минут
    lcd.setCursor(0,1); //устанавливаем курсор
    lcd.print ("maximum 5 min"); //выводим надпись "maximum 5 min"
    delay (1000); //ждем 1 секунду
    lcd.setCursor(0,1); //устанавливаем курсор
    lcd.print ("               "); //стираем экран
    }
  } 
  else if (x < 400){  //иначе, если нажимаем кнопку вниз
    if (LimitTime  > 60000) // если мы указываем время больше 1 минуты
    {
    LimitTime -= 60000; //отнимаем 1 минуту
    lcd.setCursor(7,0); //устанавливаем курсор
    lcd.print (LimitTime/60000); //выводим значение таймера в секундах
    }
    else { // иначе, при выборе значения меньше 1 минуты
    lcd.setCursor(0,1); //устанавливаем курсор
    lcd.print ("minimum 1 min"); //выводим надпись "minimum 1 min"
    delay (1000); //ждем 1 секунду
    lcd.setCursor(0,1); //устанавливаем курсор
    lcd.print ("               "); //стираем экран
    }
    
  } 
  
  else if (x < 600){ //иначе, если нажимаем на кнопку left
    if (LimitTime !=0 ) //если добавочное время равно 0
    {running = true;                //Устанавливаем запуск отсчета
    lcd.begin(16, 2);
    lcd.setCursor(0,0); //устанавливаем курсор
    lcd.print ("Start"); //выводим надпись "Start"
   delay(1000); } //ждем 1 секунду
   else { //иначе, если не выбрали время
   lcd.setCursor(0,1); //устанавливаем курсор
   lcd.print ("Warning"); //выводим надпись "Warning"
   delay(700);//ждем 0.7 секунды
   }
  }
  } // Конец
   
 

Комментарии к программному коду

Таймер, сделанный с помощью LCD Keypad Shield и Ардуино

Как вы могли заметить, команда "HelpDuino" постаралfсь подробно описать суть каждой написанной строки в скетче. Как уже говорилось ранее, вы с помощью данного программного кода сможете сделать таймер из вашего arduino и LCD Keypad Shield. Для управления таймером понадобятся четыре активные кнопки: "right", "left", "down" и "up" . Кнопки "down" и "up" нужны для выбора времени, через которое сработает таймер. Кнопкb "left" и "right" нужнs для запуска или остановки таймера соответсвенно.


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


Надеюсь у вас все получилось! Если у вас остались вопросы, можете написать нам в вконтакте или в комментариях ниже. Мы постараемся ответить на ваши вопросы в скором времени!


Вам возможно будет интересно

Комментарии