Подключение матричной клавиатуры 4х4 и использование библиотеки Keypad

demon969
Offline
Зарегистрирован: 24.04.2012

Подключил матричную клавиатуру вот эту

http://www.ebay.com.au/itm/2PCS-4x4-Matrix-16-Key-Membrane-Switch-Keypad...

Попробовал пример работы с клавиатурой вот этот(ссылка ниже) - работает. Схема собрана так же как на примере приведенном ниже.

http://arduino-ua.com/art3-Podkluchenie_matrichnoi_klaviatyri_k_Arduino

Но вот с примером из библиотеки Keypad (http://playground.arduino.cc//Code/Keypad) не получается, цифры не все показывает и не все кнопки нажимаются.

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Может кто нибуди подключал  удачно матричную клавиатуру с использованием библы keypad?

maksim
Offline
Зарегистрирован: 12.02.2012

demon969 пишет:

 Схема собрана так же как на примере приведенном ниже.

http://arduino-ua.com/art3-Podkluchenie_matrichnoi_klaviatyri_k_Arduino

Так а по какой схеме собирали??? Там их две и они разные:

demon969
Offline
Зарегистрирован: 24.04.2012

Собирал по схеме по нижней

maksim
Offline
Зарегистрирован: 12.02.2012

Уберите вообще резисторы.

demon969
Offline
Зарегистрирован: 24.04.2012

Спасибо заработало, а можете рассказать почему резисторы оказались не нужными?

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

например, если нажата кнопка "A", то делать то?

danryx
Offline
Зарегистрирован: 03.03.2012

Примитивная логика обработки кнопок: 

 


  if (customKey == 'A') {
    // Do that need for button "A"
  } else if (customKey == 'B') {
    // Do that need for button "B"
  } else if (customKey == 'C') {
    // Do that need for button "C"
  } else if (customKey == 'D') {
    // Do that need for button "D"
  } else if (customKey == '1') {
    // Do that need for button "1"
  } else if (customKey == '2') {
    // Do that need for button "2"
  } else if (customKey == '3') {
    // Do that need for button "3"
  } else if (customKey == '4') {
    // Do that need for button "4"
  } else if (customKey == '5') {
    // Do that need for button "5"
  } else if (customKey == '6') {
    // Do that need for button "6"
  } else if (customKey == '7') {
    // Do that need for button "7"
  } else if (customKey == '8') {
    // Do that need for button "8"
  } else if (customKey == '9') {
    // Do that need for button "9"
  } else if (customKey == '0') {
    // Do that need for button "0"
  } else if (customKey == '*') {
    // Do that need for button "*"
  } else if (customKey == '#') {
    // Do that need for button "#"
  }

Резисторы не нужны потому, что используется принцип матрицы, т.е. первые 4 выхода выдают напряжение, а остальные 4 входа его снимают. Резисторы гасили напряжение на землю.

maksim
Offline
Зарегистрирован: 12.02.2012

danryx пишет:

Резисторы не нужны потому, что используется принцип матрицы, т.е. первые 4 выхода выдают напряжение, а остальные 4 входа его снимают. Резисторы гасили напряжение на землю.

Резисторы не нужны, потому что библиотека использует внутренние подтягивающие резисторы. Вообще без подтяжки постоянно валились бы ложные нажатия - мусор, помехи.
Если бы стояли подтягивающие резисторы к +5V ,как на первой схеме, то они бы не мешали.

demon969
Offline
Зарегистрирован: 24.04.2012

Спасибо всем за помощь. Ну и последний вопросик (знаю что надо пытаться сделать все самому, а не спрашивать все на форуме, но не силен я в программировании, а желание разобраться и сделать законченное изделие огромное:) ). например: при нажатии кнопки "A" попадаем в меню подпрограммы, далее вводим с клавиатуры число 38,6 к примеру, и жмем кнопку "B" что бы сохранить это введеное значение в EEPROM  и нажимаем кнопку выхода в основное тело программы. Далее введеное число будет сравниваться с числом от датчика, ну прям как в терморегуляторе. Если можно как то обрисоваь примерный код как это сделать?

danryx
Offline
Зарегистрирован: 03.03.2012

Это конечно не мое дело...но не глубоко ли Вы в дебри полезли?

Я сам только учусь кодить для ардуинки, но не строю такие громоздкие условия.

Начините с маленького, и постепенно дальше, выше, быстре!)

demon969
Offline
Зарегистрирован: 24.04.2012

Thanks. Знаю что залез в дебри где уже мало что соображаю но все же...

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#define BUTTON_PIN myChar

#include <Keypad.h>
#include <EEPROM.h>

bool lampState =false;
bool wasButtonDown = false;
char myChar = 'B';
int addr = 0;
byte value;
//int val = 38;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  Serial.begin(9600);
  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.
  pinMode(13, OUTPUT);
  //pinMode(BUTTON_PIN, INPUT);  
}
 
