Как написать более компактные условия AND с оператором if?
rfid
loop
Я работаю над модулем RFID и нашел пример, который хорошо с этим справляется. Но он долго проверял 5 байт полученных RFID, и я постарался записать его более компактно.
Я сделал это с помощью цикла for, но как выполнить AND условия оператора if?
Как это изменить:
if(bt0[cnt-1] == rfid.serNum[0] &&
bt1[cnt-1] == rfid.serNum[1] &&
bt2[cnt-1] == rfid.serNum[2] &&
bt3[cnt-1] == rfid.serNum[3] &&
bt4[cnt-1] == rfid.serNum[4]){
lcd.clear();
lcd.print("card accepted");
digitalWrite(green_led,HIGH);
digitalWrite(red_led,LOW);
}
else{
lcd.clear();
lcd.print("card denied");
digitalWrite(green_led,LOW);
digitalWrite(red_led,HIGH);
}
Что-то вроде этого:
for(byte i=0;i<MXCD;i++){
if(bt[i] == rfid.serNum[i%5]){
cnt++;
}
}
if(cnt==5){
lcd.clear();
lcd.print("card accepted");
digitalWrite(green_led,HIGH);
digitalWrite(red_led,LOW);
cnt = 0;
}
else{
lcd.clear();
lcd.print("card denied");
digitalWrite(green_led,LOW);
digitalWrite(red_led,HIGH);
cnt = 0;
}
Таким образом, я сделал это с переменной «cnt», чтобы подсчитать количество успешно совпадающих байтов, тогда проверка числа равна 5.
Есть ли способ лучше этого?
Спасибо за любые комментарии и предложения :)
@R1S8K, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 2
Для этого существует стандартная функция C: memcmp()
. Он выполняет сравнение блоков памяти и может использоваться следующим образом:
if (!memcmp(bt, rfid.serNum, sizeof(bt))) {
lcd.clear();
lcd.print("card accepted");
digitalWrite(green_led,HIGH);
digitalWrite(red_led,LOW);
}
else {
...
}
Ссылка. http://www.cplusplus.com/reference/cstring/memcmp/
,
@Mikael Patel
Да, это работает идеально! Спасибо, чувак .., @R1S8K
Смотрите также:
- Как использовать RFID-RC522 с Arduino?
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
Подсказка: для этого существует стандартная функция C — memcmp(). Вы бы использовали это как
if (!memcmp(bt, rfid.serNum, 5)) ...
. Ссылка. http://www.cplusplus.com/reference/cstring/memcmp/, @Mikael PatelВау, спасибо !! на самом деле эта функция для меня не нова, но я не думал о ней и о ее использовании в этой ситуации! еще раз спасибо чувак.., @R1S8K
@MikaelPatel, вы должны опубликовать это как ответ, чтобы ОП мог его принять., @Duncan C
Да, ты прав., @R1S8K
Perch Eagle и @MikaelPatel, я хочу кое-что узнать из этого вопроса и вашего принятого ответа, но не понимаю, как это работает. Вы пишете, что хотите сравнить элементы пяти разных массивов (bt0[], bt1[], … bt4[]) с элементами одного массива (rfid.serNum[]). В качестве ответа вас устраивает сравнение с новым массивом bt[]. Чтобы это работало, между bt[] и bt0[], bt1[], … bt4[] должна существовать связь. Где в вашем эскизе это сделано или это естественно, но только я понять не могу?, @RJPlog