Вывод кода не соответствует ожидаемому
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <Keypad.h>
const byte ROWS = 4; //четыре строки
const byte COLS = 4; //три столбца
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'E'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
int count = 0; char num[4];
char key;
byte rowPins[ROWS] = {A0, A1, A2, A3}; //подключиться к выводам строки клавиатуры
byte colPins[COLS] = {6, 5, 4, 3}; //подключаемся к выводам столбцов клавиатуры
char adhaar[4][4] = {
{'1', '0', '8', '3'},
{'9', '1', '6', '0'},
{'5', '7', '6', '1'},
{'6', '7', '9', '3'}
};
char adhaar0[4] = {'1', '0', '8', '3'};
char adhaar1[4] = {'9', '1', '6', '0'};
char adhaar2[4] = {'5', '7', '6', '1'};
char adhaar3[4] = {'6', '7', '9', '3'};
boolean check, control, adhar, tag_status;
int i = 0, j, p, q;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
Serial.println(" enter your adhaar ");
}
void loop() {
getkey();
checkkey();
}
void getkey() {
while (i < 4) {
char key = keypad.getKey();
if (key) {
num[i] = key;
Serial.print(num[i]);
i++;
}
}
}
void checkkey() {
if (i == 4) {
control = true;
for (p = 0; p < 4; p++) {
for (q = 0; q < 4; q++) {
if (adhaar[p][q] == num[q]) {
check = true;
Serial.println(num[q]);
} else {
check = false;
Serial.println(" not eligile");
break;
}
}
if (check == true) {
adhar = true;
Serial.println(" cast your vote");
}
}
i = 0;
}
}
Моя проблема в том, что как только adhaar совпадает со значениями, инициализированными в имеющемся у меня массиве, он, как и ожидалось, «отдаст свой голос», но после этого снова выполняет «не подходит» 3 раза.
@Renuka A Rajur, 👍0
Обсуждение1 ответ
Во-первых, общее замечание: большинство ваших переменных никогда не используются. Вы следует избавиться от них, так как они только делают ваш код более неясно.
Тогда причина наблюдаемого поведения заключается в том, что вы сравниваете Введенный код с 4 предустановленными кодами. Что бы ни ввел пользователь, будет по крайней мере 3 несовпадения, поэтому 3 раза программа выводит «не элигиле».
Чтобы получить ожидаемое поведение, я бы избавился от всех этих булевых значений переменные, которые затрудняют понимание логики и вместо этого разбивают ее на части проблему на более мелкие части, каждая из которых реализуется в виде собственной небольшой функции. Это облегчает написание кода, который легко понять.
Во-первых, как определить, одинаковы ли два четырёхзначных кода? это:
// Совпадают ли коды a и b?
bool match(char a[4], char b[4]) {
for (int i = 0; i < 4; i++) {
if (a[i] != b[i])
return false;
}
return true;
}
Затем, учитывая введенный пользователем код, определить, совпадает ли он
adhaar[0] или adhaar[1] или... или ни один из них:
// Возвращает индекс adhaar, соответствующий заданному ключу,
// или -1, если совпадений нет.
int matching_idx(char key[4]) {
for (int i = 0; i < 4; i++) {
if (match(key, adhaar[i]))
return i;
}
return -1; // нет совпадения
}
Теперь вашу функцию checkkey() можно переписать следующим образом:
void checkkey() {
if (i != 4) return; // никогда не должно произойти
if (matching_idx(num) == -1)
Serial.println(" not eligile");
else
Serial.println(" cast your vote");
i = 0;
}
когда я пробую это, получается бесконечный цикл... и он не переходит в следующий цикл, @Renuka A Rajur
@RenukaARajur: Он попадает в бесконечный цикл, потому что я забыл очистить глобальную переменную i в checkkey(). Исправлено в редактировании. Обратите внимание, что такой способ использования глобальной переменной i изначально очень неудачный: вместо этого должен быть локальный счётчик getkey(), как в for (int i = 0; i < 4; i++) ...., @Edgar Bonet
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Какой результат был получен? Чего вы ожидали? Пожалуйста, отредактируйте свой вопрос., @Craig
Проблема в том, что как только adhaar совпадет со значениями, инициализированными в полученном мной массиве, он, как и ожидалось, выдаст сообщение «отдайте свой голос», но после этого снова выдаст сообщение «не имеет права» 3 раза., @Renuka A Rajur
пожалуйста, кто-нибудь, помогите мне решить эту проблему...спасибо, @Renuka A Rajur
Не отвечайте в комментарии, **пожалуйста, отредактируйте свой вопрос**!, @Edgar Bonet
Также, пожалуйста, просто опубликуйте вывод, а не пытайтесь его объяснить., @Chad G
добавьте строку с
return;послеSerial.println(" cast your vote");, чтобы не проверять оставшиеся коды, @Juraj