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カードの不在を検出することに関するごくわずかな提案しか見つけられておらず、いずれも有用な答えを提示していないようです。ほとんどの場合、ソリューションとして他のハードウェア手法を提案します。それは私が今興味を持っている答えのタイプではありません。なぜ私のコードが間違っているのか理解したいだけです。

0
少なくとも、このスニペットではなく、関数全体を投稿してください。文脈はありません。
追加された 著者 TisteAndii,

2 答え

まず、コードが適切に構造化されていない。そのはず:

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

がんばろう。

2
追加された
@techkilljoyあなたのコードでは、関数がカードを見つけたら返すだけなので、冗長です。ただし、これらの変更を行うと、数回試行してカードが見つからない場合に関数が0を返すことが可能になります。検出されたカードの戻り値は1になりますが
追加された 著者 TisteAndii,
問題に対処するためのアプローチについての素晴らしい説明と考えに感謝します。私はこれを試す前に1つの質問。あなたの説明から、「if(成功)」行が冗長であるように見えますか?
追加された 著者 techkilljoy,

.cppファイルを編集してタイムアウトを追加することができます。私はブロッキングスキャンを削除するためにこれを行いました。 Adafruit_PN532ソースコードでTIMEOUTを検索してください。

0
追加された