Aiuto! Apertura chiavistello mediante tessera magnetica

Salve a tutti,

Vi anticipo che sono un neofita e che sto provando da giorni a creare uno sketch funzionante senza successo.
Ora, demoralizzato dai miei insuccessi, spero di trovare aiuto tra voi esperti.

Come da titolo, vorrei movimentare un chiavistello, mediante un servo, controllato con la tessera magnetica.

Ne ho provate tante, però purtroppo, non me ne è riuscita una.
Mi da errori su errori tanto da farmi venire voglia di lanciare tutto dalla finestra.

Allora ho tolto: fotocellule, sensori di prossimità e quant’altro. Per provare qualcosa di molto più semplice.

Gli faccio leggere lo stato di un “pulsante” in questo caso un micro interruttore; per leggere lo stato della porta. Se chiusa, chiude il chiavistello, se aperta, aspetta che si chiude e poi chiude il chiavistello.

Purtroppo anche qui non riesco a capire come fargli leggere lo stato del pulsante, in modo che riporti il chiavistello sullo stato “chiuso”, una volta che la porta è stata richiusa.

Di seguito lo sketch che ho provato a compilare:

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
const int buttonPin = 2; //Costante pin pulsante
int buttonState = 0; //Variabile lettura stato pulsante

void setup()
{
 Serial.begin(9600); // Inizializzazione comunicazione seriale
 SPI.begin(); // Inizializzazione porta SPI
 mfrc522.PCD_Init(); // Inizializzazione MFRC522
 myServo.attach(3); // Pin dedicato al servo
 myServo.write(1); //Pozisione servo di partenza
 Serial.println("Avvicina la carta al lettore...");
 Serial.println();
 
}
void loop()
{
 // Cerchiamo nuove carte...
 if ( ! mfrc522.PICC_IsNewCardPresent())
{
  return;
}
// Seleziona una delle carte
if ( ! mfrc522.PICC_ReadCardSerial())
{
  return;
}
//Visualizza l'UID della carta sul monitor seriale
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
  Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(mfrc522.uid.uidByte[i], HEX);
  content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
  content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
{
  Serial.println("Accesso Autorizzato");
  Serial.println("Apertura Porta");
  Serial.println();
  delay(500);
  myServo.write(180);
  delay(2000);
  }
else    {
  Serial.println("Accesso Negato");
  delay(300);
        }
{
  if (buttonState == LOW)
  delay(500);
  Serial.println("Chiusura Porta");
  Serial.println();
  myServo.write(1);
}

}

Tale marchingegno, ha la funzione di impedire infarti. Dato che quando i miei entrano in camera, bussando, a volte non aspettano neanche un minimo di delay e si fiondano dentro facendomi sobbalzare sulla sedia.

Sarò eternamente grato a colui che mi aiuterà a risolvere questo enigma.

Così che siano costretti ad aspettare che io apra.

NOTA: Non preoccupatevi del fatto “ma se manca corrente”. Perché ho un UPS e quindi l’arduino sarà collegato a quello. E neanche del fatto se esci e chiudi la porta poi come entri? Perché tale marchingegno, verrà acceso solo quando sono in camera. E comunque si potrà aprire con una tessera anche dall’esterno, per qualsiasi evenienza.

Grazie in anticipo a tutti coloro che mi aiuteranno.

Buona Giornata.

Ho provato a modificato lo sketch, aggiungendo la lettura dello stato del pulsante. Che pensavo di aver dimenticato.

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2 // Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo


void setup()
{
 Serial.begin(9600); // Inizializzazione comunicazione seriale
 SPI.begin(); // Inizializzazione porta SPI
 mfrc522.PCD_Init(); // Inizializzazione MFRC522
 myServo.attach(3); // Pin dedicato al servo
 myServo.write(1); //Pozisione servo di partenza
 Serial.println("Avvicina la carta al lettore...");
 Serial.println();
 
 pinMode(buttonPin, INPUT);

 buttonState = false;
 
}
void loop()
{
 // Cerchiamo nuove carte...
 if ( ! mfrc522.PICC_IsNewCardPresent())
{
  return;
}
// Seleziona una delle carte
if ( ! mfrc522.PICC_ReadCardSerial())
{
  return;
}
//Visualizza l'UID della carta sul monitor seriale
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
  Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(mfrc522.uid.uidByte[i], HEX);
  content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
  content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
{
  Serial.println("Accesso Autorizzato");
  Serial.println("Apertura Porta");
  Serial.println();
  delay(500);
  myServo.write(180);
  delay(2000);
}
else    
{
  Serial.println("Accesso Negato");
  delay(300);
}
{
  buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
  
  if (buttonState == LOW); //Se il pulsante è premuto
    {
  delay(500);
  Serial.println("Chiusura Porta");
  Serial.println();
  myServo.write(1);
 }
  }
   }

