まず、コードが適切に構造化されていない。そのはず:
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success)
Serial.println("Present");
else
Serial.println("Card Gone");
図書館で見つけたものから、カードがないときに「カードが消えました」または「現在」のメッセージが表示されないのは、 nfc.readPassiveTargetID()
がブロック機能であるためです。タグが検出されるまで永遠に待機し、呼び出し元に戻ります。読者の範囲内でカードを持ってきたら、関数はすぐに戻り、 loop()
はスムーズに実行され、 'Present'メッセージが何度も何度も繰り返されます。しかし、カードを取り除くと、次の nfc.readPassiveTargetID()
の呼び出しで、関数はカードを見つけようとしますが、何も見つからずに試行を続けて戻りません。したがって、あなたが範囲内にカードを持ってくるまで、 loop()
は決してそのポイントを超えません。
存在の有無を検出するには、観察者は決定の前に所定期間観察する必要があります。ですから、このライブラリの最新バージョンを入手して、ミリ秒 timeout
の引数を nfc.readPassiveTargetID()
に追加します。こうすることで、カードが存在しないと判断して返信する前に、関数がカードを検出しようとする時間を指定することができます。
または、既存の関数をそのまま使用することもできますが、 nfc.readPassiveTargetID()
が返されるまでに最大再試行回数を設定する必要があります。これは setPassiveActivationRetries()
で行います。 0x00から0xFEまでの引数は有限の試行回数を示し、0xFFは永遠に待機します。
nfc.setPassiveActivationRetries(0x9A);//for example
nfc.SAMConfig(); //this comes next
がんばろう。