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.