A quanto pare ignora completamente questo passaggio.

buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante

if (buttonState == LOW); //Se il pulsante è premuto

E passa direttamente a

delay(500);
  Serial.println("Chiusura Porta");
  Serial.println();
  myServo.write(1);

E quindi sul monitor seriale entro il delay stabilito, mi da subito Chiusura Porta senza che venga premuto il pulsante.

Avvicina la carta al lettore…

UID tag : FC F1 35 BB
Message : Accesso Autorizzato
Apertura Porta

Chiusura Porta

Non c’è proprio nessuno che possa darmi una mano?

Il tuo sketch non compila perché non hai definito buttonState.

Inoltre

Mars1988:
A quanto pare ignora completamente questo passaggio.

buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante

if (buttonState == LOW); //Se il pulsante è premuto

Non lo ignora, lo esegue. È quel punto e virgola al termine dell' "if" che dice al programma "non fare niente".

Toglilo e vediamo.

Ciao,
P.

Allora, intanto grazie infinite dell’aiuto.

Quella virgola, ha cambiato un pò le cose e poi avendo definito buttonState; me lo legge.

L’unico problema è, che se avvicino la tessera apre la porta, ma se poi premo il pulsante (anche tenendolo premuto per 30 secondi), non succede altro.

Invece, se tengo premuto il pulsante, mentre avvicino la tessera; mi apre la porta e poi la richiude. :o

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2// Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
int buttonState = 0;

void setup()
{
 Serial.begin(9600); // Inizializzazione comunicazione seriale
 SPI.begin(); // Inizializzazione porta SPI
 mfrc522.PCD_Init(); // Inizializzazione MFRC522
 myServo.attach(3); // Pin dedicato al servo
 myServo.write(1); //Pozisione servo di partenza
 Serial.println("Avvicina la carta al lettore...");
 Serial.println();
 
 pinMode(buttonPin, INPUT);

buttonState = false;
 
}
void loop()
{
 // Cerchiamo nuove carte...
 if ( ! mfrc522.PICC_IsNewCardPresent())
{
  return;
}
// Seleziona una delle carte
if ( ! mfrc522.PICC_ReadCardSerial())
{
  return;
}
//Visualizza l'UID della carta sul monitor seriale
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
  Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(mfrc522.uid.uidByte[i], HEX);
  content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
  content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
{
  Serial.println("Accesso Autorizzato");
  Serial.println("Apertura Porta");
  Serial.println();
  delay(500);
  myServo.write(180);
  delay(2000);
}
else    
{
  Serial.println("Accesso Negato");
  delay(300);
}
{
  buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
  
  if (buttonState == LOW) //Se il pulsante è premuto
{
  delay(500);
  Serial.println("Chiusura Porta");
  Serial.println();
  myServo.write(1);
 }
  }
   }

Ho provato varie modifiche, ma non cambia nulla…
Sapresti dirmi dove sbaglio?

Grazie in anticipo.
Ciao.

Che significato ha il pulsante (che dovrebbe simulare un microswitch attaccato alla porta)?

  • Pulsante sollevato = porta chiusa
  • Pulsante premuto = porta aperta
    O viceversa?

Comunque il funzionamento dovrebbe essere questo:

  • a riposo: chiavistello chiuso porta chiusa
  • avvicino la tessera autorizzata il chiavistello si apre in attesa che la porta si apra
  • se la porta non si apre dopo un tempo T1 il chiavistello si richiude
  • se la porta si apre e resta aperta si aspetta che si richiuda
  • quando la porta si richiude il chiavistello si chiude

È giusto?

Ciao,
P.

Allora.

Pulsante sollevato = porta aperta
Pulsante premuto = porta chiusa

il funzionamento dovrebbe essere questo:

  • a riposo: chiavistello chiuso porta chiusa
  • avvicino la tessera autorizzata il chiavistello si apre in attesa che la porta si apra
  • se la porta non si apre (il pulsante resta premuto) dopo un tempo T1 il chiavistello si richiude
  • se la porta si apre (il pulsante si solleva) e resta aperta si aspetta che si richiuda (e qui il pulsante viene premuto)
  • quando la porta si richiude il chiavistello si chiude

