아두이노 소스인데...
하기 (1) 모듈내 if ~ else 문은 rfid 태그(카드, 키홀더형 태그 등등)에 대한 내부 인식값입니다. 즉 하기 모듈에 적힌 [0]~[6] 까지의 값이
1개의 태그카드값이되는데 여기서는 한개의 카드밖에 인식시키지 못하므로
추가의 카드값을 입력하여 여러사람 혹은 각각 다른 카드를 태그해서 로긴되도록 해야하는데요...
(2)번과 같이 if 문 블록을 하나 완전 복사해서 [0] ~ [6] 값을 다르게 하니
이상하게 맨 마지막으로 입력된 카드값만([0]~[3]까지만 있는 인식태그값만 인식하고 이전것들은 다 incorrect uid로 나옵니다.
즉, 한개만 썼을때는 어떤것이든 ok인데..두개이상 쓰면 맨 마지막 한개만 ok가 되네요.
제가 if문을 잘못쓴거 같은데...
어떻게 고치면 될까요?
원본소스는 첨부로하겠습니다.
(1) rfid 각 카드별 인식값
if (mfrc522.uid.uidByte[0] == 0x04 &&
mfrc522.uid.uidByte[1] == 0xDA &&
mfrc522.uid.uidByte[2] == 0x75 &&
mfrc522.uid.uidByte[3] == 0x02 &&
mfrc522.uid.uidByte[4] == 0x30 &&
mfrc522.uid.uidByte[5] == 0x4D &&
mfrc522.uid.uidByte[6] == 0x80
)
{Serial.println("Correct UID");
}
else {
Serial.println("Incorrect UID");
delay(5000);
return;
}
(2) if 블럭을 복사해서 적용한 --- 오류나는 코드
//red point of ring
if (mfrc522.uid.uidByte[0] == 0x04 &&
mfrc522.uid.uidByte[1] == 0xDA &&
mfrc522.uid.uidByte[2] == 0x75 &&
mfrc522.uid.uidByte[3] == 0x02 &&
mfrc522.uid.uidByte[4] == 0x30 &&
mfrc522.uid.uidByte[5] == 0x4D &&
mfrc522.uid.uidByte[6] == 0x80
)
if (mfrc522.uid.uidByte[0] == 0xC9 &&
mfrc522.uid.uidByte[1] == 0xF0 &&
mfrc522.uid.uidByte[2] == 0xC6 &&
mfrc522.uid.uidByte[3] == 0x63
)
{Serial.println("Correct UID");
}
else {
Serial.println("Incorrect UID");
delay(5000);
return;
}
els if then
else if then
else
end if
대충 이렇게 합니다만.
if 변수값 = 비교값(0). then 문오픈
else if 변수값 = 비교값(1). then 문오픈
else if 변수값 = 비교값(2). then 문오픈
else 모든변수 초기화
end if
값을 여러개 인지하고 싶으시면 if문 안에서 or 처리(||)로 비교해 보시면 어떨까 합니다.
//red point of ring
if (
(mfrc522.uid.uidByte[0] == 0x04 &&
mfrc522.uid.uidByte[1] == 0xDA &&
mfrc522.uid.uidByte[2] == 0x75 &&
mfrc522.uid.uidByte[3] == 0x02 &&
mfrc522.uid.uidByte[4] == 0x30 &&
mfrc522.uid.uidByte[5] == 0x4D &&
mfrc522.uid.uidByte[6] == 0x80)
|| (mfrc522.uid.uidByte[0] == 0xC9 &&
mfrc522.uid.uidByte[1] == 0xF0 &&
mfrc522.uid.uidByte[2] == 0xC6 &&
mfrc522.uid.uidByte[3] == 0x63
)
)
{
Serial.println("Correct UID");
}
else {
Serial.println("Incorrect UID");
delay(5000);
return;
}
식으로 if ( (조건1) || (조건2)) { 맞음 } else {틀림} 패턴을 주시면 조건1 또는 조건2 일때 맞음으로 들어가고, 아니면 틀림으로 빠집니다.
int i;
unsigned char cards[][7] = {
{7 /* len */, 0x04, 0xda, 0x75, 0x02, 0x30, 0x4d, 0x80},
{4, 0xc9, 0xf0, 0xc6, 0x63, }
};
for(i=0; i<2; i++) {
int j;
const unsigned char *card = cards[i];
for(j=0; j<card[0]; j++) {
if(card[j+1] != input[j]) break;
}
if(j==card[0]) return 1;
}
return 0;
}
이런식으로하면 좀더 편하지 않을까요?
2개면 몰라도 더 여러개의 카드를 추가하면 if문으로는 너무 길어집니다.
여기서 보면 입력되어있는 카드값을 쭈욱 ...끝까지 비교하고 맞으면 return 1, 아니면 return 0 를 출력한다는 건가요?
그리고 정작 위 코드 넣고 컴파일 해보니 브레이스 { 사용 오류나오기에 ( 로 바꿔주고 실행했는데
이제는 int i; 부분에서 ; 사용오류나와서 원본소스 안에 있는 int 선언하는대로 int i = 7; 이렇게 해줘도 오류..TT
뭔가 문법이 많이 다른거 같네요..
이걸 함수 그대로 넣으시고 원하시는 부분에
if(check_card(mfrc522.uid.uidByte)) {
맞을때
}else{
틀릴때
}
이렇게 사용하심 됩니다.
i와 j 같은 카운팅용 변수는 그때그때 선언하거나, 반대로 코드 맨 위에서 선언하는 게 낫습니다.