Problema display LCD e rfid

Ciao a tutti.
Ho recuperato da internet e modificato uno sketch Arduino per poter creare un'interruttore RFID con un display LCD per la visualizzazione dei vari messaggi.
Sono riuscito a modificarlo per attivare e disattivare un pin (chiamato Rel, pin 8) sempre con la stessa tessera.
Ho aggiunto i comandi per stampare le informazioni sul display LCD, però c'è un problema :
Al primo passaggio tutto ok, si attiva il pin e vengono scritti i messaggi sul display. Al secondo passaggio, dato che deve essere disattivato il pin, viene ripetuto lo sketch, però il problema è che viene anche stampato sempre lo stesso messaggio sul display...

Faccio un piccolo esempio:

-passo la tessera-
Pin 8 attivo
Display: "Pin attivo"
-passo nuovamente la tessera-
Pin 8 disattivato
Display: "Pin disattivato"

Questo è quello che, in sintesi, dovrebbe fare, però in realtà fa:

-passo la tessera-
Pin 8 attivo
Display: "Pin attivo"
-passo nuovamente la tessera-
Pin 8 disattivato
Display: "Pin attivo"

L'errore sta nelle istruzioni che stampa sul display. Come posso risolvere? Grazie in anticipo.

Ecco lo sketch:

#include <LiquidCrystal.h>

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:
 
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
*/
int Rel = 8;
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
String codiceAutorizzato = "9692D94895";

 const int rs = 7, en = 6, d4 =5, d5 = 4, d6 = 3, d7 = 2;
 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


unsigned char i;
boolean pinState;
 
void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
 pinMode(Rel, OUTPUT);
 digitalWrite(Rel, LOW);
 pinState = digitalRead(Rel);

 lcd.begin(20, 4);
 lcd.setCursor(5, 0);
 lcd.print("Stato:  ON");
 lcd.setCursor(0, 1);
 lcd.print("Allarme: ON");
 lcd.setCursor(0, 3);
 lcd.print("Serrature: Bloccate");
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
      delay(4000);
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print( "...Attivo...");
      lcd.setCursor(0, 1);
      lcd.print("Wait...");
      delay(2000);
      digitalWrite(Rel, !digitalRead(Rel));
      pinState = digitalRead(Rel);
      delay(1000);
      lcd.clear();
       lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
    }else{
      
 Serial.println("Tessera non autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("########RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave errata");
      lcd.setCursor(0, 2);
      lcd.print("######BLOCCATO######");

    }
  delay(delayRead);  
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}

Grazie in anticipo per gli aiuti

Non c'è nulla nel codice che hai postato che fa quello che tu vorresti fare, ovvero tutto ciò che fa il tuo codice è legge la tessera e verifica se è autorizzata, nel caso stampa un messaggi aspetta 4 secondi, scrive che sta attivando il relé, aspetta 2 secondi e riscrive il vecchio messaggio.
Primo consiglio, NON usare MAI la classe String su Arduino, ti crea solo problemi, usa solo solo array di char e le funzioni per verificare se due "stringhe" (in realtà due array di char) sono uguali ovvero strcmp o meglio ancora la strncmp.
Dopodichè ti dico che ti serve una variabile booleana che ti indichi in che stato sei (allarme attivo/disattivo) e di consguenza stampare ciò che devi sul display e fare ciò che vuoi in funzione dello stato del sistema

fabpolli:
Non c'è nulla nel codice che hai postato che fa quello che tu vorresti fare, ovvero tutto ciò che fa il tuo codice è legge la tessera e verifica se è autorizzata, nel caso stampa un messaggi aspetta 4 secondi, scrive che sta attivando il relé, aspetta 2 secondi e riscrive il vecchio messaggio.
Primo consiglio, NON usare MAI la classe String su Arduino, ti crea solo problemi, usa solo solo array di char e le funzioni per verificare se due "stringhe" (in realtà due array di char) sono uguali ovvero strcmp o meglio ancora la strncmp.
Dopodichè ti dico che ti serve una variabile booleana che ti indichi in che stato sei (allarme attivo/disattivo) e di consguenza stampare ciò che devi sul display e fare ciò che vuoi in funzione dello stato del sistema

