Ардуино, клавиатура LCD 1602 - ввод данных

cegory
Offline
Зарегистрирован: 09.02.2017

Прошу подсказать, кто может. Нужно ввести с матричной клавиатуры  на LCD 1602 две переменных, пригодных для независимых операций (сброс, корректировка).  Примерным образом - нажимаем клавишу "А", вводим число в одной строке дисплея, затем нажимаем "В" и вводим второе число в другой строке. Отношения к программированию не имею, написал как мог два скетча, не судите строго, если неграмотно. Оба скетча не работают. В чем ошибка?

 

#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);
 
 
 
const byte ROWS = 4;
const byte COLS = 4;
 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad
 
 
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
 
unsigned int numar1=0, numar2=0;
 
void setup(){
 
  Serial.begin(9600);
    lcd.begin(); // initialize the lcd 
  lcd.backlight();
 
 
}
 
 
void loop() {
  char key = keypad.getKey();
  if(key ='A'){
  if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
   
                      
                          numar1=(numar1*10)+int(key-'0');
                          lcd.setCursor(0,0);
                          lcd.print(numar1);
                         
                                   }
 
 }
                                   
   if(key ='B'){
  if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
   
                      
                          numar2=(numar2*10)+int(key-'0');
                          lcd.setCursor(0,0);
                          lcd.print(numar1);
                         
                                   }
                            }

 

    }
 
Второй нерабочий скетч  
 
#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);
 
 
 
const byte ROWS = 4; //4 rows
const byte COLS = 4; //3 columns
//Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad
 
long first = 0;
long second = 0;
 
 
//Create the keypad
Keypad kpd = Keypad (makeKeymap(keys), rowPins, colPins, ROWS, COLS);
 
 
 
 
void setup() {
  Serial.begin(9600);
    lcd.begin(); // initialize the lcd 
  lcd.backlight();
 
}
 
void loop() {
   char key = kpd.getKey();
    switch(key) 
  {
if(key ='A'){
    
  
  case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,0);
    first = first * 10 + (key - '0');
    lcd.print(first);
    break;
}
}
 
  
    switch(key) 
  {
 
if(key ='B'){
    
    case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,1);
    second = second * 10 + (key - '0');
    lcd.print(second);
    break;
}
}
 
}
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
cegory
Offline
Зарегистрирован: 09.02.2017



#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);



const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad



Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 

unsigned int numar1=0, numar2=0;
 
void setup(){

  Serial.begin(9600);
    lcd.begin(); // initialize the lcd 
  lcd.backlight();
 

}
 

void loop() {
  char key = keypad.getKey();
  if(key ='A'){
  if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
   
                      
                          numar1=(numar1*10)+int(key-'0');
                          lcd.setCursor(0,0);
                          lcd.print(numar1);
                         
                                   }

 }
                                   
   if(key ='B'){
  if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
   
                      
                          numar2=(numar2*10)+int(key-'0');
                          lcd.setCursor(0,0);
                          lcd.print(numar1);
                         
                                   }
                            }
    }
#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);



const byte ROWS = 4; //4 rows
const byte COLS = 4; //3 columns
//Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,6,5,4}; //connect to the column pinouts of the keypad

long first = 0;
long second = 0;


//Create the keypad
Keypad kpd = Keypad (makeKeymap(keys), rowPins, colPins, ROWS, COLS);




void setup() {
  Serial.begin(9600);
    lcd.begin(); // initialize the lcd 
  lcd.backlight();
 
}

void loop() {
   char key = kpd.getKey();
    switch(key) 
  {
if(key ='A'){
    
  
  case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,0);
    first = first * 10 + (key - '0');
    lcd.print(first);
    break;
}
}

  
    switch(key) 
  {

if(key ='B'){
    
    case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,1);
    second = second * 10 + (key - '0');
    lcd.print(second);
    break;
}
}

}

 

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Так вы с клавиатуры одно нажатие всего считываете, а хотите ещё несколько цифр получить. Поэтому ничего и не работает.

Или если более понятно, вы каждый раз проверяете нажатие клавиши "А" или "B". А все что внутри проверки не работает, потому что второй раз то вы клавиатуру не опрашиваете. Поэтому переменная key как была равна "A" так и осталась. А в следующей итерации loop() вы опять только "A" и "B" проверяете.

Проверяйте и обрабатыайте все клавиши. Тогда будет работать.

cegory
Offline
Зарегистрирован: 09.02.2017

Знаний катастрофически не хватает. Если клавиша "А" нажата  if(key=A), то должно выполняться действие описанное в фигурных скобках

case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,0);
    first = first * 10 + (key - '0');
    lcd.print(first);
    break;
т.е. набираться числос выводом на дисплей. Сорри за такие вопросы
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_keys_4x4; // создать клавиатуру 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_keys_4x4.setup(2, 3, 4, 5, 6, 7, 8, 9);
}
void loop() {
  //#1 клавиатура 4x4
  do_keys_4x4.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);
}

 

cegory
Offline
Зарегистрирован: 09.02.2017

qwone, Спасибо

vvadim
Offline
Зарегистрирован: 23.05.2012

а чем keypad.h не устраивает?

я пользуюсь и вполне доволен....

cegory
Offline
Зарегистрирован: 09.02.2017

Устроил бы если хватило бы знаний написать рабочий скетч без ошибок, для чего и попросил помощи. Человек помогает, я ему благодарен. В принципе за любую помощь

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

vvadim пишет:

а чем keypad.h не устраивает?

я пользуюсь и вполне доволен....

1. Я стараюсь программировать в своем стиле. А он немного отличается установками.

2. keypad.h не соответствует классу Do.Термин тоже из моей концепции .