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,
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="";
buonasera,
ho fatto modifica ..ma continua a leggere 4 o 5 volte il valore del tag!!
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
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
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...