Опубликовано: 05.08.2017 20:00
Автор: jazon
Приветствую всех тех кто читает эту статью, в ней будет рассмотрена уже давно приобретённая кнопочная номерная клавиатура 3x4. Сразу скажу клавиатура очень понравилась как в плане качества исполнения(пайка, таблица уровней отпечатанная на обратной стороне платы) так и в качестве удобства(большие кнопки, возможность открыть кнопку и подложить под прозрачную поверхность обозначение кнопки что и было сделано в дальнейшем). Итак, начнем потихоньку.... Вот фото взятое от магазина производителя:
На обратной стороне платы клавиатуры, расписана таблица уровней кнопок, что же, нужно проверить её на соответствие реальным величинам. Для начала приведу лишь то что там отпечатано:
Чтобы точно убедиться, что всё представленное в тексте соответствует действительности, приведём фото, где расписана эта таблица уровней, да и сам клавиатурный модуль, сразу просим извинить за качество фотографии. Кстати на фото видно что уже сделаны вставки для кнопочек с обозначением и цифрами:
Вот теперь пришло время написать совсем небольшой скетч, для проверки таблицы на соответствие уровням кнопок. Небольшое уточнение, на обратной стороне также есть надпись "Out level for VCC ≈ 5V(0 - 1024)", что примерно переводится как "Выходные уровни даны для напряжения 5 вольт(от 0 до 1024)". А вот собственно и скетч:
/*
* Keypad 3x4[OUT] -> Arduino Nano[A0]
* Keypad 3x4[GND] -> Arduino Nano[GND]
* Keypad 3x4[VCC] -> Arduino Nano[5V]
*/
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(analogRead(0));
}
Без труда заливаем этот скетч в Arduino Nano, предварительно соединив проводами нужные контакты. Что ж, монитор порта ещё никто не отменял, нажимая на кнопки, были сделаны наглядные скриншоты состояний уровней кнопок, чтобы сравнить их с таблицей уровней данной от производителя. И если сравнивать с реальной таблицей, заявленной на обратнй стороне модуля, здесь не обошлось без небольшого расхождения значений уровней. А вот и сами скриншоты, можно сравнить уровни в мониторе порта и заявленые в таблице:
Из показаний монитора порта видно, что в точности соответствуют заявленным уровням 1-я и 10-я кнопка, 4-я и 11-я имеют заниженный уровень, остальные имеют незначительно завышенные уровни состояний. Вот тут то и кроется ложка дегтя, при использовании на различных платах(UNO, Nano, Mega и др.) эти уровни будут еще больше разниться с заявленными в таблице производителя, ведь питание на платах(как показывает практика) тоже разнится от экземпляра к экземпляру. На мной используемой плате Arduino Nano питание с ноги 5V замеренное тестером показало 4,75V. Если делать скетч с внесением в него заявленных уровней, могут возникнуть проблемы - к примеру при нажатии кнопки событие не будет обработано, потому что элементарно при сравнении уровней будет несовпадение реального и заявленного уровня. Данный тест проводился(как уже было сказано) на чистой плате Arduino Nano, в дальнейшем мы будем использовать вспомогательный силовой шилд для Arduino Nano(i/O Wireless Shield), чтобы напряжение на питающих контактах было стабильно равным 5 Вольт.
Как вариант - что бы безусловно считать кнопки клавиатуры, можно при использовании клавиатурного модуля, занизить заявленные уровни на 5 единиц в скетче, в общем то можно и больше, но на данном этапе изучения модуля хватит и этого.
Вот теперь пришло время написания хорошего, годного скетча, текст которого будет хорошо прокомментирован, и залит в плату Arduino Nano. Видео работы кнопочной клавиатуры тоже будет показано ниже, ну вот собственно и сам скетч:
/*
* Keypad3x4[OUT] -> Arduino Nano[A0]
* Keypad3x4[GND] -> Arduino Nano[GND]
* Keypad3x4[VCC] -> Arduino Nano[5V]
*/
//Объявление целочисленной переменной button в которую будет сохраняться результат
//работы функции обработчика нажатия кнопок getPressedButton()
int button;
//Константные целочисленные значения кнопок возвращаемые функцией обработчиком getPressedButton()
const int BUTTON_0 = 0;
const int BUTTON_1 = 1;
const int BUTTON_2 = 2;
const int BUTTON_3 = 3;
const int BUTTON_4 = 4;
const int BUTTON_5 = 5;
const int BUTTON_6 = 6;
const int BUTTON_7 = 7;
const int BUTTON_8 = 8;
const int BUTTON_9 = 9;
const int BUTTON_10 = 10;
const int BUTTON_11 = 11;
//DEFAULT_BUTTON это значение будет возвращаться функцией обработчиком если ни одна из кнопок не будет нажата
const int DEFAULT_BUTTON = 15;
//Функция обработчик нажатых кнопок
//Как говорилось в обзоре будем занижать каждый заявленный уровень нажатой кнопки на 5 единиц
int getPressedButton()
{
int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)
if (buttonValue >= 1018) // Заявленный уровень 1023
{ // И если считанный уровень больше, то
return BUTTON_1; // Возвращаем нажатие кнопки 1
}
else if (buttonValue >= 925) // Заявленный уровень 930
{ // И если считанный уровень больше, то
return BUTTON_2; // Возвращаем нажатие кнопки 2
}
else if (buttonValue >= 845) // Заявленный уровень 850
{ // И если считанный уровень больше, то
return BUTTON_3; // Возвращаем нажатие кнопки 3
}
else if (buttonValue >= 785) // Заявленный уровень 790
{ // И если считанный уровень больше, то
return BUTTON_4; // Возвращаем нажатие кнопки 4
}
else if (buttonValue >= 725) // Заявленный уровень 730
{ // И если считанный уровень больше, то
return BUTTON_5; // Возвращаем нажатие кнопки 5
}
else if (buttonValue >= 675) // Заявленный уровень 680
{ // И если считанный уровень больше, то
return BUTTON_6; // Возвращаем нажатие кнопки 6
}
else if (buttonValue >= 635) // Заявленный уровень 640
{ // И если считанный уровень больше, то
return BUTTON_7; // Возвращаем нажатие кнопки 7
}
else if (buttonValue >= 595) // Заявленный уровень 600
{ // И если считанный уровень больше, то
return BUTTON_8; // Возвращаем нажатие кнопки 8
}
else if (buttonValue >= 565) // Заявленный уровень 570
{ // И если считанный уровень больше, то
return BUTTON_9; // Возвращаем нажатие кнопки 9
}
else if (buttonValue >= 535) // Заявленный уровень 540
{ // И если считанный уровень больше, то
return BUTTON_10; // Возвращаем нажатие кнопки 10
}
else if (buttonValue >= 505) // Заявленный уровень 510
{ // И если считанный уровень больше, то
return BUTTON_0; // Возвращаем нажатие кнопки 0
}
else if (buttonValue >= 485) // Заявленный уровень 490
{ // И если считанный уровень больше, то
return BUTTON_11; // Возвращаем нажатие кнопки 11
}
return DEFAULT_BUTTON; //Если ни одна из кнопок не нажата, вернуть значение 15
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
button = getPressedButton();
switch (button)
{
case BUTTON_0: // при нажатии кнопки выводим следующий текст
Serial.println("Button 0 pressed...");
break;
case BUTTON_1:
Serial.println("Button 1 pressed...");
break;
case BUTTON_2:
Serial.println("Button 2 pressed...");
break;
case BUTTON_3:
Serial.println("Button 3 pressed...");
break;
case BUTTON_4:
Serial.println("Button 4 pressed...");
break;
case BUTTON_5:
Serial.println("Button 5 pressed...");
break;
case BUTTON_6:
Serial.println("Button 6 pressed...");
break;
case BUTTON_7:
Serial.println("Button 7 pressed...");
break;
case BUTTON_8:
Serial.println("Button 8 pressed...");
break;
case BUTTON_9:
Serial.println("Button 9 pressed...");
break;
case BUTTON_10:
Serial.println("Button 10 pressed...");
break;
case BUTTON_11:
Serial.println("Button 11 pressed...");
break;
}
}
Дальнейшее видео хорошо демонстрирует работу тестовых скетчей, только с одним условием: все данные выводятся не в монитор порта а на дисплей LCD1602 подключенный к плате Arduino Nano через I2C конвертор. В общем то - если у вас нет LCD дисплея, пробуйте скетчи с использованием монитора порта, для понимания работы клавиатурного модуля этого будет более чем достаточно. Но если всё же вам интересен более продвинутый ввод/вывод и обработка нажатий - то добро пожаловать, ссылки на тестовые скетчи с использованием LCD дисплея будут даны в конце статьи и в описании самого видео.
Итак, тестовые скетчи с использованием LCD дисплея:
А вот видео работы кнопочной клавиатуры, здесь уже вставлены свои надписи в крышки кнопок:
Ну и напоследок, хотелось немного анонсировать следующие статьи по работе с данным клавиатурным модулем. По плану - следующая статья будет про то как подавить дребезг контактов кнопок клавиатурного модуля. И пусть многие не согласятся - очень широко распространено мнение, что у таких устройств не бывает такого свойства, но к сожалению дребезг контактов именно на таких кнопках есть априори. Итак, далее - рассмотрим обработчик дребезга контактов, и напишем небольшой примитивнейший калькулятор, и да, очень важно, каждая кнопка, вместо обычного сухого нажатия, будет подзвучена динамиком пъезопищалкой. Но это, уже материал следующей статьи...
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.