È giusto?

Si, così sarebbe non giusto, ma perfetto. :slight_smile:

:slight_smile:

Posta lo sketch nella sua versione ATTUALE e che sia COMPILABILE, altrimenti non te lo correggo.

Ciao,
P.

Sei il migliore. :smiley:

Lo sketch allo stato attuale, è compilabile! Anche se non riesco a fargli fare ciò che vorrei.
Se te riuscissi a renderlo utilizzabile per il mio scopo, te ne sarei eternamente grato.

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2// Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
int buttonState = 0;

void setup()
{
 Serial.begin(9600); // Inizializzazione comunicazione seriale
 SPI.begin(); // Inizializzazione porta SPI
 mfrc522.PCD_Init(); // Inizializzazione MFRC522
 myServo.attach(3); // Pin dedicato al servo
 myServo.write(1); //Pozisione servo di partenza
 Serial.println("Avvicina la carta al lettore...");
 Serial.println();
 
 pinMode(buttonPin, INPUT);

buttonState = false;
 
}
void loop()
{
 // Cerchiamo nuove carte...
 if ( ! mfrc522.PICC_IsNewCardPresent())
{
  return;
}
// Seleziona una delle carte
if ( ! mfrc522.PICC_ReadCardSerial())
{
  return;
}
//Visualizza l'UID della carta sul monitor seriale
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
  Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(mfrc522.uid.uidByte[i], HEX);
  content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
  content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
{
  Serial.println("Accesso Autorizzato");
  Serial.println("Apertura Porta");
  Serial.println();
  delay(500);
  myServo.write(180);
  delay(2000);
}
else    
{
  Serial.println("Accesso Negato");
  delay(300);
}
{
  buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
  
  if (buttonState == LOW) //Se il pulsante è premuto
{
  delay(500);
  Serial.println("Chiusura Porta");
  Serial.println();
  myServo.write(1);
 }
  }
   }

Grazie in anticipo

Manuel
:slight_smile:

Ho cercato di impostare il programma come avevamo detto. Devi completarlo dove e come ti ho suggerito nei commenti. Non ho potuto provarlo, quindi non so se funziona. Nel frattempo completalo e provalo. Se non va siamo ancora qui.

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2// Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
int buttonState = 0;

void setup()
{
  Serial.begin(9600); // Inizializzazione comunicazione seriale
  SPI.begin(); // Inizializzazione porta SPI
  mfrc522.PCD_Init(); // Inizializzazione MFRC522
  myServo.attach(3); // Pin dedicato al servo
  myServo.write(1); //Pozisione servo di partenza
  Serial.println("Avvicina la carta al lettore...");
  Serial.println();

  pinMode(buttonPin, INPUT_PULLUP);//==CORREZIONE===============================

  buttonState = false;

}
void loop()
{
  // Cerchiamo nuove carte...
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Seleziona una delle carte
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Visualizza l'UID della carta sul monitor seriale
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
  {
    Serial.println("Accesso Autorizzato");
    Serial.println("Apertura Porta");
    Serial.println();
    delay(500);
    myServo.write(180);
    delay(2000);        //==ATTESA APERTURA PORTA==============================
//{ //==QUESTA PARENTESI È INUTILE=============================================
    buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante

    if (buttonState == LOW) //Se il pulsante è premuto
                            //==SE LA PORTA È ANCORA CHIUSA DOPO 2 SECONDI====
    {
      delay(500);
      Serial.println("Chiusura Porta");
      Serial.println();
      myServo.write(1);     //==CHIUDI CHIAVISTELLO===========================
    }
//==QUESTA PARTE È DA AGGIUNGERE==============================================
    else      //==SE LA PORTA È APERTA (pulsante sollevato)
    {
      //==QUI SCRIVI LE ISTRUZIONI DI ATTESA CHE LA PORTA SI CHIUDA (while..)=
      //==USCITA DALLA LOOP while. QUI LA PORTA È CHIUSA
      // chiudi chiavistello
    }
//} //==QUESTA PARENTESI È INUTILE=============================================
  }   //==FINE CODICE "Accesso Autorizzato"====================================
  else
  {
    Serial.println("Accesso Negato");
    delay(300);
  }   //==FINE CODICE "Accesso Negato"=========================================

//==QUESTA PARTE È STATA TRASFERITA SOTTO LA CONDIZIONE "Accesso Autorizzato" 
//==E MODIFICATA===============================================================
//  {
//    buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
//
//    if (buttonState == LOW) //Se il pulsante è premuto
//    {
//      delay(500);     //==QUESTO delay MI SEMBRA INUTILE
//      Serial.println("Chiusura Porta");
//      Serial.println();
//      myServo.write(1);
//    }
//  }
}   //==FINE LOOP=============================================================

