Arduino nano +RFID 125 Khz

ciao scusate l'assenza ma oggi sono andato a farmi una sciata!!! :grinning:

sul boolean ..ho qualche problema... mi potresti fare un esempio pratico?

grazie
bye
massi

ciao...boolean è una variabile che può avere "solo" due valori true o false ...potresti scrivere così:

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

in questo modo questo pezzo di codice viene svolto solo se boolVar è false...ci sono due cose implicite...la prima è che devi dichiarare "boolean boolVal = false;" nelle globali; la seconda è che da qualche parte devi ritornarla false altrimenti non ti eseguirà più questo pezzo di codice.

grazie Orso,

provo anche questa soluzione....
ma secondo voi servirebbe agire sugli interrupt ??

massi

ciao...di solito l'interrupt, almeno quello che gestisci con il comando attachedInterrupt(), è legato ad un pin impostato come ingresso; quando questo pin assume lo stato prefissato ( LOW, CHANGE, RISING, FALLING) attiva una funzione legata ad esso e che ha precedenza su tutto il resto del programma...di solito viene usato per conteggio impulsi quando vuoi essere sicuro di non perdere "colpi"...tipo la lettura di un encoder...penso che con quanto vuoi fare tu, al momento, non centri molto.

grazie! allora provo con boolean! :slight_smile:

buonasera,

ho provato a fare alcune modifiche ... purtroppo non riesco a risolvere il problema...

se avete altri consigli da provare!

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 [] = {"18002CA2F9","18002CA2F8"};

char data [14];

String message; 
// boolean boolVar = false ;
unsigned long previousMillis = 0;
long interval =10;
  
void setup ()
{
    Serial.begin(9600);
    bluetooth.begin(9600);
    RFID.begin (9600);
    SPI.begin();
    pinMode (rele, OUTPUT);
    digitalWrite (rele ,LOW);
    Serial.println("Ingresso CANTINA");
    Serial.println("RFID registrati n --> "+String(sizeof(IDOK)/sizeof(String)));
    Serial.println("In attesa di lettura scheda/bluetooth");
               }
 void loop ()
{
     // Serial.println("BLUETOOTH CANTINA");
  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; 
                   
         String IdTest="";
        if (RFID.available ()> 0)      {          
        
        for (int i = 0; i <14; i ++)        
       {
        data [i] = RFID.read ();  
        
        Serial.println(i);        
       }
        for (int i = 1; i <11; i ++)
            {
             char d = data [i];                 
             IdTest+= d; 
             Serial.println(IdTest);                                
             }
            
  Serial.print("RFID tag rivelato --> ");
  Serial.println(IdTest);
  Serial.println("");
   
  boolean controllo = false;
  boolean  boolVar = false ;
    
  for (int i = 0; i <sizeof (IdTest)/sizeof(String); i ++)  
 {  
         if (IDOK [i] = IdTest && boolVar==false)
        {
          Serial.println("Accesso consentito");
          opendoor();
          IdTest = "";
          controllo = true;
          boolVar=true;
          break ;
        }
         
    if(!controllo){
   Serial.println("Accesso vietato");
   Serial.println("");
      delay (1000);
      break;
             }
            }
     Serial.println();
     Serial.println("In attesa di lettura...");
     Serial.println("");
        }
         }
    }
     }
void opendoor ()
{
  digitalWrite (rele,HIGH);
  tone (8, 1800, 600);
  Serial.println("Rele ON");  
  delay (1000);
  digitalWrite (rele,LOW);
  Serial.println("Rele OFF");
}

ciao...prova lo sketch allegato...in pratica ho messo boolVar nelle globali; ho aggiunto una ulong per una verifica con millis() ed un if alla fine che dopo 5000 ms (penso siano sufficienti...altrimenti incrementa) resetta boolVar se true...fammi sapere.

#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 [] = {"18002CA2F9", "18002CA2F8"};

char data [14];

String message;
boolean boolVar = false ;
unsigned long previousMillis = 0;
unsigned long boolVarMillis;
long interval = 10;