Ne sono consapevole del fatto che non ci sia il pezzo di codice per stampare le istruzioni di disattivazione del pin, infatti sto cercando aiuto qui, perchè non sono in grado di modificare fino a questo punto lo sketch, non ho le conoscenze di programmazione sufficienti. Se tu riusciresti a dirmi come fare, dove modificarlo e in che modo, te ne sarei grato. Non so proprio come modificarlo. Mi basta solo che tu modifichi il pezzo necessario e al massimo metti un commento ( //qui è dove devi scrivere le istruzioni per l'LCD) e poi ci penso io a scrivere il resto.
Ti ringrazio in anticipo, e ringrazio anche chi mi aiuterà, oltre a te

Ti indico solo la strada, ma comunque credo che senza prendere un buon manuale di programmazione C andrai poco lontano...
prima del setup una cosa tipo:

bool bSistemaAttivo = false;

poi nel loop quando la tessera è stata autorizzata:

if(bSistemaAttivo)
{
  lcd.print("Attivo allarme");
}
else
{
  lcd.print("Disattivo allarme");
}
bSistemaAttivo = !bSistemaAttivo;

fabpolli:
Ti indico solo la strada, ma comunque credo che senza prendere un buon manuale di programmazione C andrai poco lontano...
prima del setup una cosa tipo:

bool bSistemaAttivo = false;

poi nel loop quando la tessera è stata autorizzata:

if(bSistemaAttivo)

{
  lcd.print("Attivo allarme");
}
else
{
  lcd.print("Disattivo allarme");
}
bSistemaAttivo = !bSistemaAttivo;

Grazie, è un inizio. Non dico che riuscirò sicuramente a sistemare lo sketch, ma ci provo... Se potete aiutarmi ancora mi fareste un favore. Altri pezzetti, giusto per riuscire a sistemarlo.
Comunque, ho ordinato proprio oggi "Manuale completo di arduino", mi arriva il primo di Agosto

fabpolli:
Ti indico solo la strada, ma comunque credo che senza prendere un buon manuale di programmazione C andrai poco lontano...
prima del setup una cosa tipo:

bool bSistemaAttivo = false;

poi nel loop quando la tessera è stata autorizzata:

if(bSistemaAttivo)

{
  lcd.print("Attivo allarme");
}
else
{
  lcd.print("Disattivo allarme");
}
bSistemaAttivo = !bSistemaAttivo;

Io ci ho provato.. ma non ci riesco, non so cosa fare. Puoi darmi un altro aiuto? Non sono in grado di fare da solo questa cosa

aleelettronica:
Va bene, però a me basterebbe solo una spiegazione per arrivare a modificare questo sketch...

Cosa non hai capito della soluzione che ti ha proposto "fabpolli"? Dove e quale problema incontri nel metterla in pratica? Dicci e vediamo di aiutarti ... ::slight_smile:

Guglielmo

P.S.: Pulisco il thread da tutte le inutile chiacchiere, riprendiamo da queste domande ... :wink:

Allora...
Intanto non so come scriverlo, perchè se lo scrivo pari pari a come mi ha detto lui, ovviamente non funziona...
Vorrei capire un attimo dove dover scrivere quelle istruzioni e come usarle, perchè ad esempio il nome che usa lui ("bSistemaAttivo") credo non sia dichiarato.. o comunque non corrisponde a nessun pin di arduino, nel mio caso il pin 8

... infatti bSistemaAttivo è una variabile di tipo "booleana" che devi dichiarare (e difatti lui la definisce e ti dice dove metterla) e che viene poi usata come una "flag" (ovvero una "bandierina" che ti permette di ricordare una condizione, nel tuo caso se l'allarme è inserito o meno).

Il resto del codice verifica tale "flag" e, in funzione se essa è vera o falsa ti permette di fare due cose diverse (inviare, ad esempio due messaggi diversi sul LCD) e di ricordare il nuovo stato (l'istruzione bSistemaAttivo = !bSistemaAttivo; non fa altro che invertirne il valore, se prima era vera diventa falsa e viceversa, così da ricordare la nuova condizione).

Guglielmo

allora non va.. perchè l'ho scritta esattamente dove diceva lui, però il display stampa il primo messaggio quando il led è attivo, poi passo nuovamente la tessera, il led non si disattiva però sul display esce il secondo messaggio... Dove sbaglio?

io ho fatto così:

#include <LiquidCrystal.h>

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:
 
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
*/
int Rel = 8;
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
String codiceAutorizzato = "9692D94895";

 const int rs = 7, en = 6, d4 =5, d5 = 4, d6 = 3, d7 = 2;
 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


unsigned char i;
bool pinState;
 bool bSistemaAttivo = false;
void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
 pinMode(Rel, OUTPUT);
 digitalWrite(Rel, LOW);
 pinState = digitalRead(Rel);

 lcd.begin(20, 4);
 lcd.setCursor(5, 0);
 lcd.print("Stato:  ON");
 lcd.setCursor(0, 1);
 lcd.print("Allarme: ON");
 lcd.setCursor(0, 3);
 lcd.print("Serrature: Bloccate");
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
      delay(4000);
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print( "...Attivo...");
      lcd.setCursor(0, 1);
      lcd.print("Wait...");
      delay(2000);
      digitalWrite(Rel, !digitalRead(Rel));
      pinState = digitalRead(Rel);
      delay(1000);
      lcd.clear();
       lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
    }else{
      
 Serial.println("Tessera non autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("########RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave errata");
      lcd.setCursor(0, 2);
      lcd.print("######BLOCCATO######");

    }
  delay(delayRead);  
  }
}

void Stampa (){
  if(bSistemaAttivo)
{
  lcd.print("Attivo allarme");
}
else
{
  lcd.print("Disattivo allarme");
}
bSistemaAttivo = !bSistemaAttivo;

}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}