Ciao,
P.

Grazie, ma veramente Grazie.

Ho appena fatto un backup su un dispositivo esterno, così da avere questo codice pulito, per fare tentativi.
Non appena giungierò a qualche conclusione ti farò subito sapere.

Grazie ancora per il tuo tempo,

Ciao
Mars

Ho provato ad inserire la parte che mi hai consigliato ma sicuramente c’e qualche errore…

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2// Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
int buttonState = 0;

void setup()
{
  Serial.begin(9600); // Inizializzazione comunicazione seriale
  SPI.begin(); // Inizializzazione porta SPI
  mfrc522.PCD_Init(); // Inizializzazione MFRC522
  myServo.attach(3); // Pin dedicato al servo
  myServo.write(1); //Pozisione servo di partenza
  Serial.println("Avvicina la carta al lettore...");
  Serial.println();

  pinMode(buttonPin, INPUT_PULLUP);//==CORREZIONE===============================

  buttonState = false;

}
void loop()
{
  // Cerchiamo nuove carte...
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Seleziona una delle carte
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Visualizza l'UID della carta sul monitor seriale
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
  {
    Serial.println("Accesso Autorizzato");
    Serial.println("Apertura Porta");
    Serial.println();
    delay(500);
    myServo.write(180);
    delay(2000);        //==ATTESA APERTURA PORTA==============================
    buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
    if (buttonState == LOW) //Se il pulsante è premuto
                            //==SE LA PORTA È ANCORA CHIUSA DOPO 2 SECONDI====
    {
      Serial.println("Chiusura Porta");
      Serial.println();
      myServo.write(1);     //==CHIUDI CHIAVISTELLO===========================
    }
//==QUESTA PARTE È DA AGGIUNGERE==============================================
    else (buttonState == HIGH);     //==SE LA PORTA È APERTA (pulsante sollevato)
    {
      while (buttonState == LOW) //==QUI SCRIVI LE ISTRUZIONI DI ATTESA CHE LA PORTA SI CHIUDA (while..)=
      Serial.println("Porta Chiusa");
      Serial.println();//==USCITA DALLA LOOP while. QUI LA PORTA È CHIUSA
      myServo.write(1);// chiudi chiavistello
    }
  }   //==FINE CODICE "Accesso Autorizzato"====================================
  else
  {
    Serial.println("Accesso Negato");
    delay(300);
  }   //==FINE CODICE "Accesso Negato"=========================================
}   //==FINE LOOP=============================================================

Questo è cio che mi da sul monitor seriale:

Se il pulsante non è premuto, non chiude la porta. E qui siamo OK

Se tengo premuto il pulsante, mentre appoggio la tessera al lettore o lo premo entro i due secondi, mi da chiusura porta e poi porta chiusa e lo da in loop continuo.

UID tag : FC F1 35 BB
Message : Accesso Autorizzato
Apertura Porta

Chiusura Porta

Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
Porta Chiusa
continuando all’infinito… :smiley: :smiley:

Invece, se premo il pulsante, dopo i due secondi; non succede niente.

Ho provato a fare diverse modifiche ma niente… Dove sbaglio stavolta?

Grazie ancora,

Ciao
Mars