void setup ()
{
  Serial.begin(9600);
  bluetooth.begin(9600);
  RFID.begin (9600);
  SPI.begin();
  pinMode (rele, OUTPUT);
  digitalWrite (rele , LOW);
  Serial.println("Ingresso CANTINA");
  Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
  Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
  // Serial.println("BLUETOOTH CANTINA");
  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;

      String IdTest = "";
      if (RFID.available () > 0)      {

        for (int i = 0; i < 14; i ++)
        {
          data [i] = RFID.read ();

          Serial.println(i);
        }
        for (int i = 1; i < 11; i ++)
        {
          char d = data [i];
          IdTest += d;
          Serial.println(IdTest);
        }

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

        boolean controllo = false;
        //boolean  boolVar = false ;

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

          if (!controllo) {
            Serial.println("Accesso vietato");
            Serial.println("");
            delay (1000);
            break;
          }
        }
        Serial.println();
        Serial.println("In attesa di lettura...");
        Serial.println("");
      }
    }
  }
  if (millis() >= boolVarMillis + 5000 && boolVar == true) {
    boolVar = false;
  }
}
void opendoor ()
{
  digitalWrite (rele, HIGH);
  tone (8, 1800, 600);
  Serial.println("Rele ON");
  delay (1000);
  digitalWrite (rele, LOW);
  Serial.println("Rele OFF");
}

ciao grazie mille..stasera lo metto su! :slight_smile:

solo una questione riguarda all'utilizzo del Millis... avevo letto che essendo legato al tempo iniziale in cui viene attivato arduino ... dopo tot tempo .. non funziona più correttamente perchè necessiterebbe di un reset...
la cosa non andrebbe bene per il mio utilizzo perchè una volta assemblato il tutto non potrò più fare nessun intevento sulla board.... mi puoi spiegare qualcosa in più--

grazie

massi

ciao...per il momento ti rispondo copiando un cazziatone che mi ha dato Giglielmo qualche giorno fa proprio su millis():

Esempio pratico : Primo valore letto 4294967000, secondo valore letto 705 ... quanto è passato ?

705 - 4294967000 = -4294966295 ma ... il numero è un unsigned long quindi NON può avere segno per cui il valore che assume è il massimo di un unsigned long (4294967296) meno il valore 4294966295 che da ... 1001 che è il tempo passato :smiley:

Provare per credere ... :wink:

Guglielmo

suggerendomi al tempo stesso di rileggermi QUESTO link...cosa buona e giusta!
in codesto link trovi 2 modi per risolvere l'overflow di millis().

EDIT: ad ogni modo con le modifiche fatte lo sketch funziona?

massibal:
solo una questione riguarda all'utilizzo del Millis... avevo letto che essendo legato al tempo iniziale in cui viene attivato arduino ... dopo tot tempo .. non funziona più correttamente perchè necessiterebbe di un reset...

Ancora con queste sciocchezze ? ? ? :o :o :o
Ma fatele un po' di ricerche qui sul forum ... se ne parla in continuazione ... l'ultima volta pochi giorni fa, da QUI in poi !!! Chi parla di reset di millis() NON ha capito come usare la funzione !

Guglielmo

P.S.: Che poi vi sfido a resettare una funzione :stuck_out_tongue_closed_eyes: ... al limte è possibile vedere quale contatore essa restituisce ed azzerare il contatore ... :smiling_imp:

buongiorno orso ,
ho provato la tua modifica, purtroppo anche mettendo 10000 continua a darmi lo stesso errore!!
se passo il tag velocissimo allora funziona e legge una sola volta ... ma se sono un pò più lento.legge 2 o 3 volte !!!

peccato.!!

funzione Millis() ... andrò a leggere il forum... ma non mi è mai piaciuta e se riesco la evito .. forse per questo che non l'ho ancora capita... in ogni caso se si resetta arduino... cosa succeda alla funzione ??

grazie

ciao

massibal:
... in ogni caso se si resetta arduino... cosa succeda alla funzione ??

Niente. La funzione funziona! E' il contatore che si resetta.

Purtroppo millis() prima o poi la devi "digerire".

Vuoi una soluzione facile facile? metti un bel delay(2000) dopo che hai riconosciuto l'RFID e hai tutto il tempo di toglierlo dal lettore.

Naturalmente in quei 2 secondi non puoi fare assolutamente niente. Se a te va bene...

ciao
pippo72

massibal:
funzione Millis() ... andrò a leggere il forum... ma non mi è mai piaciuta e se riesco la evito ..

