Go Down

Topic: Presenza TAG RFID (Read 71 times) previous topic - next topic

khriss75

Mi sto portando avanti con il regalo di Natale per mio padre che si diverte a realizzare presepi.

Vorrei controllare la presenza o meno di due o più elementi (statuine) in modo da eseguire dei cicli di illuminazione (led RGB) ed eventuali musichette.

Utilizzo dei TAG da incollare alla base delle statue.

Ho abbozzato un primo sketch per rilevare la presenza o meno del TAG:

Code: [Select]

#include <MFRC522.h>

MFRC522 rfid2(8, 7);

void setup() {
    Serial.begin(115200);
  SPI.begin();
  rfid2.PCD_Init();

}

void loop() {
  // Look for cards
 if ( ! rfid2.PICC_IsNewCardPresent())
 {
    delay(50);
  if ( ! rfid2.PICC_IsNewCardPresent())
  {
    delay(50);
    Serial.println("TESSERA 2 NON PRESENTE");
    return;
    }
  }

 Serial.println("TESSERA 2 PRESENTE");


}


Funziona correttamente, non appena avvicino una tessera ne rileva la presenza, se allontano "TESSERA 2 NON PRESENTE" e fin qua tutto ok.

Passo successivo: utilizzare due lettori RFID per leggere il codice e verificare la presenza del TAG. Se tolgo il tag ad esempio spegne la luce.

Ho abbozzato questo sketch (preavviso che le string verranno poi trasformate con array char!   :smiley-razz: )

Code: [Select]

#include <MFRC522.h>

MFRC522 rfid1(10, 9);
MFRC522 rfid2(8, 7);
boolean presenza_tessera = false;
unsigned long tempo_precedente = millis();

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid1.PCD_Init();
  rfid2.PCD_Init();

}

void loop() {
  if (rfid1.PICC_IsNewCardPresent() && rfid1.PICC_ReadCardSerial()) {
    String uid1 = getUID1();
    Serial.println("TESSERA 1: " + uid1);
  }
  delay(50);

  if (rfid2.PICC_IsNewCardPresent() && rfid2.PICC_ReadCardSerial()) {
    String uid2 = getUID2();
    Serial.println("TESSERA 2 RILEVATA: " + uid2);
    presenza_tessera = true;
  }
  delay(50);

  if (millis() - tempo_precedente > 5000) {
    tempo_precedente = millis();
    Serial.println("chiedo di verificare tessera 2");
    boolean presenza_tessera = rileva_presenza_tessera();
    if (!presenza_tessera) {
      Serial.println("TESSERA 2 NON PRESENTE");
    }
  }

}



String getUID1() {
  String uid1 = "";
  for (int i = 0; i < rfid1.uid.size; i++) {
    uid1 += rfid1.uid.uidByte[i] < 0x10 ? "0" : "";
    uid1 += String(rfid1.uid.uidByte[i], HEX);
  }
  rfid1.PICC_HaltA();
  return uid1;
}

String getUID2() {
  String uid2 = "";
  for (int c = 0; c < rfid2.uid.size; c++) {
    uid2 += rfid2.uid.uidByte[c] < 0x10 ? "0" : "";
    uid2 += String(rfid2.uid.uidByte[c], HEX);
  }
  rfid2.PICC_HaltA();
  return uid2;
}


boolean rileva_presenza_tessera() {
  Serial.println("ora controllo la presenza della tessera 2");
// Look for cards
 if ( ! rfid2.PICC_IsNewCardPresent())
 {
    delay(50);
  if ( ! rfid2.PICC_IsNewCardPresent())
  {
    delay(50);
  Serial.println("TESSERA 2 NON TROVATA");
    return;
    }
  }

presenza_tessera = true;
return presenza_tessera;
}


Con questo sketch leggo l'ID delle due tessere ma non riesco a controllare la presenza o meno della tessera 2.
Questo è quanto ricevo sul serial monitor:

Code: [Select]
11:52:37.036 -> TESSERA 2 RILEVATA: 23284f1b
11:52:38.945 -> chiedo di verificare tessera 2
11:52:38.945 -> ora controllo la presenza della tessera 2
11:52:39.119 -> TESSERA 2 NON TROVATA
11:52:44.028 -> chiedo di verificare tessera 2
11:52:44.028 -> ora controllo la presenza della tessera 2
11:52:44.197 -> TESSERA 2 NON TROVATA

(ovviamente la tessera 2 è in posizione e non è stata allontanata!).

Dove sto sbagliando?

Grazie!

SukkoPera

Potrei dire una vakkata, ma mi pare che molti dei lettori RFID economici abbiano un problema per cui tengono occupato il bus SPI anche quando non selezionati, creando problemi quando si usa più di un dispositivo, come ad esempio due lettori.

Verifica se può essere questo il tuo problema.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

khriss75

Non credo sia quello il problema, se avvicino il tag ad sensore, rilva la presenza sia al sensore 1 che al 2.
Con il secondo sketch non viene rilevato l allontanamento del tag ma solo quando lo avvicino nuovamente (ovviamente parlo del sensore2, per il primo non sto facendo controllo)

Go Up