Подключение LCD Keypad Shield к Arduino
Мы уже давно познакомились с 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.
Необходимые компоненты для подключения и описание того, чем мы будем заниматься
Для нашей работы необходимо всего несколько компонентов:
Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.
Для большего удобства вы можете кликнуть мышкой по названию в списке выше, чтобы перейти к покупке товара.
Так чем мы собственно займемся для изучения LCD Keypad Shield ? Мы будем использовать два скетча для подробного изучения. В первом скетче будет показан принцип работы шилда, он будет не сложным для того, чтобы вы поняли, как же работать с ним. Во втором скетче мы рассмотрим более сложный процесс, и в итоге мы получим таймер, которым сможем управлять с помощью наших активных кнопок.
Схема подключения
Подключение LCD Keypad Shield производится стандартным способом. Таким образом мы подключали Motor Shield L293D, Arduino Sensorshield, Uno Protoshield, а также Ethernet 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; //переходим к следующему значению цикла } }
Пояснения к скетчу
И так, когда вы выгрузите скетч в программу и загрузите ее к вашему 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 секунды } } } // Конец
Комментарии к программному коду
Как вы могли заметить, команда "HelpDuino" постаралfсь подробно описать суть каждой написанной строки в скетче. Как уже говорилось ранее, вы с помощью данного программного кода сможете сделать таймер из вашего arduino и LCD Keypad Shield. Для управления таймером понадобятся четыре активные кнопки: "right", "left", "down" и "up" . Кнопки "down" и "up" нужны для выбора времени, через которое сработает таймер. Кнопкb "left" и "right" нужнs для запуска или остановки таймера соответсвенно.
Каждый скетч подробно описан до мелочей, но если вам стало что-то не понятно, задавайте вопросы ниже в комментариях. Также мы бы хотели посоветовать материалы для подготовки к этому уроку для того, чтобы вам было легче разобраться в нем. Если вам тяжело дается данный урок, то просмотрите для начала наш урок по подключению LCD дисплея к Arduino, также мы рекомендуем обратиться к разделу Arduino для начинающих в котором вы сможете ознакомиться с базовыми знаниями в области программирования.
Надеюсь у вас все получилось! Если у вас остались вопросы, можете написать нам в вконтакте или в комментариях ниже. Мы постараемся ответить на ваши вопросы в скором времени!