Molto male perché è fondamentale e ... se NON capisci esattamente come si usa, NON potrai mai fare una applicazione che durante un periodo di attesa può fare altre cose dato che l'alternativa, delay(), è una funzione bloccante !

Se vuoi fare qualche cosa di appena più complesso, NON c'è altra strada ... devi studiare (non leggere) come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... c'è tutto quello che occorre sapere.

Guglielmo

lo so e vi ringrazio per le preziose indicazioni sul Millis!

..era un post un pò irriverente :slight_smile:

.. se qualcosa è stato creato ... prima o poi sarà indispensabile!!

per pippo :

il delay l'ho già provato ovunque ...anche nel caffè :slight_smile: , ma continua farmi lo stesso errore di lettura ripetuta.. se hai modo di vedere il mio programma .. mi puoi dire esattamente dove dovrei inserirlo..

grazie
buon lavoro
massi

ciao...forse mi sono accorto di un errore...prova questo:

#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 [] = {"18002CA2F9", "18002CA2F8"};

char data [14];

String message;
boolean boolVar = false ;
unsigned long previousMillis = 0;
unsigned long boolVarMillis;
long interval = 10;

void setup ()
{
  Serial.begin(9600);
  bluetooth.begin(9600);
  RFID.begin (9600);
  SPI.begin();
  pinMode (rele, OUTPUT);
  digitalWrite (rele , LOW);
  Serial.println("Ingresso CANTINA");
  Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
  Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
  // Serial.println("BLUETOOTH CANTINA");
  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;

      String IdTest = "";
      if (RFID.available () > 0)      {

        for (int i = 0; i < 14; i ++)
        {
          data [i] = RFID.read ();

          Serial.println(i);
        }
        for (int i = 1; i < 11; i ++)
        {
          char d = data [i];
          IdTest += d;
          Serial.println(IdTest);
        }

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

        boolean controllo = false;
        //boolean  boolVar = false ;

        for (int i = 0; i < sizeof (IdTest) / sizeof(String); i ++)
        {
          if (IDOK [0] == IdTest || IDOK[1] == IdTest && boolVar == false)
          {
            Serial.println("Accesso consentito");
            opendoor();
            IdTest = "";
            controllo = true;
            boolVar = true;
            boolVarMillis = millis();
            break ;
          }

          if (!controllo) {
            Serial.println("Accesso vietato");
            Serial.println("");
            delay (1000);
            break;
          }
        }
        Serial.println();
        Serial.println("In attesa di lettura...");
        Serial.println("");
      }
    }
  }
  if (millis() >= boolVarMillis + 5000 && boolVar == true) {
    boolVar = false;
  }
}
void opendoor ()
{
  digitalWrite (rele, HIGH);
  tone (8, 1800, 600);
  Serial.println("Rele ON");
  delay (1000);
  digitalWrite (rele, LOW);
  Serial.println("Rele OFF");
}

se funziona sta nella verifca di IDOK

Ciao orso,
solo un dubbio alla riga

if (IDOK == IdTest || IDOK == IdTest && boolVar == false)

essendo sotto un ciclo for

non ci dovrebbe essere la * cioè*
_ if (IDOK * == IdTest || IDOK == IdTest && boolVar == false)[/color]*_
grazie
massi

scusa ..

`` if (IDOK* == IdTest || IDOK == IdTest && boolVar == false)*

scusa ma non capisco non mi prende la parentesi quadra !!

if (IDOK i == IdTest || IDOK == IdTest && boolVar == false)

Come non ti prende le parentesi quadre ? ... magari le interpreta ... ::slight_smile:

NON PER NULLA il regolamento dice di chiudere sempre il codice nei tag CODE, perché altrimenti le sequenze di caratteri possono essere prese per emoticons o BBcode !

Ecco un banale esempio: ( i * 8 ) ... se lo scrivo senza gli spazi guarda come interpreta la parte finale (i*8) ... mentre se lo chiudo nei tag CODE:

(i*8)

non ho alcun problema.

Guglielmo

ok
però se guardi la mia reply #36 li avevo usato il CODE ... ma le parentesi quadre con la i non me le ha prese ?

if (IDOK[i]   == IdTest || IDOK == IdTest && boolVar == false)