Arduino nano +RFID 125 Khz

buongiorno,
vi scrivo perchè ho un problema con il mio programma apriporta sotto riportato.

il problema è che quando passo il tag sull’antenna ,il codice del tag viene letto correttamente , ma il programma lo legge 4 o 5 volte , mentre dovrebbe leggerlo una sola volta…

mi potete aiutare _dovrei mettere dei ritardi o dei delay, ma qualsiasi soluzione provata non risolve il problema… quindi il relè viene eccitato 4 o 5 volte invece che una sola per passaggio tag.
grazie mille

#include <SPI.h>
#include <SoftwareSerial.h>
 
int rxPin = 4;
int txPin = 5;
SoftwareSerial RFID (2, 3); // RX and TX
SoftwareSerial bluetooth(rxPin, txPin);


int rele = 9;
byte val = 0;

String IdTest = "";
String IDOK [1] = { "18002CA2F9"};

int data [14];


String message; 

long previousMillis = 0;
long interval = 10;
  
void setup ()
{
    
    Serial.begin(9600);
    bluetooth.begin(9600);
     RFID.begin (9600);
     SPI.begin();
    pinMode (rele, OUTPUT);
    digitalWrite (rele ,HIGH);
   Serial.println("Ingresso ");
   //Serial.println("RFID registrati n --> "+String(sizeof(uidRFID)/sizeof(String)));
    Serial.println("In attesa di lettura scheda/bluetooth");
    
    
    }
 
void loop ()
{
  while(bluetooth.available()){
    message+=char(bluetooth.read());
  }
  if(!bluetooth.available())
  {    if(message!="")
    {//if data is available
      if(message == "1"){
          digitalWrite(rele, LOW);
          Serial.println("Accesso Bluetooth attivato"); 
          delay(20);
          Serial.println("rele ON"); //show the data
          delay(20);
          message=""; //clear the data
       }
        if(message == "0"){
          digitalWrite(rele, HIGH);
          Serial.println("rele OFF"); //show the data
          delay(20);
          message=""; //clear the data
       
       }
        if(message == "3"){
             digitalWrite(rele, LOW);
             Serial.println("Relè ON");
             delay(1000);
             digitalWrite(rele, HIGH);
             Serial.println("Relè OFF");                     
          delay(20);
          message=""; //cear the data
  }
  }
  
   unsigned long currentMillis = millis();
    
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
    delay (200);
  
  if (RFID.available ()> 0)
  {
        for (int i = 0; i <14; i ++)
    {
    
    data [i] = RFID.read ();
    }
    
     for (int i = 1; i <11; i ++)
    {
            char d = data [i];
      
      IdTest = IdTest  + d;
    }
   }
     
   Serial.print("RFID UID rivelato --> ");
  Serial.println(IdTest);
  Serial.println("");
  boolean controllo = false;

  int i;  
  for (i = 0; i <sizeof (IDOK); i ++) {
        if (IDOK [i] == IdTest)
    {
      Serial.println("Accesso consentito");
      opendoor();
      controllo = true;
      break;
    }
  }
 
  if(!controllo){
   Serial.println("Accesso vietato");
   delay(1000);
   }
     Serial.println();
     Serial.println("In attesa di lettura...");
         
      }
           
    } }
void opendoor ()
{
  digitalWrite (rele,LOW);
  Serial.println("Rele ON");
  tone (8, 2200, 600);
  delay (1500);
  digitalWrite (rele,HIGH);
  Serial.println("Rele OFF");
}

ciao...dopo la verifica:

if (IDOK [i] == IdTest)

svuota IdTest con =""

Ciao,
quindi sarebbe :

