if 문좀 봐주세요...

김건우   
   조회 2751   추천 0    

MFRC522.ino (4.6K), Down : 2, 2019-08

 아두이노 소스인데...


하기 (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;

  }

짧은글 일수록 신중하게.
황진우 2019-08
if        then
els if      then
      else if      then
              else
end if
대충 이렇게 합니다만.
if 변수값 = 비교값(0). then 문오픈
    else if 변수값 = 비교값(1).  then 문오픈
              else if 변수값 = 비교값(2). then 문오픈
                        else  모든변수 초기화
end if
위 2번 코드에서 첫번째 ID(6개항목)이 맞는경우 안의 if문으로 들어가는데 당연히 uidByte[0]값이 0x04가 아니어서 Incorrect UID로 빠졌을 것입니다. 그리고 다른 카드를 대면 아무런 값이 안나올건데요. 문법으로 보면 첫번째 if문이 괄호가 없는데, 이럴때는 적용되는 범위가 두번째 if문이 되고, else는 두번째 if문에서 적용되는 else 입니다.

값을 여러개 인지하고 싶으시면 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 일때 맞음으로 들어가고, 아니면 틀림으로 빠집니다.
찬이 2019-08
int check_card(const unsigned char *input) {
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문으로는 너무 길어집니다.
     
김건우 2019-08
알려주셔서 감사한데...그러면 밑에 else에 의한 응답처리는 어떻게 되나요?

여기서 보면 입력되어있는 카드값을 쭈욱 ...끝까지 비교하고 맞으면 return 1, 아니면 return 0 를 출력한다는 건가요?

그리고 정작 위 코드 넣고 컴파일 해보니 브레이스 { 사용 오류나오기에 ( 로 바꿔주고 실행했는데

이제는 int i; 부분에서 ; 사용오류나와서 원본소스 안에 있는 int 선언하는대로 int i = 7; 이렇게 해줘도 오류..TT

뭔가 문법이 많이 다른거 같네요..
          
찬이 2019-08
혹시 이 소스를 위 소스를 대체해서 함수 안에 넣으신건가요? 그러시지 않은이상 손코딩이긴 하지만 제 눈에 틀린건 잘 보이지 않습니다.
이걸 함수 그대로 넣으시고 원하시는 부분에

if(check_card(mfrc522.uid.uidByte)) {
맞을때
}else{
틀릴때
}

이렇게 사용하심 됩니다.
이천풍 2019-08
int i; 문장을 1라인으로 보내거나, 아니면 for 문 바로 앞으로 보내면 됩니다.
i와 j 같은 카운팅용 변수는 그때그때 선언하거나, 반대로 코드 맨 위에서 선언하는 게 낫습니다.


QnA
제목Page 4990/5715
2015-12   1724089   백메가
2014-05   5191093   정은준1
2020-05   2752   찬이
2024-01   2752   atozztoa
2021-05   2752   고오스
2022-01   2752   송진현
2019-12   2752   Lucyed
2022-06   2752   올닉스
2019-12   2752   xcpng
2019-06   2752   퍼싱글
2019-05   2752   행복하세
2021-10   2752   시골노인
2019-08   2752   일론머스크
2022-11   2752   Setila
2021-06   2752   inquisitive
2020-11   2752   juaha
2022-07   2752   심바트
2019-04   2751   길가던뉴비
2019-07   2751   빠시온
2019-08   2751   김건우
2019-08   2751   민사장
2021-01   2751   제이비젼