LCD 1602 Keypad Shield

Описание

LCD Keypad Shield - простое и удобное решение для простых проектов, где требуется отобразить текстовую информацию на дисплее. Дисплей позволяет отображать латиницу в 2 строки по 16 символов в каждой из них. Поддерживается режим бегущей строки.

Для регулировки яркости на плате расположен потенциометр. Подсветка дисплея синего цвета.

Обратите внимание! Диапазон яркости подсветки символов на дисплее довольно большой. Поэтому может понадобиться выполнить несколько оборотов (5-10) потенциометра для настройки нужного свечения.

Дополнительно на плате расположено 5 функциональных кнопок с помощью которых можно перемещаться по дисплею, а также запрограммировать их на определенные действия. Шестая кнопка выполняет функцию перезагрузки контроллера.

Особенности нажатия кнопок

На шилде расположено шесть кнопок. Одна из них - RST - связана с выводом Reset контроллера и отвечает за его перезагрузку. Остальные подключены к одному и тому же выводу контроллера - A0. Это сделано, чтобы выводы кнопок не занимали много выводов контроллера. В зависимости от нажатой кнопки в цепи создаётся различное сопротивление и таким образом определяется нажатая кнопка. Точные значения сопротивления могут немного отличаться в разных платах. Однако, Вы можете сами установить нужное сопротивление и изменить его в своих проектах.

Технические характеристики

  • Рабочее напряжение: 5 В
  • Тип дисплея: LCD
  • Количество символов в строке: 16
  • Количество строк: 2
  • Язык (по умолчанию): латиница

Физические размеры

  • Шилд Д х Ш х В: 80 х 58 х 19 мм

Пример подключения и использования

Определение нажатой кнопки

Описание: В данном примере будет показано как определить какая кнопка была нажата.

Приготовьте детали:

Что нужно: Кол-во, шт
Контроллер Smart UNO 1
LCD 1602 Keypad Shield 1

Схема подключения: Установите шилд поверх контроллера Smart Uno.

Загрузите на контроллер скетч:

#include  <LiquidCrystal.h> //подключение библиотеки
 
#define BUTTON_NONE 0   //значение для BUTTON_NONE
#define BUTTON_RIGHT 1  //значение для BUTTON_RIGHT
#define BUTTON_UP 2     //значение для BUTTON_UP
#define BUTTON_DOWN 3   //значение для BUTTON_DOWN
#define BUTTON_LEFT 4   //значение для BUTTON_LEFT
#define BUTTON_SELECT 5 //значение для BUTTON_SELECT
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); //создание объекта дисплея
 
int getPressedButton() //инициализация переменной
{
  int buttonValue = analogRead(0); // чтение значения с аналогового входа
  delay(200); //защита от дребезга
 
  if (buttonValue < 50) { //если при нажатии кнопки значение меньше 50
    return BUTTON_RIGHT;   // значит нажата кнопка BUTTON_RIGHT
  }
  else if (buttonValue < 150) { //если при нажатии кнопки значение меньше 150
    return BUTTON_UP; // значит нажата кнопка BUTTON_UP
  }
  else if (buttonValue < 300) { //если при нажатии кнопки значение меньше 300
    return BUTTON_DOWN; // значит нажата кнопка BUTTON_DOWN
  }
  else if (buttonValue < 500) { //если при нажатии кнопки значение меньше 500
    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("smartelements.ru");  //Выводи надпись www.smartelements.ru
  delay(1000); //задержка 1 сек
}
 
void loop()
{
  int button = getPressedButton(); //получение нажатой кнопки
 
  lcd.clear(); // очистка дисплея
  switch (button) //в зависимости от нажатой кнопки
  {
    case BUTTON_RIGHT: // при нажатии кнопки со значением BUTTON_RIGHT
      lcd.print("BUTTON: RIGHT");//вывести надпись BUTTON: RIGHT на экран
      break; //прервать выполнение
    case BUTTON_LEFT: // при нажатии кнопки со значением BUTTON_LEFT
      lcd.print("BUTTON: LEFT"); //вывести надпись BUTTON: LEFT на экран
      break; //прервать выполнение
    case BUTTON_UP: // при нажатии кнопки со значением BUTTON_UP
      lcd.print("BUTTON: UP"); //вывести надпись BUTTON: UP на экран
      break; //прервать выполнение
    case BUTTON_DOWN: // при нажатии кнопки со значением BUTTON_DOWN
      lcd.print("BUTTON: DOWN"); //вывести надпись BUTTON: DOWN на экран
      break; //прервать выполнение
    case BUTTON_SELECT: // при нажатии кнопки со значением BUTTON_SELECT
      lcd.print("BUTTON: SELECT"); //вывести надпись BUTTON: SELECT на экран
      break; //прервать выполнение
  }
}

Установка и запуск таймера

Описание: Создадим таймер, с возможностью управления им пользователем. Функциональные кнопки:

  • кнопка ВПРАВО: сброс таймера (если он в данный момент запущен)
  • кнопка ВЛЕВО: запуск таймера
  • кнопка ВВЕРХ: увеличение количества минут
  • кнопка ВНИЗ: уменьшение количества минут

Приготовьте детали:

Что нужно: Кол-во, шт
Контроллер Smart UNO 1
LCD 1602 Keypad Shield 1

Схема подключения: Установите шилд поверх контроллера Smart Uno.

Загрузите на контроллер скетч:

#include  <LiquidCrystal.h> //подключение библиотеки
 
#define BUTTON_NONE 0   //значение для BUTTON_NONE
#define BUTTON_RIGHT 1  //значение для BUTTON_RIGHT
#define BUTTON_UP 2     //значение для BUTTON_UP
#define BUTTON_DOWN 3   //значение для BUTTON_DOWN
#define BUTTON_LEFT 4   //значение для BUTTON_LEFT
#define BUTTON_SELECT 5 //значение для BUTTON_SELECT
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); //создание объекта дисплея
 
