Помощь с клавиатурой 4х4

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Помогите написать код, который будет считывать значения с матричной клавиатуры, и когда наберется 7 значений они отправлялись в сериал

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

heisenberg133 пишет:

Помогите написать код

Нет, это называется сделайте за меня. Помогите, это когда ты выкладываешь свой код (пусть и не рабочий) и задаёшь конкретные вопросы, что у тебя не получается.

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Я пробовал разными способами, результат один- не ждет, пока я введу все 7 символов, а шлет в сериал всякий мусор непрерывно. Вот одна из попыток :

#include <Keypad.h>
char num[6];
int i = 0;
const byte ROWS = 4; 
const byte COLS = 3; 
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; 
byte colPins[COLS] = {8, 7, 6}; 
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  digitalWrite(13,LOW);
}
 
void loop(){
  char key = keypad.getKey();
 
  if (key){
  
   num[i]=key;
   i++;}

 
  
    for(i = 0;i<=6;i++){
      Serial.print(num[i]);
    
  }
}

 

sirshulz
Offline
Зарегистрирован: 05.09.2015

Пока писал уже ответили

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Удалил, т.к. выше сам неправильно написал...

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Ну мне нужно вывести весь этот массив в сериал только после того, как я введу все его 7 элементов. с if он сразу же начнет непрерывно писать первый же введенный элемент, может как-то можно buffer применить?

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

Вроде так?

#include <Keypad.h>
char num[6];
int i = 0;
const byte ROWS = 4; 
const byte COLS = 3; 
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; 
byte colPins[COLS] = {8, 7, 6}; 
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  digitalWrite(13,LOW);
}
 
void loop(){
  char key = keypad.getKey();
 
  if (key){
  
   num[i]=key;
   i++;}
  
  if (i == 7){
	for (int i=0; i<=6; i++){
      Serial.print(num[i]);  
    }
	i = 0;
  }
}

 

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Спасибо конечно, но как это поможет? Данные с кнопки char, массив тоже char. Какой бы тип я не выбрал- главная проблема в том, чтобы весь масив вывелся только после того как я его введу с матричной клавиатуры(фотка выше). Может кто-то сталкивался уже, я с библиотеками разными пробовал- не получается

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

 Serial  не дисплей. Или надо набирать 7 цифр в слепую, а потом пачкой кидать в сериал. Или же пирамидой- сначало 1 , потом 2 . Похоже на обновление информации без стирания, но переводом на новую строку. И так до 7  цифр.

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Вот я и хочу, вслепую, а потом - пачкой закинуть в сериал

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Эм, код в посте #7 не работает так, как Вам надо?

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Спасибо, заработало наконец, только на 31ой строке i==6 . Только последним символом отправляеть хрень, но как надо-7 элементов. Причина неясна

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

Так я ссылку для кого кинул. Создай массив char, заполни его числами, поставь в конце 0, и выпихни в принт без []. как вариант воспльзуйся указателями на этот массив. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

heisenberg133 пишет:

Спасибо, заработало наконец, только на 31ой строке i==6 . Только последним символом отправляеть хрень, но как надо-7 элементов. Причина неясна

Нет, надо именно i==7, проверьте. Если i==6, то условие if выполнится раньше чем надо и не присвоится значение последнему элементу массива.

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

qwone, Jeka_M очень благодарен, проблему можно считать решенной, завтра исходя из ваших советов подправлю еще немного. С рождеством!

heisenberg133
heisenberg133 аватар
Offline
Зарегистрирован: 09.11.2016

Теперь другая проблема, нужно чтобы устройство получило ATD+XXXXXXX, где ХХХХХХХ-7значений массива. Проблема в том, чтобы это все вывелость сразу

#include <Keypad.h>
char num[6];
int i = 0;
const byte ROWS = 4; 
const byte COLS = 3; 
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; 
byte colPins[COLS] = {8, 7, 6}; 
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  digitalWrite(13,LOW);
}
 
void loop(){
  char key = keypad.getKey();
 
  if (key){
  
   num[i]=key;
   i++;}
  
  if (i == 7){
   Serial.print("ATD+");
  for (int i=0; i<=6; i++){
      Serial.print(num[i]);  
    }
  i = 0;
  }
}

То есть не циклом, а именно одним скажем так "сообщением". Если что -это отправка введенного номера на Sim800l.