void loop(){
  char customKey = customKeypad.getKey();
 
  if (customKey){
    Serial.println(customKey);
  }
  if (customKey == 'A')
  {
    Serial.println("Press key A");
    Serial.println("EEPROM WRITE 38 address 0");
    EEPROM.write(addr, 38);
   }
   if (customKey == 'B')
   {value=EEPROM.read(addr);
   Serial.println("EEPROM READ");
   Serial.print(addr);
   Serial.print("\t");
   Serial.println(value, DEC);
   };
   if (customKey == 'C')
   {
     for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
    
  // turn the LED on when we're done
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  Serial.print("EEPROM CLEAR");
   }
}

В выше приведенном коде число 38 записывается в память EEPROM, подскажите как это число и другое произвольное число вводить с клавиатуры, что бы оно запоминалось в EEPROM?

demon969
Offline
Зарегистрирован: 24.04.2012

Хотя бы подскажите в какую сторону копать?

Serial.read(); 

Подойдет для выше изложенного?

maksim
Offline
Зарегистрирован: 12.02.2012

Нет не подойдет. Что вы хотите делать с этим числом(?) и какая его длинна?

demon969
Offline
Зарегистрирован: 24.04.2012

Число будет вида например 22,5

maksim
Offline
Зарегистрирован: 12.02.2012

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

demon969
Offline
Зарегистрирован: 24.04.2012

maksim пишет:

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

Разве невозможно назначить на на клавишу к примеру # запятую? Введенное число с клавиатуры должно сохраняться в EEPROM и далее сравниваться с числом считываемым от датчика.

demon969
Offline
Зарегистрирован: 24.04.2012

Библиотека keypad (http://playground.arduino.cc/code/Keypad) поддерживает одновременное нажатие двух и более кнопок, но вот пример приведенный ниже не работает, не определяется одновременное нажатие двух кнопок. Что не так?))

 

if ((customKey == '3')&&(customKey == '#'))
    { 
    for (int i = 0; i < 512; i++)
    shiftOut(DS,SHCP,LSBFIRST, B11111111);
    digitalWrite(STCP,HIGH);
    digitalWrite(STCP,LOW);
    tone(16, 900, 3000);
    delay(7000);
  }

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

if ((customKey == '3')&&(customKey == '#'))

в этой строке проблема переменнная customKey не может одновременно равнятья двум разным значениям.

условие всегда ложно

судя по документации по приведенной ссылке нажатые коды лежат в массиве

  • Key key[LIST_MAX]
ivanpota
Offline
Зарегистрирован: 05.01.2016

а не знаете как пин код сделать (типа 543*3290)??

очень надо !!

korsianen
Offline
Зарегистрирован: 23.03.2013

Я для ввода использовал цикл. Правда я всегда знал максимум сколько можно вводить чисел. У меня было 5 знаков. Но можно ввести и 00365. А запятую можно вообще опустить при вводе. Главное в программе учесть сколько знаков мы имеем после запятой. К примеру 36,5 записываемых как 00365.

MacSim
Offline
Зарегистрирован: 28.11.2012

demon969 пишет:

Число будет вида например 22,5

разделите на две переменные до запятой и после. примите за "," # до нажатия принимайте 1 число, после 2

MacSim
Offline
Зарегистрирован: 28.11.2012

ivanpota пишет:

а не знаете как пин код сделать (типа 543*3290)??

очень надо !!

нажать последовательно цифры 543*3290 :-)

задавайте вопрос конкретней. где? из чего? для чего?

создайте масив

MacSim
Offline
Зарегистрирован: 28.11.2012

будет ли диблиотека работать с матрицей кнопок 4Х5

http://www.ebay.com.au/itm/2pcs-4x5-Matrix-Array-Membrane-Switch-Keypad-...

MacSim
Offline
Зарегистрирован: 28.11.2012

разобрался,подредактировал,работает

Snike
Offline
Зарегистрирован: 19.02.2016

MacSim пишет:

разобрался,подредактировал,работает

hi

не поделитесь решением?

MacSim
Offline
Зарегистрирован: 28.11.2012

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

Psychedelic41
Offline
Зарегистрирован: 19.05.2016

Добрый вечер. У меня вот какой вопрос: могу ли я по схеме указанной выше(без резисторов) соединить одновременно дисплей(WH-1602, он занимает порты 5,4,3,2) и клавиатуру типа 4х4?

MacSim
Offline
Зарегистрирован: 28.11.2012

Смысл втом, что на по одной оси (вертикали или горизонтали) поочередно подается на одну из ног 1 или 0, на остальные соответственно инверсия первого. с других ног читаете.

подключать лучше с диодами. спасает от кз при нажатии двух кнопок одновременно. обсуждалось.

