質問: RFIDカードがない場合の検出 私は通常の場所から取り外されたときにそれ自体をオンにするモバイルデバイスを構築しようとしています。私はAdafruit PN532 RFIDリーダとMiFareカードでこれをやろうとしています。サンプルコードを使用すると、カードが存在するときに検出できます ``` success= nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); Serial.println("Scanning"); if (success){ Serial.println("FOUND"); } ``` しかし、次のコードを使用してカードが存在しないことを検出しようとすると、RFIDカードが存在している間に "Present"が何度も繰り返されますが、 "カードが消えた" ``` success= nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); Serial.println("Present"); if (!success){ Serial.println("Card Gone"); } ``` これはどのように使用してImの機能です!ここに何か他のものがありますか?私は、RFIDカードの不在を検出することに関するごくわずかな提案しか見つけられておらず、いずれも有用な答えを提示していないようです。ほとんどの場合、ソリューションとして他のハードウェア手法を提案します。それは私が今興味を持っている答えのタイプではありません。なぜ私のコードが間違っているのか理解したいだけです。
回答: まず、コードが適切に構造化されていない。そのはず: ``` 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 ``` がんばろう。