... probabilmnte il punto dove metti la bSistemaAttivo = !bSistemaAttivo; ... quella la devi mettere quando attivi e disattivi l'allarme.

Puoi anche fare una cosa, invece di quella riga, quando disattivi l'allarme metti bSistemaAttivo = false; mentre quando lo attivi metti bSistemaAttivo = true; ... così usi la flag per ricordare la condizione.

Guglielmo

così?

void Stampa (){
 if(bSistemaAttivo)
{
 lcd.print("Attivo allarme");
bSistemaAttivo = true;
}
else
{
 lcd.print("Disattivo allarme");
bSistemaAttivo = false;
}


}

Secondo me le devi mettere dove leggi gli RFID e sai se hai attivato o disattivato ... per ricordartelo ... ::slight_smile:

Guglielmo

Il punto è che deve sapere arduino se è attivato o disattivato...
Non so che fare

Scusa è, all'inizio del programma è disattivato e, difatti, la variabile viene creata e inizializzata a "false".

Poi, a seconda dei passaggi la modifichi in true o in false per indicare allarme acceso o spento ... ::slight_smile:

Guglielmo

ma il punto è che il loop è uno solo, non c'è un punto in cui mi dice se è attiva o no, perchè dipende tutto da quante volte passo la tessera rfid.
io ho provato di nuovo a modificare lo sketch in questo modo:

#include <LiquidCrystal.h>

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:
 
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
*/
int Rel = 8;
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
String codiceAutorizzato = "9692D94895";

 const int rs = 7, en = 6, d4 =5, d5 = 4, d6 = 3, d7 = 2;
 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


unsigned char i;
bool pinState;
 bool bSistemaAttivo = false;
 void Info();
 void Info2();

 
void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
 pinMode(Rel, OUTPUT);
 digitalWrite(Rel, LOW);
 pinState = digitalRead(Rel);

 lcd.begin(20, 4);
 lcd.setCursor(5, 0);
 lcd.print("Stato:  ON");
 lcd.setCursor(0, 1);
 lcd.print("Allarme: ON");
 lcd.setCursor(0, 3);
 lcd.print("Serrature: Bloccate");
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
      delay(4000);
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print( "...Attivo...");
      lcd.setCursor(0, 1);
      lcd.print("Wait...");
      delay(2000);
      digitalWrite(Rel, !digitalRead(Rel));
      pinState = digitalRead(Rel);
      if (pinState == HIGH);
      Info();
      if (pinState == LOW);
      Info2();
 
    }else{
      
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Errore tessera");
lcd.setCursor(0, 2);
lcd.print("Tessera non valida");
delay (10000);
lcd.clear();

    }
  delay(delayRead);  
  }

}

void Info(){
lcd.clear();
lcd.print("tutto ok");

}

void Info2(){;
lcd.clear();
lcd.print("Error");
}


// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}