unsigned long currentTime = 0;    //текущее время
unsigned long loopTime = 0;       //время окончания
unsigned long LimitTime = 0;  //добавочное время таймера
boolean running = false;      //Флаг Запуска отсчета
 
int getPressedButton() //инициализация переменной
{
  int buttonValue = analogRead(0); // чтение значения с аналогового входа
  delay(200); //защита от дребезга
 
  if (buttonValue < 50) { //если при нажатии кнопки значение меньше 50
    return BUTTON_RIGHT;   // значит нажата кнопка BUTTON_RIGHT
  }
  else if (buttonValue < 150) { //если при нажатии кнопки значение меньше 150
    return BUTTON_UP; // значит нажата кнопка BUTTON_UP
  }
  else if (buttonValue < 300) { //если при нажатии кнопки значение меньше 300
    return BUTTON_DOWN; // значит нажата кнопка BUTTON_DOWN
  }
  else if (buttonValue < 500) { //если при нажатии кнопки значение меньше 500
    return BUTTON_LEFT; // значит нажата кнопка BUTTON_LEFT
  }
  else if (buttonValue < 800) { //если при нажатии кнопки значение меньше 800
    return BUTTON_SELECT; // значит нажата кнопка BUTTON_SELECT
  }
  return BUTTON_NONE; //иначе, нажата кнопка BUTTON_NONE
}
 
//сброс значений связанных с таймером
void reset_values()
{
  running = false;  // останавливаем таймер
  LimitTime = 0;    // сброс значения таймера
  delay(3000);      // пауза 3 секунды
  lcd.clear();      // очистить экран
}
 
//запуск таймера и отсчёт времени
void run_timer()
{
  currentTime = millis(); //текущее время
  loopTime = currentTime + LimitTime; //время окончания (текущее время + добавочное время таймера)
 
  while (currentTime < loopTime) { // сравнение текущего времени с временем окончания
 
    int button = getPressedButton(); //проверка на кнопку "Прервать"
 
    if (button == BUTTON_RIGHT) { // если нажата кнопка "RIGHT" - прервать
      lcd.clear(); // очистить экран
      lcd.print("Interrupted"); // вывод "прервано"
      reset_values(); //сброс значений
      return; //выход из процедуры
    }
 
    lcd.clear(); // очистить экран
    lcd.print("Time to off: "); // вывод надписи
    lcd.setCursor(13, 0); // установка курсора на 13 позицию
    lcd.print(LimitTime / 1000); // указать добавочное время, переводя миллисекунды в секунды
 
    delay(800); // задержка 0.8 секунды
    LimitTime = LimitTime - (millis() - currentTime);
    currentTime = millis(); //получить новое время
  }
 
  //окончание работы таймера
  lcd.clear(); // очистить экран
  lcd.print("Timer: OFF"); // вывести надпись "Timer: OFF"
  reset_values(); //сброс значений
}
 
//показать сообщение об ошибке на второй строке дисплея
void showError(String message)
{
  lcd.setCursor(0, 1); // установка курсора во вторую строку
  lcd.print (message); // вывести надпись ошибки
  delay (1000); //пауза 1 секунду
  lcd.setCursor(0, 1); // установка курсора во вторую строку
  lcd.print ("               "); //очистить строку
}
 
void setup()
{
  lcd.begin(16, 2); //Инициализация дисплея: 2 строки по 16 символов
  lcd.print("smartelements.ru");  //Выводи надпись www.smartelements.ru
  delay(1000); //задержка 1 сек
  Serial.begin(9600);
}
 
void loop()
{
  if (running == true) {  // таймер запущен
    run_timer(); // обработка таймера
  }
 
  //ожидание ввода команд пользователем
  keypad();
}
 
//ожидание ввода команд пользователем
void keypad()
{
 
  lcd.clear(); // очистить экран
  lcd.print ("Time:");  //вывести слово "Time:"
  lcd.setCursor(7, 0); // установить курсор
  lcd.print(LimitTime / 60000); //вывести значение таймера в минутах
 
  int button = getPressedButton(); //проверка на кнопку "Прервать"
  switch (button) //в зависимости от нажатой кнопки
  {
    case BUTTON_UP: // при нажатии кнопки со значением BUTTON_UP
      if ((LimitTime + 60000) <= 300000) //если время меньше или равно 5 минутам
      {
        LimitTime += 60000; // прибавляем 1 минуту
      }
      else { //иначе, при попытке прибавить больше 5 минут
        showError("maximum 5 min"); // показать сообщение об ошибке
      }
      break; //прервать выполнение
    case BUTTON_DOWN: // при нажатии кнопки со значением BUTTON_DOWN
      if (LimitTime  > 60000) // если время больше 1 минуты
      {
        LimitTime -= 60000; // отнять 1 минуту
      }
      else { // иначе, при выборе значения меньше 1 минуты
        showError("minimum 1 min"); // показать сообщение об ошибке
      }
      break; //прервать выполнение
    case BUTTON_LEFT: // при нажатии кнопки со значением BUTTON_LEFT
      if (LimitTime != 0 ) //если добавочное время равно 0
      {
        running = true;                //Устанавливаем запуск отсчета
        lcd.clear(); // очистить экран
        lcd.print ("Start"); //выводим надпись "Start"
        delay(1000);
      } //ждем 1 секунду
      else { //иначе, если не выбрали время
        showError("no time selected"); // показать сообщение об ошибке
      }
      break; //прервать выполнение
  }
}