Detecteren wanneer RFID-kaart afwezig is

Ik probeer een mobiel apparaat te bouwen dat zichzelf inschakelt wanneer het van de gebruikelijke locatie wordt verwijderd. Ik probeer dit te doen met een Adafruit PN532 RFID-lezer en een MiFare-kaart. Met behulp van de voorbeeldcode kan ik detecteren wanneer de kaart aanwezig is

success= nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
Serial.println("Scanning");
if (success){
  Serial.println("FOUND");
}

Als ik echter probeer de afwezigheid van de kaart te detecteren met behulp van de volgende code, zal deze me keer op keer "Presenteren" (omdat het zich in de lus bevindt) terwijl de RFID-kaart aanwezig is, maar wanneer deze wordt verwijderd, stopt het met afdrukken van "Presenteren" maar drukt nooit "Card Gone" af

success= nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
    Serial.println("Present");
    if (!success){
      Serial.println("Card Gone");
    }

Is dit een functie van hoe ik gebruik! of speelt hier nog iets anders? Ik heb zeer weinig suggesties gevonden met betrekking tot het detecteren van de afwezigheid van een RFID-kaart en geen van deze lijkt een nuttig antwoord te bieden. De meesten suggereren een andere hardwaremethodologie als de oplossing. Dat is niet het type antwoord dat ik op dit moment interessant vind. Ik zou gewoon willen achterhalen waarom mijn code onjuist is.

0
Plaats de volledige functie, althans, niet dit fragment. Er is geen context.
toegevoegd de auteur TisteAndii, de bron

2 antwoord

Ten eerste is uw code niet goed gestructureerd. Het zou moeten zijn:

success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

if (success)
  Serial.println("Present");
else
  Serial.println("Card Gone");

Van wat ik in de bibliotheek kon vinden, is de reden waarom je het 'Card Gone' of 'Present' bericht niet krijgt als er geen kaart is, omdat nfc.readPassiveTargetID() een blokkerende functie is . Het zal voor altijd wachten tot een tag wordt gedetecteerd, waarna het terugkeert naar de beller. Wanneer u een kaart binnen het bereik van de lezer brengt, keert de functie snel terug en loopt loop() soepel, waardoor u het bericht 'Aanwezig' steeds weer opnieuw krijgt. Wanneer u de kaart echter verwijdert bij de volgende aanroep van nfc.readPassiveTargetID() , probeert de functie een kaart te vinden maar vindt deze niet en blijft dan proberen en keert niet terug. Dus lus() komt nooit voorbij dat punt, totdat je een kaart weer binnen bereik brengt.

Om de aanwezigheid of afwezigheid van iets te detecteren, moet een waarnemer gedurende een bepaalde vooraf bepaalde periode observeren voordat hij een beslissing neemt. Dus ik stel voor dat je de laatste versie van deze bibliotheek krijgt, die je de mogelijkheid geeft om een ​​milliseconden timeout argument voor nfc.readPassiveTargetID() . Op die manier kunt u aangeven hoelang u wilt dat de functie een kaart probeert te vinden voordat er wordt besloten dat er geen kaart is en terugkomt.

U kunt ook uw bestaande functie gebruiken zoals deze is, maar in setup() moet u het maximale aantal herhalingen instellen voordat de nfc.readPassiveTargetID() retourneert. Dit gebeurt met setPassiveActivatieRetries() . Elk argument van 0x00 tot 0xFE geeft een eindig aantal pogingen aan, terwijl 0xFF voor altijd moet wachten:

nfc.setPassiveActivationRetries(0x9A);//for example
nfc.SAMConfig(); //this comes next

Succes.

2
toegevoegd
@techkilljoy In uw code is het overbodig omdat de functie alleen terugkomt als een kaart wordt gevonden. Als u deze wijzigingen aanbrengt, wordt het echter mogelijk dat de functie 0 retourneert nadat u enkele keren hebt geprobeerd en geen kaart hebt gevonden. Een kaart die wordt gedetecteerd, resulteert echter in een retourwaarde van 1
toegevoegd de auteur TisteAndii, de bron
bedankt voor de geweldige uitleg en gedachten over benaderingen om het probleem aan te pakken. Een vraag voordat ik dit probeer. Uit uw uitleg blijkt dat de "if (succes)" -regel overbodig is?
toegevoegd de auteur techkilljoy, de bron

U kunt het .cpp-bestand bewerken en een time-out toevoegen. Ik deed dit om de blokkerende scan te verwijderen. Zoek naar TIMEOUT in de Adafruit_PN532-broncode.

0
toegevoegd