ovviamente ci sono problemi. Dopo il messaggio "Wait.." che stampa sul display, viene stampato "Error", indipendentemente dal fatto se sia HIGH o LOW il pin 8. Ditemi dove sbaglio...
Altra cosa.. se la tessera rfid è errata (Ovvero una tessera non registrata) il display dà il messaggio di errore, però poi si bloccano tutte le funzioni, e bisogna premere il pulsante di reset sulla scheda arduino stessa.

Ho una notizia buona...
FUNZIONA!!

Vi chiedo solo un piacere: Ho smanettato con istruzioni, ho cercato definizioni su google... ma una cosa non la posso fare, e ho bisogno di voi: Potete verificare se lo sketch è tutto ok? Una lettura veloce... giusto per dirmi se c'è qualcosa che non va, se c'è qualcosa in più, se è meglio fare in un modo rispetto a quello che ho usato.. qualunque cosa

ecco lo sketch:

#include <LiquidCrystal.h>

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:
 
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
*/
int Rel = 8;
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
String codiceAutorizzato = "9692D94895";

 const int rs = 7, en = 6, d4 =5, d5 = 4, d6 = 3, d7 = 2;
 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int val = 0;

unsigned char i;

 void Info();
 void Info2();
bool pinState;
 
void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
 pinMode(Rel, OUTPUT);
 digitalWrite(Rel, LOW);
 pinState = digitalRead(Rel);

 lcd.begin(20, 4);
 lcd.setCursor(5, 0);
 lcd.print("Stato:  ON");
 lcd.setCursor(0, 1);
 lcd.print("Allarme: ON");
 lcd.setCursor(0, 3);
 lcd.print("Serrature: Bloccate");
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("#######RFID########");
      lcd.setCursor(0, 1);
      lcd.print("Chiave Riconosciuta");
      lcd.setCursor(0, 2);
      lcd.print("Allarme: Disattivata");
      lcd.setCursor(0, 3);
      lcd.print("Serrature: Sbloccate");
      delay(4000);
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print( "...Attivo...");
      lcd.setCursor(0, 1);
      lcd.print("Wait...");
      delay(2000);
      digitalWrite(Rel, !digitalRead(Rel));
      pinState = digitalRead(Rel);
delay (4000);
     val = digitalRead(Rel);
      if (val == LOW){
      Info();
      }
     else if (val == HIGH){
      Info2();
     }
    }else{
      
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Errore tessera");
lcd.setCursor(0, 2);
lcd.print("Tessera non valida");
delay (5000);
lcd.clear();

    }
  delay(delayRead);  
  }

}

void Info(){
lcd.clear();
lcd.print("tutto ok");

}

void Info2(){;
lcd.clear();
lcd.print("Error");
}


// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}

Ora c'è un problema: Come posso far visualizzare due messaggi sul display nel void setup, di modo da avere sempre le info, ma non impedire la rilevazione della tessera? Vorrei che ci fosse un loop come questo:

lcd.clear();
lcd.print("Tutto ok");
delay(5000);
lcd.clear();
lcd.print("Stato ON");
delay(8000);

Così questo loop, scritto pari pari sul void setup, viene sì eseguito, ma una volta sola... A me servirebbe che si ripetesse all'infinito, finchè ovviamente non si rileva la tessera frid e quindi parte il void loop principale, senza bloccarlo però.
Come posso fare?

Perchè se dichiaro un loop aggiuntivo, ad esempio così:

void Info();

e poi posiziono questo loop dopo il "void setup" e prima del "void loop":

void Info(){
lcd.clear();
lcd.print("Tutto ok");
delay(5000);
lcd.clear();
lcd.print("Stato ON");
delay(8000);
}

Teoricamente questo loop va avanti all'infinito, però impedisce al void loop di avere la precedenza e di poter rilevare la tessera rfid, bloccando quindi tutto il programma...
Come posso fare?

Il setup() serve SOLO ad inizializzare tutto quello che va inizializzato, tutto il resto si fa nel loop(), senza mai usare la funzione delay() (che è bloccante e non permette di fare altre cose), ma utilizzando la funzione millis() per "schedulare" i vari compiti da eseguire in tempi diversi.

Devi studiarti come si usa la suddetta funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... dopo di che, dai un'occhiata anche a QUESTO post.

Nota che è dall'inizio che ti sto dicendo che devi STUDIARE (... e non leggere) ... se non ti metti li e non dedichi tempo allo studio dei link che ti ho già dato e di questi nuovi ... difficilmete vai avanti ... ::slight_smile:

Guglielmo