RFID kartı olmadığında tespit edin

Her zamanki konumdan kaldırıldığında kendini açan bir mobil cihaz oluşturmaya çalışıyorum. Bunu bir Adafruit PN532 RFID okuyucu ve bir MiFare kartı ile yapmaya çalışıyorum. Örnek kodu kullanarak kartın mevcut olduğunu tespit edebilirim

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

Bununla birlikte, aşağıdaki kodu kullanarak kartın yokluğunu tespit etmeye çalıştığımda RFID kartı mevcutken bana "Mevcut" u tekrar tekrar söyleyecektir (Loop'ta olduğu gibi) ancak çıkarıldığında "Present" yazmayı durdurur. ama asla "Kart Gitti" yazdırmaz

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

Bu, nasıl kullanacağımın bir işlevi mi? ya da burada başka bir şey var mı? Bir RFID kartının bulunmadığını tespit etmek için çok az öneri buldum ve bunların hiçbiri yararlı bir cevap vermedi. Çoğu çözüm olarak diğer bazı donanım metodolojilerini önerir. Bu şu an için ilgilenen bir cevap türü değil. Kodumun neden yanlış olduğunu anlamak isterim.

0
En azından, bu snippet'i değil, tüm işlevi gönderin. Bağlam yok.
katma yazar TisteAndii, kaynak

2 cevap

İlk olarak, kodunuz doğru şekilde yapılandırılmamış. Olmalı:

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

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

Kütüphanede bulabildiğim kadarıyla, 'Card Gone' ya da 'Present' mesajını almazsınız çünkü kart yokken nfc.readPassiveTargetID() bir engelleme işlevidir . Bir etiket algılanana kadar sonsuza dek bekleyecektir, bu noktada arayan kişiye geri döner. Okuyucuların menziline bir kart getirdiğinizde, işlev hızlı bir şekilde geri döner ve loop() sorunsuz çalışır ve size 'Present' (Tekrar) mesajını tekrar tekrar verir. Ancak kartı kaldırdığınızda, nfc.readPassiveTargetID() 'nin bir sonraki çağrısında, işlev bir kart bulmaya çalışır, ancak hiçbiri bulunmaz ve sonra denemeye devam eder ve geri dönmez. Bu yüzden loop() , menzil içinde bir kart getirene kadar bu noktayı geçmez.

Bir şeyin varlığını veya yokluğunu tespit etmek için, bir gözlemci bir karar vermeden önce bazı önceden belirlenmiş bir süre boyunca gözlemlemelidir. Bu nedenle, size bir milisaniye en son sürümünü kullanmanızı öneririm nfc.readPassiveTargetID() için zaman aşımı argümanı. Bu şekilde, hiçbir kartın bulunmadığı ve geri dönmediği sonucuna varmadan önce, bir kartın nasıl algılacağını işlevinin ne kadar süre boyunca kullanılmasını istediğinizi belirleyebilirsiniz.

Alternatif olarak, varolan işlevinizi olduğu gibi kullanabilirsiniz, ancak setup() 'da nfc.readPassiveTargetID() ' i döndürmeden önce maksimum yeniden deneme sayısını ayarlamanız gerekir. Bu setPassiveActivationRetries() ile yapılır. 0xFF'den 0xFE'ye kadar olan tüm argümanlar sınırlı sayıda denemeyi gösterirken, 0xFF sonsuza dek beklemek zorundadır:

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

İyi şanslar.

2
katma
@techkilljoy Kodunuzda, gereksizdir çünkü işlev, yalnızca bir kart bulduğunda döner. Ancak, bu değişiklikleri yaparsanız, birkaç kez denedikten ve kart bulmadıktan sonra, işlev 0'a geri dönmek mümkün olacaktır. Tespit edilen bir kart, 1'lik bir getiri değeriyle sonuçlanacaktı
katma yazar TisteAndii, kaynak
Sorunu ele alma yaklaşımları hakkında harika açıklama ve düşünceleriniz için teşekkür ederim. Bunu denemeden önce bir soru. Açıklamanızdan, "eğer (başarı)" çizgisi gereksiz görünüyor?
katma yazar techkilljoy, kaynak

.Cpp dosyasını düzenleyebilir ve zaman aşımı ekleyebilirsiniz. Bunu engelleme taramasını kaldırmak için yaptım. Adafruit_PN532 kaynak kodunda TIMEOUT ara.

0
katma