Введите 4-значное число с помощью клавиатуры 4*4 и отобразите в последовательном мониторе.
#include <Keypad.h>
int myNum[4];
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] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Enter four-digit num -"); // запрос на ввод
for (int i = 0; i < 4;){
if(keypad.getKey()!= NO_KEY) {
myNum[i] = keypad.getKey();
i = i+1;
}
}
Serial.print("Entered number is = ");
Serial.print(myNum[0]);
Serial.print(myNum[1]);
Serial.print(myNum[2]);
Serial.println(myNum[3]);
delay(500);
}
Я хочу, чтобы когда я нажимаю 4-значный номер на клавиатуре, он отображался на последовательном мониторе. Этот код дает 0000, когда я нажимаю любую клавишу на клавиатуре.
@kasun, 👍1
2 ответа
keypad.getKey()
не блокирует, как вы можете прочитать здесь: это немедленно вернет значение, даже если никакая клавиша не нажата. У вас есть цикл for
, который каждый раз увеличивает i
, и вы также увеличиваете его сами. Итак, что происходит, так это то, что ваш код сразу делает четыре чтения, все из которых не нажимаются на клавиши, поэтому он не сохраняет их, а затем печатает все, что происходит в буфере myNum
.
Вместо этого нужно каждый раз ждать, пока будет нажата клавиша, и только после этого переходить к следующей цифре. Есть, конечно, много способов сделать это. Надеюсь понятно:
#include <Keypad.h>
int myNum[4];
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] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Enter four-digit num -"); // запрос на ввод
for (int i = 0; i < 4; ++i){
while((myNum[i] = keypad.getKey())==NO_KEY) {
delay(1); // Просто ждем ключ
}
// ждем, пока ключ будет отпущен
while(keypad.getKey() != NO_KEY) {
delay(1);
}
}
Serial.print("Entered number is = ");
Serial.print(myNum[0]);
Serial.print(myNum[1]);
Serial.print(myNum[2]);
Serial.println(myNum[3]);
delay(500);
}
#include <Keypad.h>
char myNum[4];
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] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Enter four-digit num -"); // запрос на ввод
for (char i = 0; i < 4; ++i){
while((myNum[i] = keypad.getKey())==NO_KEY) {
delay(1); // Просто ждем ключ
}
// ждем, пока ключ будет отпущен
while(keypad.getKey() != NO_KEY) {
delay(1);
}
}
Serial.print("Entered number is = ");
Serial.print(myNum[0]);
Serial.print(myNum[1]);
Serial.print(myNum[2]);
Serial.println(myNum[3]);
delay(500);
}
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Пожалуйста. Если ответ поможет вам, рассмотрите возможность его принятия., @Mark Smith
когда я его компилирую, появляется код ошибки "Серийный номер не называет тип"., @kasun
Я предположил, что вы протестировали свой исходный код, так как вы описали, как он не работает. Нет?, @Mark Smith
@kasun Такая ошибка обычно возникает, когда вы пытаетесь выполнить оператор вне какой-либо функции. Вы пропустили фигурную скобку вокруг setup() или loop()? Покажите точный код, который дает вам ошибку!, @jose can u c
спасибо друг. это { беспокоит меня, @kasun
для (целое я = 0; я < 4; ++ я) { while((myNum[i] = keypad.getKey())!=NO_KEY) { задержка (1); // Просто ждем ключ } } он не работает должным образом. Вы можете отправить мне полный код для этого, @kasun
Поместите это в свой код, где у вас ранее был цикл for()., @Mark Smith
Я сделал это, но он не работает должным образом. можешь прислать мне весь код., @kasun
Я включил остальную часть кода выше и исправил ошибку (извините). Я также добавил некоторый код, чтобы убедиться, что первая клавиша отпущена перед чтением следующей клавиши. Если он по-прежнему не работает, опишите, как именно он ведет себя и что не так. Но было бы лучше, если бы вы попытались отладить его самостоятельно — так вы поймете, что происходит., @Mark Smith