Ho provato un ultima cosa, prima di scappare al lavoro...
Inserendo un return; prima dell' else e dopo la parte in cui dovrebbe richiudere il chiavistello se la porta è ancora chiusa, succede questo.

 Serial.println("Accesso Autorizzato");
    Serial.println("Apertura Porta");
    Serial.println();
    delay(500);
    myServo.write(180);
    delay(2000);        //==ATTESA APERTURA PORTA==============================
    buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
    if (buttonState == LOW) //Se il pulsante è premuto
                            //==SE LA PORTA È ANCORA CHIUSA DOPO 2 SECONDI====
    {
      Serial.println("Chiusura Porta");
      Serial.println();
      myServo.write(1);     //==CHIUDI CHIAVISTELLO===========================
      return;

Ora se tengo premuto il pulsante o lo premo entro i due secondi, mi da:

UID tag : FC F1 35 BB
Message : Accesso Autorizzato
Apertura Porta

Chiusura Porta

Senza andare a "Porta Chiusa" e continuare a darlo in loop all'infinito.

Ancora mille grazie,

Buona Giornata.

Mars

“while” non è usato correttamente. Studiati il Reference. L’istruzione while (condizione) {statement} esegue in continuazione il contenuto di “statement” finché la “condizione” resta vera, poi esce. Tu devi leggere in continuazione lo stato del pulsante e aspettare che ritorni LOW prima di richiudere il chiavistello. Quindi le istruzioni corrette sono:

 else     //==SE LA PORTA È APERTA (pulsante sollevato)
//==TOGLI (buttonState == HIGH); NON SERVE A NIENTE=========================
 {
   //==ASPETTA CHE LA PORTA SI RICHIUDA=================================
   while (digitalRead(buttonPin) == HIGH)    //==FINCHÉ LA PORTA È APERTA (pulsante sollevato)
   { ; }       //==NON FARE NIENTE, ASPETTA============================
   //==USCITA DALLA LOOP while. QUI LA PORTA È CHIUSA (pulsante premuto)=====
   Serial.println("Porta Chiusa");
   Serial.println();
   myServo.write(1);// chiudi chiavistello
 }

Il punto e virgola ha colpito ancora. Ho corretto lo sketch, vedi se funziona.

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9
#define buttonPin 2// Il pin 2 e usato per il microinterruttore
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creiamo l'istanza MFRC522.
Servo myServo; // Definire il nome del servo
int buttonState = 0;

void setup()
{
  Serial.begin(9600); // Inizializzazione comunicazione seriale
  SPI.begin(); // Inizializzazione porta SPI
  mfrc522.PCD_Init(); // Inizializzazione MFRC522
  myServo.attach(3); // Pin dedicato al servo
  myServo.write(1); //Pozisione servo di partenza
  Serial.println("Avvicina la carta al lettore...");
  Serial.println();

  pinMode(buttonPin, INPUT_PULLUP);//==CORREZIONE===============================

  buttonState = false;

}
void loop()
{
  // Cerchiamo nuove carte...
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Seleziona una delle carte
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  //Visualizza l'UID della carta sul monitor seriale
  Serial.print("UID tag :");
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "FC F1 35 BB") // Inserire qui il codice della propria carta
  {
    Serial.println("Accesso Autorizzato");
    Serial.println("Apertura Porta");
    Serial.println();
    delay(500);
    myServo.write(180);
    delay(2000);        //==ATTESA APERTURA PORTA==============================
    buttonState = digitalRead(buttonPin); //Leggo lo stato del pulsante
    if (buttonState == LOW) //Se il pulsante è premuto
                            //==SE LA PORTA È ANCORA CHIUSA DOPO 2 SECONDI====
    {
      Serial.println("Chiusura Porta");
      Serial.println();
      myServo.write(1);     //==CHIUDI CHIAVISTELLO===========================
    }
//==QUESTA PARTE È DA AGGIUNGERE==============================================
//    else (buttonState == HIGH);     //==SE LA PORTA È APERTA (pulsante sollevato)
//==TOGLI (buttonState == HIGH); NON SERVE A NIENTE=========================
    else      //==SE LA PORTA È APERTA (pulsante sollevato)
    {
//      while (buttonState == LOW) //==QUI SCRIVI LE ISTRUZIONI DI ATTESA CHE LA PORTA SI CHIUDA (while..)=
    while (digitalRead(buttonPin) == HIGH)    //==FINCHÉ LA PORTA È APERTA (pulsante sollevato)
    { ; }       //==NON FARE NIENTE, ASPETTA============================
    //==USCITA DALLA LOOP while. QUI LA PORTA È CHIUSA (pulsante premuto)=====
      Serial.println("Porta Chiusa");
      Serial.println();
      myServo.write(1);// chiudi chiavistello
    }
  }   //==FINE CODICE "Accesso Autorizzato"====================================
  else
  {
    Serial.println("Accesso Negato");
    delay(300);
  }   //==FINE CODICE "Accesso Negato"=========================================
}   //==FINE LOOP=============================================================

Ciao,
P.

FUNZIONAAAAA alla perfezioneeeee!!!

Grazie, grazie, grazie; ma tante grazie!

Se posso fare qualcosa per contraccambiare, fammelo sapere.

Ancora grazie,

Saluti
Mars

Siamo qui per aiutare.

I grazie fanno piacere.

Ciao,
P.