дисплей с кнопками на одних и тех-же ногах можно, но только на тех где чтение.

а лучше и2с поставьте для него,

меньше ног кушает мне больше понравилось, решен вопрос с резистором контраста и подсветка не требует еще ноги.

xeont
Offline
Зарегистрирован: 16.06.2016

Уважаемые знатоки. Выручайте, прошу. Ситуация схожа с проблемой топикСтартера.

demon969 пишет:

 

  if (customKey == 'A')
  {
    Serial.println("Press key A");
    Serial.println("EEPROM WRITE 38 address 0");
    EEPROM.write(addr, 38);
   }

В выше приведенном коде число 38 записывается в память EEPROM, подскажите как это число и другое произвольное число вводить с клавиатуры, что бы оно запоминалось в EEPROM?

Помимо keypad подлючен также LCD по i2c. Никак не могу вывести нажимаемые символы с кейпада на экран, так чтобы они выводились по порядку и при этом не заполоняли весь экранчик.

KontraMA
Offline
Зарегистрирован: 22.01.2017

вот так правильно:

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'d','c','b','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Может кто нибуди подключал  удачно матричную клавиатуру с использованием библы keypad?

[/quote]

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У меня другая библиотека на этот счет. https://yadi.sk/d/WT0l3qE23AKXKx

/* class_Do_keys_4х4.ino
 *  https://yadi.sk/d/WT0l3qE23AKXKx
  #1 кравиатура 4x4
          строки->2,3,4,5 выхода
          колонки->6,7,8,9 входа
           {'1','2','3','A'},
           {'4','5','6','B'},
           {'7','8','9','C'},
           {'*','0','#','D'}
 Принцип кода:При нажатии на соответсвующую кнопку выполняется соответсвующее действие
*/
//#1 кравиатура 4x4
#include "Cl_Do_keys_4x4.h"
Cl_Do_keys_4x4 Do; // создать клавиатуру 4х4
void func_1(void) {
  Serial.println("Do Func 1");
}
void func_2(void) {
  Serial.println("Do Func 2");
}
void func_3(void) {
  Serial.println("Do Func 3");
}
void func_4(void) {
  Serial.println("Do Func A");
}
void func_5(void) {
  Serial.println("Do Func 4");
}
void func_6(void) {
  Serial.println("Do Func 5");
}
void func_7(void) {
  Serial.println("Do Func 6");
}
void func_8(void) {
  Serial.println("Do Func B");
}
void func_9(void) {
  Serial.println("Do Func 7");
}
void func_10(void) {
  Serial.println("Do Func 8");
}
void func_11(void) {
  Serial.println("Do Func 9");
}
void func_12(void) {
  Serial.println("Do Func C");
}
void func_13(void) {
  Serial.println("Do Func *");
}
void func_14(void) {
  Serial.println("Do Func 0");
}
void func_15(void) {
  Serial.println("Do Func #");
}
void func_16(void) {
  Serial.println("Do Func D");
}
void setup() {
  Serial.begin(9600);
  //#1 кравиатура 4x4
  Do.setup(2, 3, 4, 5, 6, 7, 8, 9);
}
void loop() {
  //#1 кравиатура 4x4
  Do.loop(& func_1, & func_2, & func_3, & func_4,
          & func_5, & func_6, & func_7, & func_8,
          & func_9, & func_10, & func_11, & func_12,
          & func_13, & func_14, & func_15, & func_16);
}

 

KontraMA
Offline
Зарегистрирован: 22.01.2017
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

На этой даже думать не надо. Повесил на кнопку функцию , что должна сделать и она при нажатии сделает и даже дребезг отработает.

KontraMA
Offline
Зарегистрирован: 22.01.2017

ну и хорошо!

 

vorgen
Offline
Зарегистрирован: 16.10.2016

Приветствую всех, столкнулся с ситуацией когда необходимо набрать на клавиатуре допустим число 12345678 и путем нажатия ввод он бы его записал в EEPROM,ввод заменить кнопку (*) допустим

Gubrin
Offline
Зарегистрирован: 01.10.2017

А есть такая же библиотека только для клавиатуры 1x4?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Gubrin пишет:

А есть такая же библиотека только для клавиатуры 1x4?

нету. О_О

b707
Онлайн
Зарегистрирован: 26.05.2017

Gubrin пишет:

А есть такая же библиотека только для клавиатуры 1x4?

А зачем? 4х-кнопочная подключается как отдельные 4 кнопки, без вских изысков с матрицей

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

b707 пишет:

А зачем? 4х-кнопочная подключается как отдельные 4 кнопки, без вских изысков с матрицей

во-первых: матрица 1х1 - это концептуально.

Lexan
Offline
Зарегистрирован: 12.02.2016

А можно ли подключать этими способами матричную клавиатуру к аналоговым пинам ардуины нано?

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно. A1-A5 работают и как цифровые тоже.