for (i = 0; i <sizeof (IDOK); i ++) {
        if (IDOK [i] == IdTest)

        String IdTest  ="" ;

    {
      Serial.println("Accesso consentito");
      opendoor();
      controllo = true;
      break;
    }

int i;

io scriverei:

for (i = 0; i <sizeof (IDOK); i ++) {
        if (IDOK [i] == IdTest)

    {
      Serial.println("Accesso consentito");
      opendoor();
      controllo = true;
      IdTest  ="" ;
      break;
    }

EDIT: ho provato a mettere in grassetto ma non funziona…dopo controllo=true metti IdTest="";

grazie mille

questa sera provo! :slight_smile:

buonasera,
ho fatto modifica ..ma continua a leggere 4 o 5 volte il valore del tag!!:frowning:

mi sa che si deve lavorare sui ritardi... ma non so come e dove lavorare ??

altre idee?

grazie mille
massi

penso di aver capito…penso ripeto…il problema sta in come dichiari all’inizio ed usi IDOK:

String IDOK [1] = { "18002CA2F9"};

// e

      int i;
      for (i = 0; i < sizeof (IDOK); i ++) {
        if (IDOK [i] == IdTest)
        {
          Serial.println("Accesso consentito");
          opendoor();
          controllo = true;
          break;
        }
      }

prova con :

String IDOK = "18002CA2F9";

// ed usalo così eliminado il ciclo for:

        if (IDOK == IdTest)
        {
          Serial.println("Accesso consentito");
          opendoor();
          IdTest = "";
          controllo = true;
          break;
        }

buongiorno, grazie dell'idea...
però il ciclo for mi serve perchè adesso ho un solo tag... ma dovrò aggiungerne almeno altri 2 , percui mi servirà il ciclo for!!

ho visto in rete che c'è gente che lavora sugli Interrupt ... ma io purtroppo non so come funzionano!!

comunque per capire se è il ciclo For che mi crea il problema , questa sera provo la tua modifica!

buona giornata
massi

ciao…in pratica per ogni ciclo for tu vai a verificare se il carattere in IDOK nella posizione i, del ciclo, è inclusa nella stringa IdString…in pratica fai una decina di verifiche…quando invece dovresti verificare una volta sola la stringa intera…

ciao

si in effetti hai ragione... non ha molto senso...basta una sola lettura ..
anche se aggiungo due tag nella stringhe "accettate"!

quindi posso eliminare il ciclo for senza compromettere l'aggiunta di più tag, giusto ?

grazie

massi

ciao...in teoria puoi eliminare quel ciclo for portando fuori l'if per il confronto di IDOK e IdString...prova a vedere se così funziona....se vuoi aggiungere altro...lo vediamo dopo...facciamo funzionare una cosa alla volta

ok
grazie

stasera provo! :slight_smile:

massi

buonasera,
purtroppo non è cambiato nulla!!

non riesco a capire dove inserire i ritardi , per fare in modo che una volta avvicinato il tag... e una volta fatta la prima lettura poi il sensore si ferma.. per poi ricominciare dopo poco la scansione!!

massi

ciao....per curiosità quante volte ti ripete questo blocco istruzioni:

      Serial.print("RFID UID rivelato --> ");
      Serial.println(IdTest);
      Serial.println("");

ciao Orso,

direi che dipende dalla velocità con cui passo il tag sopra l'antenna!

generalmente però sono 5 volte , di cui il codice è esatto e ultima lettura che sbaglia il codice !

però se passo velocissimo legge correttamente una sola volta.. ma è una casualità!

grazie
massi

ciao

Secondo me sbagli approccio: non devi impedire al lettore di leggere per tot tempo, devi semplicemente ignorare la lettura se questa è uguale alla precedente; una sorta di "debounce".

ciao
pippo72

ciao Pippo ,

si potrebbe essere una valida soluzione..
..mi puoi dare qualche idea sul come fare!!

grazie
massi

Una cosa del genere:
nel setup crei un array vuoto (es codice_precedente) dove andrai a memorizzare il codice del tag che leggi

nel loop leggi il codice del tag e lo confronti con quello precedente;se è diverso memorizzi il codice letto dentro l'array creato e procedi con i vari controlli, se invece il codice letto è uguale non fai niente.

ciao
pippo72

grazie

ci provo!

massi

ciao...ma se il codice è sempre lo stesso una volta letto lo disabilita per sempre...oppure si deve aggiungere un reset di questo nuovo contenitore dopo tot tempo che è stato riempito....ma a sto punto meglio una boolean con true e false se l'azione è stata eseguita...