Serrure NFC Arduino MEGA et carte SD - besoin d'aide - RÉSOLU !

Bonjour,

J'ai développé, en février/mars, déjà grâce aux différents forums d'ici, un système de serrure électronique NFC pour un atelier et stockage de matériel pour une association (environ 50-60 personnes).
Je décide aujourd'hui après quelques mois de l'améliorer mais je me pose plusieurs questions.

Pour commencer l'existant :
J'ai un système fonctionnel pour 60 accès autorisé, c'est peut être mal "codé" ou mal écris, il y à sans doute plus simple également et si ce code parait comme une ébauche j'en suis désolé j'ai fait avec ce que je connais et ce qui m'était accessible.
Le code :

/*Liste Matériel :
- Arduino Mega ATmega2560
- NFC Shield V2.1 - SEEED Studio
- Diode de redressement libre : 1N4007
- Relai 5VDC
- Résistance 220Ohm
- LED rouge
- LED Verte
- Buzzer piezo-éléctrique                                                                                                                                                                                          
- Fils et gaines thermorétractable
- Électro aimant 12V
- Alimentation 12V 3A*/


#include <NfcAdapter.h>                                   // bibliothèque pour le NFC
#include <PN532/PN532/PN532.h>                            // PN532 pour le NFC

#if 1
    #include <SPI.h>                                      // Gestion de si SPI ou I2C
    #include <PN532/PN532_SPI/PN532_SPI.h>                //""

    PN532_SPI pn532spi(SPI, 10);                          //""
    NfcAdapter nfc = NfcAdapter(pn532spi);                //""
#else
    #include <Wire.h>                                     //""
    #include <PN532/PN532_I2C/PN532_I2C.h>                //""

    PN532_I2C pn532_i2c(Wire);                            //""
    NfcAdapter nfc = NfcAdapter(pn532_i2c);               // fin de : Gestion de si SPI ou I2C
#endif


							                                            // définition des entrées/sorties :
const byte Buzzer_PIN = 2;                                // Buzzer sur pin D2
const byte LedR_PIN = 3;                                  // Led rouge sur pin D3
const byte LedV_PIN = 4;                                  // Led verte sur pin D4
const byte Serrure_PIN = 5;                               // Électro aimant (commande relai) sur pin D5

unsigned long chrono = 0ul;                               // les chronos pour fonctions millis()
unsigned long chronoLED = 0ul;                            // ""
const unsigned long TimeOutEtat = 3000ul;                 // fin de : les chronos pour fonctions millis()

int LedState = LOW;                                       // Etats des Leds

boolean PremiereFoisRepos = false;                        // boolean pour la gestions des message Serial dans le moniteur serie
boolean PremiereFoisOuvert = false;                       //""
boolean PremiereFoisBIPOuvert = false;                    //""
boolean PremiereFoisADD = false;                          //""
boolean PremiereFoisDEL = false;                          // fin de : boolean pour la gestions des message Serial dans le moniteur serie

enum {REPOS, ETATADD, ETATDEL, ETATOUVERT} EtatSysteme;   // Les différents Etats système (machine à état)

String CarteAdminADD = "EB 3F B7 FF";                     // Carte Admin1 pour le rajout d'un accès
String CarteAdminDEL = "5C 83 B5 FF";                     // Carte Admin1 pour le retrait d'un accès
String CarteAdminADD2 = "CA 75 B5 FF";                    // Carte Admin2 pour le rajout d'un accès
String CarteAdminDEL2 = "91 3B B9 FF";                    // Carte Admin2 pour le retrait d'un accès



String acces1 = "0";                                      // Liste des 60 accès possibles
String acces2 = "0";                                      //""
String acces3 = "0";                                      //""
String acces4 = "0";                                      //""
String acces5 = "0";                                      //""
String acces6 = "0";                                      //""
String acces7 = "0";                                      //""
String acces8 = "0";                                      //""
String acces9 = "0";                                      //""
String acces10 = "0";                                     //""
String acces11 = "0";                                     //""
String acces12 = "0";                                     //""
String acces13 = "0";                                     //""
String acces14 = "0";                                     //""
String acces15 = "0";                                     //""
String acces16 = "0";                                     //""
String acces17 = "0";                                     //""
String acces18 = "0";                                     //""
String acces19 = "0";                                     //""
String acces20 = "0";                                     //""
String acces21 = "0";                                     //""
String acces22 = "0";                                     //""
String acces23 = "0";                                     //""
String acces24 = "0";                                     //""
String acces25 = "0";                                     //""
String acces26 = "0";                                     //""
String acces27 = "0";                                     //""
String acces28 = "0";                                     //""
String acces29 = "0";                                     //""
String acces30 = "0";                                     //""
String acces31 = "0";                                     //""
String acces32 = "0";                                     //""
String acces33 = "0";                                     //""
String acces34 = "0";                                     //""
String acces35 = "0";                                     //""
String acces36 = "0";                                     //""
String acces37 = "0";                                     //""
String acces38 = "0";                                     //""
String acces39 = "0";                                     //""
String acces40 = "0";                                     //""
String acces41 = "0";                                     //""
String acces42 = "0";                                     //""
String acces43 = "0";                                     //""
String acces44 = "0";                                     //""
String acces45 = "0";                                     //""
String acces46 = "0";                                     //""
String acces47 = "0";                                     //""
String acces48 = "0";                                     //""
String acces49 = "0";                                     //""
String acces50 = "0";                                     //""
String acces51 = "0";                                     //""
String acces52 = "0";                                     //""
String acces53 = "0";                                     //""
String acces54 = "0";                                     //""
String acces55 = "0";                                     //""
String acces56 = "0";                                     //""
String acces57 = "0";                                     //""
String acces58 = "0";                                     //""
String acces59 = "0";                                     //""
String acces60 = "0";                                     // fin de Liste des 60 accès possibles



void setup() {
  pinMode (Buzzer_PIN, OUTPUT);                                               // Définition du mode des pins (entrée ou sortie)
  pinMode (LedR_PIN, OUTPUT);                                                 //""
  pinMode (LedV_PIN, OUTPUT);                                                 //""
  pinMode (Serrure_PIN, OUTPUT);                                              // fin de : Définition du mode des pins (entrée ou sortie)

  nfc.begin ();                                                               // initialisation du NFC (NFC schield)

  EtatSysteme = REPOS;                                                        // définition de l'état par défaut

  Serial.begin (9600);                                                        // mise en place de la communication à 9600 baud

  tone (Buzzer_PIN, 900, 50);                                                 // "bip bip" de fin de setup
  delay (100);                                                                //""
  tone (Buzzer_PIN, 900, 50);                                                 //""
  delay (50);                                                                 // fin de : "bip bip" de fin de setup

  Serial.println ("Serrure Atelier");     				                            // message dans le moniteur serie
  Serial.println ("");                                                        //""
  Serial.println ("Setup & Serial OK");                                       //""
  Serial.println ("Etat actuel = Initialisation finie");                      //""
  Serial.println ("");                                                        // fin de : message dans le moniteur serie
}

void loop() {
  while (EtatSysteme == ETATOUVERT) {                                         // tant que l'état passe à ouvert faire :
    if (!PremiereFoisOuvert) {                                                // envoi d'un seul message "ouverture"
      Serial.println ("Etat actuel = Ouverture ");                            //""
      PremiereFoisOuvert = true;}                                             //""

    PremiereFoisRepos = false;                                                // fin de : envoi d'un seul message "ouverture"

    Ouverture ();                                                             // faire la boucle ouverture définie plus bas

    if (millis () - chrono >= TimeOutEtat) {                                  // attendre 3 secondes avant de retourner à l'état repos
      TimeOut ();                                                             //""
      chrono = millis ();}                                                    // fin de attendre 3 secondes avant de retourner à l'état repos
  }

  while (EtatSysteme == ETATADD) {                                            // tant que l'état passe à etatadd (rajout d'un accès) faire : 
    if (!PremiereFoisADD) {                                                   // envoi d'un seul message "ajout d'utilisateur"
      Serial.println("Etat actuel = Etat Admin: ajout d'un utilisateur");     //""
      PremiereFoisADD = true;}                                                //""

    PremiereFoisRepos = false;                                                // fin de envoi d'un seul message "ajout d'utilisateur"

    delay (2000);                                                             // delai pour laisser le temps à l'utilisateur de retirer sa carte Admin de la zone de scan NFC

    BlinkLED();                                                               // faire clignoter les Leds

    if (nfc.tagPresent ()) {                                                  // si un tag NFC est détecté faire : 
      NfcTag tag = nfc.read ();						                                    // NfcTaf, l'objet tag prend la valeur de ce qui est lu dans le NFC tag
      chrono = millis ();                                                     // mis en place du chrono fonction millis()

      if (acces1 == "0") {						                                        // si la variable acces1 vaut 0
        acces1 = tag.getUidString ();					                                // acces1 vaudra l'UID lu dans le tag NFC
        AjoutSuite();}							                                          // faire la boucle pour gérer ce qui est fait ensuite, boucle AjoutSuite() définie plus bas
      else if (acces2 == "0") {						                                    // on refait la même chose pour les 60 variables acces
        acces2 = tag.getUidString ();					                                // ...
        AjoutSuite();}
      else if (acces3 == "0") {
        acces3 = tag.getUidString ();
        AjoutSuite();}
      else if (acces4 == "0") {
        acces4 = tag.getUidString ();
        AjoutSuite();}
      else if (acces5 == "0") {
        acces5 = tag.getUidString ();
        AjoutSuite();}
      else if (acces6 == "0") {
        acces6 = tag.getUidString ();
        AjoutSuite();}
      else if (acces7 == "0") {
        acces7 = tag.getUidString ();
        AjoutSuite();}
      else if (acces8 == "0") {
        acces8 = tag.getUidString ();
        AjoutSuite();}
      else if (acces9 == "0") {
        acces9 = tag.getUidString ();
        AjoutSuite(); }
      else if (acces10 == "0"){
        acces10 = tag.getUidString();
        AjoutSuite();}
      else if (acces11 == "0"){
        acces11 = tag.getUidString();
        AjoutSuite();}
      else if (acces12 == "0"){
        acces12 = tag.getUidString();
        AjoutSuite();}
      else if (acces13 == "0"){
        acces13 = tag.getUidString();
        AjoutSuite();}
      else if (acces14 == "0"){
        acces14 = tag.getUidString();
        AjoutSuite();}
      else if (acces15 == "0"){
        acces15 = tag.getUidString();
        AjoutSuite();}
      else if (acces16 == "0"){
        acces16 = tag.getUidString();
        AjoutSuite();}
      else if (acces17 == "0"){
        acces17 = tag.getUidString();
        AjoutSuite();}
      else if (acces18 == "0"){
        acces18 = tag.getUidString();
        AjoutSuite();}
      else if (acces19 == "0"){
        acces19 = tag.getUidString();
        AjoutSuite();}
      else if (acces20 == "0"){
        acces20 = tag.getUidString();
        AjoutSuite();}
      else if (acces21 == "0"){
        acces21 = tag.getUidString();
        AjoutSuite();}
      else if (acces22 == "0"){
        acces22 = tag.getUidString();
        AjoutSuite();}
      else if (acces23 == "0"){
        acces23 = tag.getUidString();
        AjoutSuite();}
      else if (acces24 == "0"){
        acces24 = tag.getUidString();
        AjoutSuite();}
      else if (acces25 == "0"){
        acces25 = tag.getUidString();
        AjoutSuite();}
      else if (acces26 == "0"){
        acces26 = tag.getUidString();
        AjoutSuite();}
      else if (acces27 == "0"){
        acces27 = tag.getUidString();
        AjoutSuite();}
      else if (acces28 == "0"){
        acces28 = tag.getUidString();
        AjoutSuite();}
      else if (acces29 == "0"){
        acces29 = tag.getUidString();
        AjoutSuite();}
      else if (acces30 == "0"){
        acces30 = tag.getUidString();
        AjoutSuite();}
      else if (acces31 == "0"){
        acces31 = tag.getUidString();
        AjoutSuite();}
      else if (acces32 == "0"){
        acces32 = tag.getUidString();
        AjoutSuite();}
      else if (acces33 == "0"){
        acces33 = tag.getUidString();
        AjoutSuite();}
      else if (acces34 == "0"){
        acces34 = tag.getUidString();
        AjoutSuite();}
      else if (acces35 == "0"){
        acces35 = tag.getUidString();
        AjoutSuite();}
      else if (acces36 == "0"){
        acces36 = tag.getUidString();
        AjoutSuite();}
      else if (acces37 == "0"){
        acces37 = tag.getUidString();
        AjoutSuite();}
      else if (acces38 == "0"){
        acces38 = tag.getUidString();
        AjoutSuite();}
      else if (acces39 == "0"){
        acces39 = tag.getUidString();
        AjoutSuite();}
      else if (acces40 == "0"){
        acces40 = tag.getUidString();
        AjoutSuite();}
      else if (acces41 == "0"){
        acces41 = tag.getUidString();
        AjoutSuite();}
      else if (acces42 == "0"){
        acces42 = tag.getUidString();
        AjoutSuite();}
      else if (acces43 == "0"){
        acces43 = tag.getUidString();
        AjoutSuite();}
      else if (acces44 == "0"){
        acces44 = tag.getUidString();
        AjoutSuite();}
      else if (acces45 == "0"){
        acces45 = tag.getUidString();
        AjoutSuite();}
      else if (acces46 == "0"){
        acces46 = tag.getUidString();
        AjoutSuite();}
      else if (acces47 == "0"){
        acces47 = tag.getUidString();
        AjoutSuite();}
      else if (acces48 == "0"){
        acces48 = tag.getUidString();
        AjoutSuite();}
      else if (acces49 == "0"){
        acces49 = tag.getUidString();
        AjoutSuite();}
      else if (acces50 == "0"){
        acces50 = tag.getUidString();
        AjoutSuite();}
      else if (acces51 == "0"){
        acces51 = tag.getUidString();
        AjoutSuite();}
      else if (acces52 == "0"){
        acces52 = tag.getUidString();
        AjoutSuite();}
      else if (acces53 == "0"){
        acces53 = tag.getUidString();
        AjoutSuite();}
      else if (acces54 == "0"){
        acces54 = tag.getUidString();
        AjoutSuite();}
      else if (acces55 == "0"){
        acces55 = tag.getUidString();
        AjoutSuite();}
      else if (acces56 == "0"){
        acces56 = tag.getUidString();
        AjoutSuite();}
      else if (acces57 == "0"){
        acces57 = tag.getUidString();
        AjoutSuite();}
      else if (acces58 == "0"){
        acces58 = tag.getUidString();
        AjoutSuite();}
      else if (acces59 == "0"){
        acces59 = tag.getUidString();
        AjoutSuite();}
      else if (acces60 == "0"){
        acces60 = tag.getUidString();
        AjoutSuite();}							                                          // … fin des 60 accès
      else MAX();                                                             // sinon faire la boucle MAX() définie plus bas
    } 

    if (millis () - chrono >= TimeOutEtat) {                                  // chrono millis, attendre 3 secondes avant de retourner à l'état repos
      TimeOut ();                                                             // "" 
      chrono = millis ();}                                                    // fin de : attendre 3 secondes avant de retourner à l'état repos
  }

  while (EtatSysteme == ETATDEL) {                                            // tant que l'état du système passe à etatdel (suppression d'un accès)
    if (!PremiereFoisDEL) {                                                   // envoie d'un message dans le moniteur série pour le signaler à l'utilisateur
      Serial.println("Etat actuel = Etat Admin: retrait d'un utilisateur");   //""
      PremiereFoisDEL = true;}                                                //""

    PremiereFoisRepos = false;                                                // fin de : envoie d'un message dans le moniteur série pour le signaler à l'utilisateur

    delay(2000);                                                              // delai pour attendre que l'admin retire sa carte du lecteur NFC

    BlinkLED();                                                               // faire clignoter les Leds

    if (nfc.tagPresent ()) {                                                  // si un tag est scanné :
      NfcTag tag = nfc.read ();                                               // l'objet "tag" prend la valeur de ce qui est lu sur le tag NFC
      chrono = millis ();                                                     // mis en place du chrono pour la fonctions millis()
      if (tag.getUidString () == acces1) {				                            // si le tag lu vaut acces 1
        acces1 = "0";							                                            // acces1 vaudra désormais 0
        RetraitSuite();}						                                          // faire la boucle de retrait définie plus bas
      else if (tag.getUidString () == acces2) {                               // …
        acces2 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces3) {
        acces3 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces4) {
        acces4 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces5) {
        acces5 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces6) {
        acces6 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces7) {
        acces7 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces8) {
        acces8 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces9) {
        acces9 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces10) {
        acces10 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces11) {
        acces11 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces12) {
        acces12 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces13) {
        acces13 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces14) {
        acces14 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces15) {
        acces15 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces16) {
        acces16 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces17) {
        acces17 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces18) {
        acces18 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces19) {
        acces19 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces20) {
        acces20 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces21) {
        acces21 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces22) {
        acces22 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces23) {
        acces23 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces24) {
        acces24 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces25) {
        acces25 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces26) {
        acces26 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces27) {
        acces27 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces28) {
        acces28 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces29) {
        acces29 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces30) {
        acces30 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces31) {
        acces31 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces32) {
        acces32 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces33) {
        acces33 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces34) {
        acces34 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces35) {
        acces35 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces36) {
        acces36 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces37) {
        acces37 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces38) {
        acces38 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces39) {
        acces39 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces40) {
        acces40 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces41) {
        acces41 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces42) {
        acces42 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces43) {
        acces43 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces44) {
        acces44 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces45) {
        acces45 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces46) {
        acces46 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces47) {
        acces47 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces48) {
        acces48 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces49) {
        acces49 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces50) {
        acces50 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces51) {
        acces51 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces52) {
        acces52 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces53) {
        acces53 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces54) {
        acces54 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces55) {
        acces55 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces56) {
        acces56 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces57) {
        acces57 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces58) {
        acces58 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces59) {
        acces59 = "0";
        RetraitSuite();}
      else if (tag.getUidString () == acces60) {
        acces60 = "0";
        RetraitSuite();}						                                          // … fin pour les 60 variables acces
      else MIN();}                                                            // sinon faire minimum défini plus bas

    if (millis () - chrono >= TimeOutEtat) {                                  // attendre 3 secondes avant de revenir à l'État repos
      TimeOut ();                                                             //""
      chrono = millis ();}                                                    // fin de : attendre 3 secondes avant de revenir à l'État repos
  }

  while (EtatSysteme == REPOS) {                                              // tant que l'état est repos faire : 
    if (nfc.tagPresent ()) {                                                  // si tag NFC scanné
      NfcTag tag = nfc.read ();                                               // l'objet tag prend la valeur de ce qui est lu du tag NFC
      Serial.println ("BADGE/CARTE scanné et récupéré");                      // écriture dans le moniteur série (maintenance) des informations du tag NFC
      Serial.println ("son UID est : ");                                      //""
      Serial.print (tag.getUidString ());                                     //""
      Serial.println ("");                                                    //""
      Serial.println ("");                                                    // fin de : écriture dans le moniteur série (maintenance) des informations du tag NFC

      if (tag.getUidString () == CarteAdminADD || tag.getUidString () == CarteAdminADD2) {          // si l'UID du tag NFC correspond à la carte d'admin 1 ou 2 d'ajout alors : 
        tone (Buzzer_PIN, 2000, 50);                                                                // faire son
        chrono = millis ();                                                                         // mise en place de millis()
        EtatSysteme = ETATADD;}                                                                     // passage du système à l'état de rajout d'accès
      else if (tag.getUidString () == CarteAdminDEL || tag.getUidString () == CarteAdminDEL2) {     // sinon si c'est un tag d'une carte de suppresion d'accès
        tone (Buzzer_PIN, 2000, 50);                                                                // faire son
        chrono = millis ();                                                                         // mise en place de millis()
        EtatSysteme = ETATDEL;}                                                                     // passage du système à l'état de suppresion d'acces
      else if (tag.getUidString()==acces1||tag.getUidString()==acces2||tag.getUidString()==acces3||tag.getUidString()==acces4||tag.getUidString()==acces5||tag.getUidString()==acces6||tag.getUidString()==acces7||tag.getUidString()==acces8||tag.getUidString()==acces9||tag.getUidString()==acces10||tag.getUidString()==acces11||tag.getUidString()==acces12||tag.getUidString()==acces13||tag.getUidString()==acces14||tag.getUidString()==acces15) {
        chrono = millis ();
        EtatSysteme = ETATOUVERT;}
      else if (tag.getUidString()==acces16||tag.getUidString()==acces17||tag.getUidString()==acces18||tag.getUidString()==acces19||tag.getUidString()==acces20||tag.getUidString()==acces21||tag.getUidString()==acces22||tag.getUidString()==acces23||tag.getUidString()==acces24||tag.getUidString()==acces25||tag.getUidString()==acces26||tag.getUidString()==acces27||tag.getUidString()==acces28||tag.getUidString()==acces29||tag.getUidString()==acces30) {
        chrono = millis ();
        EtatSysteme = ETATOUVERT;}
      else if (tag.getUidString()==acces31||tag.getUidString()==acces32||tag.getUidString()==acces33||tag.getUidString()==acces34||tag.getUidString()==acces35||tag.getUidString()==acces36||tag.getUidString()==acces37||tag.getUidString()==acces38||tag.getUidString()==acces39||tag.getUidString()==acces40||tag.getUidString()==acces41||tag.getUidString()==acces42||tag.getUidString()==acces43||tag.getUidString()==acces44||tag.getUidString()==acces45) {
        chrono = millis ();
        EtatSysteme = ETATOUVERT;}
      else if (tag.getUidString()==acces46||tag.getUidString()==acces47||tag.getUidString()==acces48||tag.getUidString()==acces49||tag.getUidString()==acces50||tag.getUidString()==acces51||tag.getUidString()==acces52||tag.getUidString()==acces53||tag.getUidString()==acces54||tag.getUidString()==acces55||tag.getUidString()==acces56||tag.getUidString()==acces57||tag.getUidString()==acces58||tag.getUidString()==acces59||tag.getUidString()==acces60) {
        chrono = millis ();
        EtatSysteme = ETATOUVERT;}
      else{                                                                   // sinon, si le tag vaut un des 60 accès autorisé passer le système à l'état d'ouverture et mise en place de millis()
        PremiereFoisRepos = false;                                            // et enfin sinon mettre première fois (message dans le moniteur serie) à false
        Refus();}                                                             // faire refus d'accès (boucle définie plus bas)
    }
    else Repos ();                                                            // si aucun tag n'est lu faire repos()
  }
}



void TimeOut() {
  if (EtatSysteme != REPOS) {                                                 // si état système pas repos alors : boucle timeout (atteinte lorsque le delai est depassé pour revenir à l'état de repos)
    Serial.println ("Time Out !");                                            // écriture dans le moniteur série
    tone(Buzzer_PIN, 1700, 200);                                              // faire son
    EtatSysteme = REPOS;}                                                     // passer l'état à repos
}

void Repos() {
  if (!PremiereFoisRepos){                                                    // si on à pas "première fois repos" : 
    Serial.println ("Etat actuel = REPOS");                                   // écriture dans le moniteur série (aide pour la maintenance)
    Serial.println ("Attente : ");                                            // écriture
    Serial.println ("");                                                      // écriture
    PremiereFoisRepos = true;}                                                // passage à l'état haut de "première fois" (évite la répitiion du message en boucle)

  PremiereFoisOuvert = false;                                                 // mettre les autres boolean "première fois" à false
  PremiereFoisBIPOuvert = false;                                              //""
  PremiereFoisADD = false;                                                    //""
  PremiereFoisDEL = false;                                                    // fin de : mettre les autres boolean "première fois" à false

  digitalWrite (Buzzer_PIN, LOW);                                             // mettre les sortie à 0 (repos)
  digitalWrite (LedR_PIN, LOW);                                               //""
  digitalWrite (LedV_PIN, LOW);                                               //""
  digitalWrite (Serrure_PIN, LOW);                                            // fin de : mettre les sortie à 0 (repos)
}

void Ouverture() {
  digitalWrite (Serrure_PIN, HIGH);                                           // mettre à l'état haut la broche de commande du relai 12V de la serrure (éléctro aimant)
  digitalWrite (LedV_PIN, HIGH);                                              // allumer la Led verte

  if (!PremiereFoisBIPOuvert) {                                               // si on à pas "première fois bip ouvert"
    tone (Buzzer_PIN, 1100, 100);                                             // faire du son pour signaler l'ouverture (première fois en boolean évite la répétition des bip)
    delay (100);                                                              //""
    tone (Buzzer_PIN, 1300, 50);                                              //""
    delay (50);                                                               //""
    PremiereFoisBIPOuvert = true;}                                            // fin de : faire du son pour signaler l'ouverture
}

void Refus() {
  Serial.println ("Refus d'acces: Utilisateur non reconnu");                  // signaler dans le moniteur série le refus du passage

  digitalWrite (LedR_PIN, HIGH);                                              // allumer Led rouge
  tone (Buzzer_PIN, 900, 100);                                                // faire son de refus
  delay (100);                                                                //""
  tone (Buzzer_PIN, 500, 50);                                                 //""
  delay (1000);                                                               // fin de : faire son de refus
}

void BlinkLED() {
  if (millis() - chronoLED >= 250) {                                          // faire clignotter les Leds verte et rouge (sans delay() mais avec miullis())
    chronoLED = millis();                                                     //""

    if (LedState == LOW) LedState = HIGH;                                     //""
    else LedState = LOW;}                                                     //""

  digitalWrite (LedR_PIN, LedState);                                          //""
  digitalWrite (LedV_PIN, LedState);                                          // fin de : faire clignotter les Leds verte et rouge (sans delay() mais avec miullis())
}

void AjoutSuite() {
  Serial.println ("accès ajouté pour ce badge");                              // (boucle pour éviter la répétition) 
  delay(500);                                                                 // signal sonnore + moniteur série
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay(2000);                                                                // fin de : signal sonnore + moniteur série
}

void RetraitSuite() {
  Serial.println ("retrait de l'accès de ce badge");                          // (boucle pour éviter la répétition)
  delay(500);                                                                 // signal sonnore + moniteur série
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay(2000);                                                                // fin de : signal sonnore + moniteur série
}

void MAX() {
  Serial.println ("accès maximal atteint");                                   // plus de place pour l'ajout d'un accès (toutes les variables sont différentes de 0) + moniteur série
  tone (Buzzer_PIN, 600, 1000);                                               //""
  delay(1000);                                                                // fin de : plus de place pour l'ajout d'un accès
}

void MIN() {
  Serial.println ("badge n'ayant pas l'accès autorisé");                      // le badge n'avais pas de base l'accès autorisé + moniteur série
  tone (Buzzer_PIN, 400, 1000);                                               //""
  delay(1000);                                                                // fin de : le badge n'avais pas de base l'accès autorisé + moniteur série
}

Voici le code complet, soucis lorsque l'Arduino est mis hors tension, tout se reset et c'est normal les variables "accesX" reprennent leurs valeurs 0
J'ai ceci comme cartes et extensions :
-Arduino Mega ATmega2560
-Shield : NFC Shield V2.1 de chez SEEED Studio : Lien Gotronic
-Shield : SD Card Shield V4 de chez SEEED Studio : Lien Gotronic
-Carte SD 16go en FAT32

J'aimerais changer ce code pour que au lieu que les variable "accesX" prennent 0, prennent la valeur dans un tableau excel (ou autre solution) dans la carte SD. Ainsi lors de la remise en tension de l'arduino et du système dans sa globalité on ne perde pas les accès autorisé
dans ces lignes :

String acces1 = "0";                                      // Liste des 60 accès possibles
String acces2 = "0";                                      //""
String acces3 = "0";                                      //""
String acces4 = "0";                                      //""
String acces5 = "0";                                      //""
String acces6 = "0";                                      //""
String acces7 = "0";                                      //""
String acces8 = "0";                                      //""
String acces9 = "0";                                      //""
String acces10 = "0";                                     //""
String acces11 = "0";                                     //""
String acces12 = "0";                                     //""
String acces13 = "0";                                     //""
String acces14 = "0";                                     //""
String acces15 = "0";                                     //""
String acces16 = "0";                                     //""
String acces17 = "0";                                     //""
String acces18 = "0";                                     //""
String acces19 = "0";                                     //""
String acces20 = "0";                                     //""
String acces21 = "0";                                     //""
String acces22 = "0";                                     //""
String acces23 = "0";                                     //""
String acces24 = "0";                                     //""
String acces25 = "0";                                     //""
String acces26 = "0";                                     //""
String acces27 = "0";                                     //""
String acces28 = "0";                                     //""
String acces29 = "0";                                     //""
String acces30 = "0";                                     //""
String acces31 = "0";                                     //""
String acces32 = "0";                                     //""
String acces33 = "0";                                     //""
String acces34 = "0";                                     //""
String acces35 = "0";                                     //""
String acces36 = "0";                                     //""
String acces37 = "0";                                     //""
String acces38 = "0";                                     //""
String acces39 = "0";                                     //""
String acces40 = "0";                                     //""
String acces41 = "0";                                     //""
String acces42 = "0";                                     //""
String acces43 = "0";                                     //""
String acces44 = "0";                                     //""
String acces45 = "0";                                     //""
String acces46 = "0";                                     //""
String acces47 = "0";                                     //""
String acces48 = "0";                                     //""
String acces49 = "0";                                     //""
String acces50 = "0";                                     //""
String acces51 = "0";                                     //""
String acces52 = "0";                                     //""
String acces53 = "0";                                     //""
String acces54 = "0";                                     //""
String acces55 = "0";                                     //""
String acces56 = "0";                                     //""
String acces57 = "0";                                     //""
String acces58 = "0";                                     //""
String acces59 = "0";                                     //""
String acces60 = "0";                                     // fin de Liste des 60 accès possibles

Ceci à remplacer par un truc dans ce style là :

Colonne 1 Colonne 2 Colonne 3
acces1 Gauthier Benoit EB FF C6 FF A4 A6 FF
acces2 Julien Dupond EB FF 16 FF BC AD FF
acces3 Pierre Dupont EB F9 16 FF C4 D4 FF
acces4 Charles Henry FC FC 27 F4 D3 D4 FF
acces5 Louis du Bourg Palette A6 B2 CC FF 17 FF FF

ainsi on aurait plus de rajout ou de suppression d'accès autorisé autrement que via ce tableau (ou une autre solution si il y à)
J'ai essayé 'être le plus clair possible j'ai réfléchis aussi au principe de maitre et esclave pour les deux shield car les deux sont avec le port SPI (j'arrive déjà à gérer soit le nfc soit la carte SD).
Merci d'avance et je suis ouvert aux différentes critiques sur mon code
Bonne année au passage à vous et merci d'avance

EDIT : Sujet résolu au post 226, avec récapitulatif du projet du matériel et du code

Bonjour louisjaffeux

Tu devrais, dans un premier temps, t'intéresser aux tableaux, répéter 60 fois des lignes de code, c'est rébarbatif.
Personnellement, à partir de 3, je mets déjà en tableau :wink:
J'aimerai te faire une démonstration sur ton programme, mais je ne trouve pas ta bibliothèque:
#include <PN532/PN532/PN532.h> // PN532 pour le NFC

As tu un lien?

A+
Cordialement
jpbbricole

1 Like

Voici le liens vers la fiche technique du wiki de chez seeedstudio : lien

on y retrouve cela :

Software Libraries Installation

  • Step 1. Download Seeed Arduino NFC Library.
  • Step 2. Refer to How to install library to install Seeed Arduino NFC library for Arduino.
  • Step 3. Open “WriteTag” code via the path: File --> Examples --> WriteTag.
  • Step 4. Modify the code as below to enable SPI communication.

et ceci en exemple :

#if 0
    #include <SPI.h>
    #include <PN532/PN532_SPI/PN532_SPI.h>


    PN532_SPI pn532spi(SPI, 10);
    NfcAdapter nfc = NfcAdapter(pn532spi);
#else

    #include <Wire.h>
    #include <PN532/PN532_I2C/PN532_I2C.h>


    PN532_I2C pn532_i2c(Wire);
    NfcAdapter nfc = NfcAdapter(pn532_i2c);
#endif

void setup() {
    SERIAL.begin(9600);
    SERIAL.println("NDEF Writer");
    nfc.begin();
}

merci beaucoup, c'est vrais qu'un tableau serais plus simple j'ai fais comme dit avec mes connaissances en restant sur ce que je maitrise mais je vais m'y pencher

quels types de badges utilisez vous ? Sont ils formatés en NDEF ?

au lieu d'utiliser une carte SD, vous pourriez éventuellement utilise l'EEPROM de votre MEGA comme stockage durable des informations. Le processus d'activation ou désactivation des badges et infos associées (nom, type de droits, ...) se ferait via une petite interface simple sur le port série par exemple, activé avec une carte administrateur.

je me disais que l'utilisations d'une carte SD avec un tableau permettais de voir les badges et les noms de chaque badge et faciliter le rajout ou le retrait d'un acces
je m'était penché sur l'EEPROM et avec un collègue on s'était dit que la carte SD était peut être mieux... à voir et oui les badges sont en NDEF.
Le code actuel est peut être mal écris mais fonctionnel

j'aimerais vraiment garder la carte SD... (si c pas possible oublions)

L'intérêt c'est que vous n'êtes pas limité par la place et que c'est plus simple effectivement pour lire la config mais c'est aussi un point de faiblesse ➜ facile de hacker et rajouter des badges et parfois aussi le SPI entre 2 appareils ne fonctionne pas bien il faudra vérifier.


Au lieu de conserver des Strings pour les IDs vous pourriez conserver un tableau d'octets, c'est plus compact et mettre tout cela dans une structure avec le nom et les droits de ce badge

un truc comme cela par exemple pour démarrer (avec un tableau pour vous montrer comment ça peut fonctionner) ?

(tapé ici donc pas 100% sûr que ça fonctionne)

#include <NfcAdapter.h>
#include <PN532/PN532/PN532.h>

#include <SPI.h>
#include <PN532/PN532_SPI/PN532_SPI.h>
#include <PN532/PN532/PN532.h>
#include <NfcAdapter.h>

// définition des entrées/sorties
const byte Buzzer_PIN   = 2; // Buzzer sur pin D2
const byte LedR_PIN     = 3; // Led rouge sur pin D3
const byte LedV_PIN     = 4; // Led verte sur pin D4
const byte Serrure_PIN  = 5; // Électro aimant (commande relai) sur pin D5

// le lecteur
PN532_SPI pn532spi(SPI, 10);
NfcAdapter nfc = NfcAdapter(pn532spi);


enum  Droits : byte {AUCUN = 1, UTILISATEUR = 2, ADMIN_ADD = 4, ADMIN_DEL = 8};

const byte TAILLE_MAX_UID = 4;
const byte TAILLE_MAX_USER = 15 + 1; // +1 pour la caractère de fin de chaîne
struct Badge {
  uint8_t uid[TAILLE_MAX_UID];
  uint8_t taille;
  uint8_t droits;
  char utilisateur[TAILLE_MAX_USER]; // attention au caractère nul de fin de chaîne
};

const uint8_t NOMBRE_MAX_BADGES = 100;
Badge badgesAdmin[] = {
  {{0xEB, 0x3F, 0xB7, 0xFF}, 4, ADMIN_ADD, "Admin#1"},              // Carte Admin avec droit pour le rajout d'un accès
  {{0xCA, 0x75, 0xB5, 0xFF}, 4, ADMIN_ADD, "Admin#2"},              // Carte Admin avec droit pour le rajout d'un accès
  {{0x5C, 0x83, 0xB5, 0xFF}, 4, ADMIN_DEL, "Admin#3"},              // Carte Admin avec droit pour le retrait d'un accès
  {{0x91, 0x3B, 0xB9, 0xFF}, 4, ADMIN_ADD + ADMIN_DEL, "Admin#4"},  // Carte Admin avec droit pour l'ajout et le retrait d'un accès
};

Badge badges[NOMBRE_MAX_BADGES];

void imprimerBadge(Badge& badge) {
  Serial.print(badge.utilisateur);

  Serial.print(F("\t"));

  Serial.print(F("0x"));
  for (uint8_t i = 0; i < badge.taille; i++) {
    if (badge.uid[i] < 0x10) Serial.write('0');
    Serial.print(badge.uid[i], HEX);
  }

  Serial.print(F("\t"));
  if (badge.droits & AUCUN)       Serial.print(F("AUCUN "));
  if (badge.droits & UTILISATEUR) Serial.print(F("UTILISATEUR "));
  if (badge.droits & ADMIN_ADD)   Serial.print(F("ADMIN ADD "));
  if (badge.droits & ADMIN_DEL)   Serial.print(F("ADMIN DEL "));

  Serial.println();
}



void setup() {
  pinMode (Buzzer_PIN, OUTPUT);
  pinMode (LedR_PIN, OUTPUT);
  pinMode (LedV_PIN, OUTPUT);
  pinMode (Serrure_PIN, OUTPUT);
  Serial.begin(115200); Serial.println();
  nfc.begin();

  tone (Buzzer_PIN, 900, 50); delay (100);
  tone (Buzzer_PIN, 900, 50); delay (50);

  Serial.println (F("Serrure Atelier\n"));
  Serial.println (F("Setup & Serial OK"));
  Serial.println (F("Etat actuel = Initialisation finie\n"));

  for (auto& b : badgesAdmin) imprimerBadge(b);
}

void loop() {
  if (nfc.tagPresent()) {
    NfcTag tag = nfc.read();
    if (tag.getUidLength() <= TAILLE_MAX_UID) {
      Badge badgeActif;
      badgeActif.taille = tag.getUidLength();
      tag.getUid(badgeActif.uid, badgeActif.taille);
      badgeActif.droits = AUCUN;
      strlcpy(badgeActif.utilisateur, "Inconnu", TAILLE_MAX_USER);
      imprimerBadge(badgeActif);
    }
  }
}

si vous présentez un badge, il devrait le détecter et vous imprimer des infos sur la console série

à partir de ceci j'arriverais à refaire le code d'avant (bien mieux écrit je le conçoit), comment rajouter que le tableau soit remplis par la carte SD

je vais reprendre ce code et l'adapter pour mon projet, ce seras plus propre merci.
J'aimerais quand même essayer avec la carte SD pour remplir le tableau

il faut définir un format pour une ligne du fichier qui correspond à un badge et écrire un petit analyseur de ce fichier pour fabriquer le tableau des badges

il y a un exemple pour lire un fichier CSV

qu'est ce qu'un fichier CSV ? par exemple lire un tableau excel c'est possible, exemple si mon louis du bourg palette quitte l'équipe je pourrais ainsi très facilement supprimer son accès simplement et simple à faire sur mon mode opératoire.

merci pour ce lien je vais y jeter un oeil

Bonjour louisjaffeux

Voici une version de ton programme utilisant un tableau pour les 60 accès. Je n'ai pas pu essayer mais ça compile.
En gros, les 60 accesxx sont regroupés dans un tableau acces[] de 60 cases, numérotées de 0 à 59.
Cette façon de faire te permet de traiter tes acces dans des boucles comme:

  for (int a = 0; a < accesNombre; a ++) { // Toutes les entrées du tableau acces à "0"
    acces[a] = "0";
  }

Pour remplacer 60 lignes comme:
String acces1 = "0"; // Liste des 60 accès possibles

Ce système en tableau te facilitera la tâche pour écrire et lire tes données sur carte SD.
J'ai laissé, en remarque, les lignes devenues inutiles.

Le programme:

/*Liste Matériel :
- Arduino Mega ATmega2560
- NFC Shield V2.1 - SEEED Studio
- Diode de redressement libre : 1N4007
- Relai 5VDC
- Résistance 220Ohm
- LED rouge
- LED Verte
- Buzzer piezo-éléctrique                                                                                                                                                                                          
- Fils et gaines thermorétractable
- Électro aimant 12V
- Alimentation 12V 3A*/


#include <NfcAdapter.h>                                   // bibliothèque pour le NFC
#include <PN532/PN532/PN532.h>                            // PN532 pour le NFC

#if 1
    #include <SPI.h>                                      // Gestion de si SPI ou I2C
    #include <PN532/PN532_SPI/PN532_SPI.h>                //""

    PN532_SPI pn532spi(SPI, 10);                          //""
    NfcAdapter nfc = NfcAdapter(pn532spi);                //""
#else
    #include <Wire.h>                                     //""
    #include <PN532/PN532_I2C/PN532_I2C.h>                //""

    PN532_I2C pn532_i2c(Wire);                            //""
    NfcAdapter nfc = NfcAdapter(pn532_i2c);               // fin de : Gestion de si SPI ou I2C
#endif


							                                            // définition des entrées/sorties :
const byte Buzzer_PIN = 2;                                // Buzzer sur pin D2
const byte LedR_PIN = 3;                                  // Led rouge sur pin D3
const byte LedV_PIN = 4;                                  // Led verte sur pin D4
const byte Serrure_PIN = 5;                               // Électro aimant (commande relai) sur pin D5

unsigned long chrono = 0ul;                               // les chronos pour fonctions millis()
unsigned long chronoLED = 0ul;                            // ""
const unsigned long TimeOutEtat = 3000ul;                 // fin de : les chronos pour fonctions millis()

int LedState = LOW;                                       // Etats des Leds

boolean PremiereFoisRepos = false;                        // boolean pour la gestions des message Serial dans le moniteur serie
boolean PremiereFoisOuvert = false;                       //""
boolean PremiereFoisBIPOuvert = false;                    //""
boolean PremiereFoisADD = false;                          //""
boolean PremiereFoisDEL = false;                          // fin de : boolean pour la gestions des message Serial dans le moniteur serie

enum {REPOS, ETATADD, ETATDEL, ETATOUVERT} EtatSysteme;   // Les différents Etats système (machine à état)

String CarteAdminADD = "EB 3F B7 FF";                     // Carte Admin1 pour le rajout d'un accès
String CarteAdminDEL = "5C 83 B5 FF";                     // Carte Admin1 pour le retrait d'un accès
String CarteAdminADD2 = "CA 75 B5 FF";                    // Carte Admin2 pour le rajout d'un accès
String CarteAdminDEL2 = "91 3B B9 FF";                    // Carte Admin2 pour le retrait d'un accès


const int accesNombre = 60; // Nombre d'accès (0 - 59)
String acces[accesNombre];
// String acces1 = "0";                                      // Liste des 60 accès possibles
// String acces2 = "0";                                      //""
// String acces3 = "0";                                      //""
// String acces4 = "0";                                      //""
// String acces5 = "0";                                      //""
// String acces6 = "0";                                      //""
// String acces7 = "0";                                      //""
// String acces8 = "0";                                      //""
// String acces9 = "0";                                      //""
// String acces10 = "0";                                     //""
// String acces11 = "0";                                     //""
// String acces12 = "0";                                     //""
// String acces13 = "0";                                     //""
// String acces14 = "0";                                     //""
// String acces15 = "0";                                     //""
// String acces16 = "0";                                     //""
// String acces17 = "0";                                     //""
// String acces18 = "0";                                     //""
// String acces19 = "0";                                     //""
// String acces20 = "0";                                     //""
// String acces21 = "0";                                     //""
// String acces22 = "0";                                     //""
// String acces23 = "0";                                     //""
// String acces24 = "0";                                     //""
// String acces25 = "0";                                     //""
// String acces26 = "0";                                     //""
// String acces27 = "0";                                     //""
// String acces28 = "0";                                     //""
// String acces29 = "0";                                     //""
// String acces30 = "0";                                     //""
// String acces31 = "0";                                     //""
// String acces32 = "0";                                     //""
// String acces33 = "0";                                     //""
// String acces34 = "0";                                     //""
// String acces35 = "0";                                     //""
// String acces36 = "0";                                     //""
// String acces37 = "0";                                     //""
// String acces38 = "0";                                     //""
// String acces39 = "0";                                     //""
// String acces40 = "0";                                     //""
// String acces41 = "0";                                     //""
// String acces42 = "0";                                     //""
// String acces43 = "0";                                     //""
// String acces44 = "0";                                     //""
// String acces45 = "0";                                     //""
// String acces46 = "0";                                     //""
// String acces47 = "0";                                     //""
// String acces48 = "0";                                     //""
// String acces49 = "0";                                     //""
// String acces50 = "0";                                     //""
// String acces51 = "0";                                     //""
// String acces52 = "0";                                     //""
// String acces53 = "0";                                     //""
// String acces54 = "0";                                     //""
// String acces55 = "0";                                     //""
// String acces56 = "0";                                     //""
// String acces57 = "0";                                     //""
// String acces58 = "0";                                     //""
// String acces59 = "0";                                     //""
// String acces60 = "0";                                     // fin de Liste des 60 accès possibles



void setup() {
  pinMode (Buzzer_PIN, OUTPUT);                                               // Définition du mode des pins (entrée ou sortie)
  pinMode (LedR_PIN, OUTPUT);                                                 //""
  pinMode (LedV_PIN, OUTPUT);                                                 //""
  pinMode (Serrure_PIN, OUTPUT);                                              // fin de : Définition du mode des pins (entrée ou sortie)

  nfc.begin ();                                                               // initialisation du NFC (NFC schield)

  EtatSysteme = REPOS;                                                        // définition de l'état par défaut

  Serial.begin (9600);                                                        // mise en place de la communication à 9600 baud

  for (int a = 0; a < accesNombre; a ++) { // Toutes les entrées du tableau acces à "0"
    acces[a] = "0";
  }

  tone (Buzzer_PIN, 900, 50);                                                 // "bip bip" de fin de setup
  delay (100);                                                                //""
  tone (Buzzer_PIN, 900, 50);                                                 //""
  delay (50);                                                                 // fin de : "bip bip" de fin de setup

  Serial.println ("Serrure Atelier");     				                            // message dans le moniteur serie
  Serial.println ("");                                                        //""
  Serial.println ("Setup & Serial OK");                                       //""
  Serial.println ("Etat actuel = Initialisation finie");                      //""
  Serial.println ("");                                                        // fin de : message dans le moniteur serie
}

void loop() {
  while (EtatSysteme == ETATOUVERT) {                                         // tant que l'état passe à ouvert faire :
    if (!PremiereFoisOuvert) {                                                // envoi d'un seul message "ouverture"
      Serial.println ("Etat actuel = Ouverture ");                            //""
      PremiereFoisOuvert = true;}                                             //""

    PremiereFoisRepos = false;                                                // fin de : envoi d'un seul message "ouverture"

    Ouverture ();                                                             // faire la boucle ouverture définie plus bas

    if (millis () - chrono >= TimeOutEtat) {                                  // attendre 3 secondes avant de retourner à l'état repos
      TimeOut ();                                                             //""
      chrono = millis ();}                                                    // fin de attendre 3 secondes avant de retourner à l'état repos
  }

  while (EtatSysteme == ETATADD) {                                            // tant que l'état passe à etatadd (rajout d'un accès) faire : 
    if (!PremiereFoisADD) {                                                   // envoi d'un seul message "ajout d'utilisateur"
      Serial.println("Etat actuel = Etat Admin: ajout d'un utilisateur");     //""
      PremiereFoisADD = true;}                                                //""

    PremiereFoisRepos = false;                                                // fin de envoi d'un seul message "ajout d'utilisateur"

    delay (2000);                                                             // delai pour laisser le temps à l'utilisateur de retirer sa carte Admin de la zone de scan NFC

    BlinkLED();                                                               // faire clignoter les Leds

    if (nfc.tagPresent ()) {                                                  // si un tag NFC est détecté faire : 
      NfcTag tag = nfc.read ();						                                    // NfcTaf, l'objet tag prend la valeur de ce qui est lu dans le NFC tag
      chrono = millis ();                                                     // mis en place du chrono fonction millis()

      boolean accesOk = false;
      for (int a = 0; a < accesNombre; a ++) {
        if (acces[a] == "0") {						                                        // si la variable acces1 vaut 0
          acces[a] = tag.getUidString ();					                                // acces1 vaudra l'UID lu dans le tag NFC
          AjoutSuite();
          accesOk = true;
          break;}	 // Si trouvé on quitte la boucle							                                                    // faire la boucle pour gérer ce qui est fait ensuite, boucle AjoutSuite() définie plus bas
      }
      if (!accesOk) {
        MAX();}

      // if (acces1 == "0") {						                                        // si la variable acces1 vaut 0
      //   acces1 = tag.getUidString ();					                                // acces1 vaudra l'UID lu dans le tag NFC
      //   AjoutSuite();}							                                          // faire la boucle pour gérer ce qui est fait ensuite, boucle AjoutSuite() définie plus bas
      // else if (acces2 == "0") {						                                    // on refait la même chose pour les 60 variables acces
      //   acces2 = tag.getUidString ();					                                // ...
      //   AjoutSuite();}
      // else if (acces3 == "0") {
      //   acces3 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces4 == "0") {
      //   acces4 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces5 == "0") {
      //   acces5 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces6 == "0") {
      //   acces6 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces7 == "0") {
      //   acces7 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces8 == "0") {
      //   acces8 = tag.getUidString ();
      //   AjoutSuite();}
      // else if (acces9 == "0") {
      //   acces9 = tag.getUidString ();
      //   AjoutSuite(); }
      // else if (acces10 == "0"){
      //   acces10 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces11 == "0"){
      //   acces11 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces12 == "0"){
      //   acces12 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces13 == "0"){
      //   acces13 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces14 == "0"){
      //   acces14 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces15 == "0"){
      //   acces15 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces16 == "0"){
      //   acces16 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces17 == "0"){
      //   acces17 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces18 == "0"){
      //   acces18 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces19 == "0"){
      //   acces19 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces20 == "0"){
      //   acces20 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces21 == "0"){
      //   acces21 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces22 == "0"){
      //   acces22 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces23 == "0"){
      //   acces23 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces24 == "0"){
      //   acces24 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces25 == "0"){
      //   acces25 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces26 == "0"){
      //   acces26 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces27 == "0"){
      //   acces27 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces28 == "0"){
      //   acces28 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces29 == "0"){
      //   acces29 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces30 == "0"){
      //   acces30 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces31 == "0"){
      //   acces31 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces32 == "0"){
      //   acces32 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces33 == "0"){
      //   acces33 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces34 == "0"){
      //   acces34 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces35 == "0"){
      //   acces35 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces36 == "0"){
      //   acces36 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces37 == "0"){
      //   acces37 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces38 == "0"){
      //   acces38 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces39 == "0"){
      //   acces39 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces40 == "0"){
      //   acces40 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces41 == "0"){
      //   acces41 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces42 == "0"){
      //   acces42 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces43 == "0"){
      //   acces43 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces44 == "0"){
      //   acces44 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces45 == "0"){
      //   acces45 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces46 == "0"){
      //   acces46 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces47 == "0"){
      //   acces47 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces48 == "0"){
      //   acces48 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces49 == "0"){
      //   acces49 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces50 == "0"){
      //   acces50 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces51 == "0"){
      //   acces51 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces52 == "0"){
      //   acces52 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces53 == "0"){
      //   acces53 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces54 == "0"){
      //   acces54 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces55 == "0"){
      //   acces55 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces56 == "0"){
      //   acces56 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces57 == "0"){
      //   acces57 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces58 == "0"){
      //   acces58 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces59 == "0"){
      //   acces59 = tag.getUidString();
      //   AjoutSuite();}
      // else if (acces60 == "0"){
      //   acces60 = tag.getUidString();
      //   AjoutSuite();}							                                          // … fin des 60 accès
      // else MAX();                                                             // sinon faire la boucle MAX() définie plus bas
    } 

    if (millis () - chrono >= TimeOutEtat) {                                  // chrono millis, attendre 3 secondes avant de retourner à l'état repos
      TimeOut ();                                                             // "" 
      chrono = millis ();}                                                    // fin de : attendre 3 secondes avant de retourner à l'état repos
  }

  while (EtatSysteme == ETATDEL) {                                            // tant que l'état du système passe à etatdel (suppression d'un accès)
    if (!PremiereFoisDEL) {                                                   // envoie d'un message dans le moniteur série pour le signaler à l'utilisateur
      Serial.println("Etat actuel = Etat Admin: retrait d'un utilisateur");   //""
      PremiereFoisDEL = true;}                                                //""

    PremiereFoisRepos = false;                                                // fin de : envoie d'un message dans le moniteur série pour le signaler à l'utilisateur

    delay(2000);                                                              // delai pour attendre que l'admin retire sa carte du lecteur NFC

    BlinkLED();                                                               // faire clignoter les Leds

    if (nfc.tagPresent ()) {                                                  // si un tag est scanné :
      NfcTag tag = nfc.read ();                                               // l'objet "tag" prend la valeur de ce qui est lu sur le tag NFC
      chrono = millis ();                                                     // mis en place du chrono pour la fonctions millis()

      boolean accesOk = false;
      for (int a = 0; a < accesNombre; a ++) {
        if (tag.getUidString () == acces[a]) {						                                        // si la variable acces1 vaut 0
          acces[a] = "0";					                                // acces1 vaudra l'UID lu dans le tag NFC
          RetraitSuite();
          accesOk = true;
          break;}	 // Si trouvé on quitte la boucle							                                                    // faire la boucle pour gérer ce qui est fait ensuite, boucle AjoutSuite() définie plus bas
      }
      if (!accesOk) {
        MIN();}

      // if (tag.getUidString () == acces1) {				                            // si le tag lu vaut acces 1
      //   acces1 = "0";							                                            // acces1 vaudra désormais 0
      //   RetraitSuite();}						                                          // faire la boucle de retrait définie plus bas
      // else if (tag.getUidString () == acces2) {                               // …
      //   acces2 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces3) {
      //   acces3 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces4) {
      //   acces4 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces5) {
      //   acces5 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces6) {
      //   acces6 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces7) {
      //   acces7 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces8) {
      //   acces8 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces9) {
      //   acces9 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces10) {
      //   acces10 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces11) {
      //   acces11 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces12) {
      //   acces12 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces13) {
      //   acces13 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces14) {
      //   acces14 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces15) {
      //   acces15 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces16) {
      //   acces16 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces17) {
      //   acces17 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces18) {
      //   acces18 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces19) {
      //   acces19 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces20) {
      //   acces20 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces21) {
      //   acces21 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces22) {
      //   acces22 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces23) {
      //   acces23 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces24) {
      //   acces24 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces25) {
      //   acces25 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces26) {
      //   acces26 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces27) {
      //   acces27 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces28) {
      //   acces28 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces29) {
      //   acces29 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces30) {
      //   acces30 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces31) {
      //   acces31 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces32) {
      //   acces32 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces33) {
      //   acces33 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces34) {
      //   acces34 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces35) {
      //   acces35 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces36) {
      //   acces36 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces37) {
      //   acces37 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces38) {
      //   acces38 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces39) {
      //   acces39 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces40) {
      //   acces40 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces41) {
      //   acces41 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces42) {
      //   acces42 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces43) {
      //   acces43 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces44) {
      //   acces44 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces45) {
      //   acces45 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces46) {
      //   acces46 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces47) {
      //   acces47 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces48) {
      //   acces48 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces49) {
      //   acces49 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces50) {
      //   acces50 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces51) {
      //   acces51 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces52) {
      //   acces52 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces53) {
      //   acces53 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces54) {
      //   acces54 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces55) {
      //   acces55 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces56) {
      //   acces56 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces57) {
      //   acces57 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces58) {
      //   acces58 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces59) {
      //   acces59 = "0";
      //   RetraitSuite();}
      // else if (tag.getUidString () == acces60) {
      //   acces60 = "0";
      //   RetraitSuite();}						                                          // … fin pour les 60 variables acces
      // else MIN();
      }                                                            // sinon faire minimum défini plus bas

    if (millis () - chrono >= TimeOutEtat) {                                  // attendre 3 secondes avant de revenir à l'État repos
      TimeOut ();                                                             //""
      chrono = millis ();}                                                    // fin de : attendre 3 secondes avant de revenir à l'État repos
  }

  while (EtatSysteme == REPOS) {                                              // tant que l'état est repos faire : 
    if (nfc.tagPresent ()) {                                                  // si tag NFC scanné
      NfcTag tag = nfc.read ();                                               // l'objet tag prend la valeur de ce qui est lu du tag NFC
      Serial.println ("BADGE/CARTE scanné et récupéré");                      // écriture dans le moniteur série (maintenance) des informations du tag NFC
      Serial.println ("son UID est : ");                                      //""
      Serial.print (tag.getUidString ());                                     //""
      Serial.println ("");                                                    //""
      Serial.println ("");                                                    // fin de : écriture dans le moniteur série (maintenance) des informations du tag NFC

      if (tag.getUidString () == CarteAdminADD || tag.getUidString () == CarteAdminADD2) {          // si l'UID du tag NFC correspond à la carte d'admin 1 ou 2 d'ajout alors : 
        tone (Buzzer_PIN, 2000, 50);                                                                // faire son
        chrono = millis ();                                                                         // mise en place de millis()
        EtatSysteme = ETATADD;}                                                                     // passage du système à l'état de rajout d'accès
      else if (tag.getUidString () == CarteAdminDEL || tag.getUidString () == CarteAdminDEL2) {     // sinon si c'est un tag d'une carte de suppresion d'accès
        tone (Buzzer_PIN, 2000, 50);                                                                // faire son
        chrono = millis ();                                                                         // mise en place de millis()
        EtatSysteme = ETATDEL;}                                                                     // passage du système à l'état de suppresion d'acces
      // else if (tag.getUidString()==acces1||tag.getUidString()==acces2||tag.getUidString()==acces3||tag.getUidString()==acces4||tag.getUidString()==acces5||tag.getUidString()==acces6||tag.getUidString()==acces7||tag.getUidString()==acces8||tag.getUidString()==acces9||tag.getUidString()==acces10||tag.getUidString()==acces11||tag.getUidString()==acces12||tag.getUidString()==acces13||tag.getUidString()==acces14||tag.getUidString()==acces15) {
      //   chrono = millis ();
      //   EtatSysteme = ETATOUVERT;}
      // else if (tag.getUidString()==acces16||tag.getUidString()==acces17||tag.getUidString()==acces18||tag.getUidString()==acces19||tag.getUidString()==acces20||tag.getUidString()==acces21||tag.getUidString()==acces22||tag.getUidString()==acces23||tag.getUidString()==acces24||tag.getUidString()==acces25||tag.getUidString()==acces26||tag.getUidString()==acces27||tag.getUidString()==acces28||tag.getUidString()==acces29||tag.getUidString()==acces30) {
      //   chrono = millis ();
      //   EtatSysteme = ETATOUVERT;}
      // else if (tag.getUidString()==acces31||tag.getUidString()==acces32||tag.getUidString()==acces33||tag.getUidString()==acces34||tag.getUidString()==acces35||tag.getUidString()==acces36||tag.getUidString()==acces37||tag.getUidString()==acces38||tag.getUidString()==acces39||tag.getUidString()==acces40||tag.getUidString()==acces41||tag.getUidString()==acces42||tag.getUidString()==acces43||tag.getUidString()==acces44||tag.getUidString()==acces45) {
      //   chrono = millis ();
      //   EtatSysteme = ETATOUVERT;}
      // else if (tag.getUidString()==acces46||tag.getUidString()==acces47||tag.getUidString()==acces48||tag.getUidString()==acces49||tag.getUidString()==acces50||tag.getUidString()==acces51||tag.getUidString()==acces52||tag.getUidString()==acces53||tag.getUidString()==acces54||tag.getUidString()==acces55||tag.getUidString()==acces56||tag.getUidString()==acces57||tag.getUidString()==acces58||tag.getUidString()==acces59||tag.getUidString()==acces60) {
      //   chrono = millis ();
      //   EtatSysteme = ETATOUVERT;}

      boolean accesOk = false;
      for (int a = 0; a < accesNombre; a ++) {
        if (tag.getUidString()==acces[a]) {						                                        
          accesOk = true;					                                
          break;}	 // Si trouvé on quitte la boucle							                                                    // faire la boucle pour gérer ce qui est fait ensuite, boucle AjoutSuite() définie plus bas
      }
      if (accesOk) {
        EtatSysteme = ETATOUVERT;}
      else{                                                                   // sinon, si le tag vaut un des 60 accès autorisé passer le système à l'état d'ouverture et mise en place de millis()
        PremiereFoisRepos = false;                                            // et enfin sinon mettre première fois (message dans le moniteur serie) à false
        Refus();}                                                             // faire refus d'accès (boucle définie plus bas)
    }
    else Repos ();                                                            // si aucun tag n'est lu faire repos()
  }
}



void TimeOut() {
  if (EtatSysteme != REPOS) {                                                 // si état système pas repos alors : boucle timeout (atteinte lorsque le delai est depassé pour revenir à l'état de repos)
    Serial.println ("Time Out !");                                            // écriture dans le moniteur série
    tone(Buzzer_PIN, 1700, 200);                                              // faire son
    EtatSysteme = REPOS;}                                                     // passer l'état à repos
}

void Repos() {
  if (!PremiereFoisRepos){                                                    // si on à pas "première fois repos" : 
    Serial.println ("Etat actuel = REPOS");                                   // écriture dans le moniteur série (aide pour la maintenance)
    Serial.println ("Attente : ");                                            // écriture
    Serial.println ("");                                                      // écriture
    PremiereFoisRepos = true;}                                                // passage à l'état haut de "première fois" (évite la répitiion du message en boucle)

  PremiereFoisOuvert = false;                                                 // mettre les autres boolean "première fois" à false
  PremiereFoisBIPOuvert = false;                                              //""
  PremiereFoisADD = false;                                                    //""
  PremiereFoisDEL = false;                                                    // fin de : mettre les autres boolean "première fois" à false

  digitalWrite (Buzzer_PIN, LOW);                                             // mettre les sortie à 0 (repos)
  digitalWrite (LedR_PIN, LOW);                                               //""
  digitalWrite (LedV_PIN, LOW);                                               //""
  digitalWrite (Serrure_PIN, LOW);                                            // fin de : mettre les sortie à 0 (repos)
}

void Ouverture() {
  digitalWrite (Serrure_PIN, HIGH);                                           // mettre à l'état haut la broche de commande du relai 12V de la serrure (éléctro aimant)
  digitalWrite (LedV_PIN, HIGH);                                              // allumer la Led verte

  if (!PremiereFoisBIPOuvert) {                                               // si on à pas "première fois bip ouvert"
    tone (Buzzer_PIN, 1100, 100);                                             // faire du son pour signaler l'ouverture (première fois en boolean évite la répétition des bip)
    delay (100);                                                              //""
    tone (Buzzer_PIN, 1300, 50);                                              //""
    delay (50);                                                               //""
    PremiereFoisBIPOuvert = true;}                                            // fin de : faire du son pour signaler l'ouverture
}

void Refus() {
  Serial.println ("Refus d'acces: Utilisateur non reconnu");                  // signaler dans le moniteur série le refus du passage

  digitalWrite (LedR_PIN, HIGH);                                              // allumer Led rouge
  tone (Buzzer_PIN, 900, 100);                                                // faire son de refus
  delay (100);                                                                //""
  tone (Buzzer_PIN, 500, 50);                                                 //""
  delay (1000);                                                               // fin de : faire son de refus
}

void BlinkLED() {
  if (millis() - chronoLED >= 250) {                                          // faire clignotter les Leds verte et rouge (sans delay() mais avec miullis())
    chronoLED = millis();                                                     //""

    if (LedState == LOW) LedState = HIGH;                                     //""
    else LedState = LOW;}                                                     //""

  digitalWrite (LedR_PIN, LedState);                                          //""
  digitalWrite (LedV_PIN, LedState);                                          // fin de : faire clignotter les Leds verte et rouge (sans delay() mais avec miullis())
}

void AjoutSuite() {
  Serial.println ("accès ajouté pour ce badge");                              // (boucle pour éviter la répétition) 
  delay(500);                                                                 // signal sonnore + moniteur série
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay(2000);                                                                // fin de : signal sonnore + moniteur série
}

void RetraitSuite() {
  Serial.println ("retrait de l'accès de ce badge");                          // (boucle pour éviter la répétition)
  delay(500);                                                                 // signal sonnore + moniteur série
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 2000, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay (200);                                                                //""
  tone (Buzzer_PIN, 1500, 50);                                                //""
  delay(2000);                                                                // fin de : signal sonnore + moniteur série
}

void MAX() {
  Serial.println ("accès maximal atteint");                                   // plus de place pour l'ajout d'un accès (toutes les variables sont différentes de 0) + moniteur série
  tone (Buzzer_PIN, 600, 1000);                                               //""
  delay(1000);                                                                // fin de : plus de place pour l'ajout d'un accès
}

void MIN() {
  Serial.println ("badge n'ayant pas l'accès autorisé");                      // le badge n'avais pas de base l'accès autorisé + moniteur série
  tone (Buzzer_PIN, 400, 1000);                                               //""
  delay(1000);                                                                // fin de : le badge n'avais pas de base l'accès autorisé + moniteur série
}

Cordialement
jpbbricole

1 Like

Un fichier CSV (Comma-Separated Values) est un fichier texte dans lequel les données sont organisées sous forme de lignes et de colonnes, séparées par des virgules (ou plus généralement un séparateur de votre choix).

Chaque ligne représente une entrée de données et chaque valeur dans la ligne est séparée par une virgule. Ce format est couramment utilisé pour l'échange de données entre des applications, car il est simple et largement supporté par de nombreux logiciels comme excel qui sait exporter des valeurs dans ce format

par exemple votre fichier excel contiendrait

droits Nom code
1 Gauthier Benoit EB FF C6 FF A4 A6 FF
1 Julien Dupond EB FF 16 FF BC AD FF
1 Pierre Dupont EB F9 16 FF C4 D4 FF
4 Charles Henry FC FC 27 F4 D3 D4 FF
8 Louis du Bourg Palette A6 B2 CC FF 17 FF FF

et le fichier exporté en CSV (ne prenez pas l'en-tête des colonnes)

1,Gauthier Benoit,EB FF C6 FF A4 A6 FFreturn
1,Julien Dupond,EB FF 16 FF BC AD FFreturn
1,Pierre Dupont,EB F9 16 FF C4 D4 FFreturn
4,Charles Henry,FC FC 27 F4 D3 D4 FFreturn
8,Louis du Bourg Palette,A6 B2 CC FF 17 FF FFreturn

avec les droits correspondant à
enum Droits : byte {AUCUN = 1, UTILISATEUR = 2, ADMIN_ADD = 4, ADMIN_DEL = 8};

1 Like

merci beaucoup @J-M-L je vais essayer un nouveau code au propre avec ceci et en gardant en tête le principe de maitre et esclave pour mes deux shield sur le port SPI.
et merci à @jpbbricole à l'aide de vos différentes remarques je vais écrire une nouvelle version de mon code un peu plus propre.

Je vais essayer avec le CSV et je vais garder le principe de tableau, bien sur ici il n'y aurais plus de "AdminADD" et AdminDEL" tout serais géré dans le tableau, si t'es pas dans le tableau tu ne rentres pas.

Meric pour vos retours rapides et propositions à chacun

Bonjour louisjaffeux

Avec les macro d'Excel, tu pourrais gérer les accès en modifiant dans les cellules et en copiant ces cellules sur la carte SD que tu lirai dans l'Arduino.
Ou dans l'autre sens, dans l'Arduino, enregistrer les nouveau accès, les sauvegarder sur la SD, SD que tu lira dans Excel.

Si tu veux un coups de main ...

Cordialement
jpbbricole

je suis prenneur de toutes l'aide disponible dans le domaine du possible je ne veux pas abuser,

Le but serais que nos 2 Admins, ais accès à cette carte SD et au boitier élec avec l'arduino via une clé unique et des vis uniques.

En la récupérant ils pourrons la lire avec un lecteur de carte SD USB sur leurs ordinateur accéder à l'excel stocké dessus rajouter le nom d'un futur utilisateur et l'UID en hexadécimal du badge NFC (grâce à NFC Tool)

Une fois cette ligné rajoutée, enregistrer le tout et le remettre dans la carte SD et le boitier. cela simplifierais le tout pour rajouter et enlever l'accès de quelqu'un.

je vais déjà dans un premier temps ré écrire au propre, grâce à celui que tu as proposé et celui de JML, mon code.

Puis dans la semaine je vais revenir chercher du soutiens sans doute pour gérer le CSV ...etc

Bonjour louisjaffeux

C'est exactement ainsi que je voyais la chose :wink:

A+
Une belle journée.
jpbbricole

merci beaucoup à toi
je reviens vers vous lundi je vais partir en week end et ne serais pas disponible

Bon week end à vous

bon week end !

Bonjour louisjaffeux

Je me suis amusé à l’exercice, j’ai fait une feuille Excel qui permet de gérer les accès et créer le fichier, sur la carte SD, qui sera lue par le MEGA.

Les paramètres de la carte SD, sur le PC, ce règlent ici :
image

Le nom du fichier doit correspondre à celui déclaré dans le sketch :
const String sdFileName = "ACCES.CSV";

Une fois les mise à jour faites et la carte SD introduite dans le PC, cliquer :
image

Si tout est OK il y a le message :

Côté Arduino Mega, avant de charger le sketch ci-dessous, renseigner le chip select du lecteur de cartes, ici le 53 :
const int sdChipSelect = 53;

Charger le sketch.
Au démarrage du programme il y a la liste des commandes reconnues, commandes introduites dans la ligne de commande du moniteur de l’IDE, à 115200 :

Commandes reconnues:
	Charger:
	Lister:

En fin de void setup(), si tu décommentes cette ligne :
//cmdExecute("CHARGER"); // Charger les données du fichier sdFileName qui est sur la carte SD
Les données des accès sont mises à jour automatiquement, à chaque démarrage du programme.

Le programme:

/*
	Name:       AF_louisjaffeux_SerrureNfcSd.ino
	Created:	09.01.2025
	Author:     jpbbricole
	13.01.2025	Première version #20
*/
#include <SPI.h>
#include <SD.h>

const int sdChipSelect = 53;

const String sdFileName = "ACCES.CSV";
const String sdFilsSeparateur = ",";
const int accesNombre = 60; // Nombre d'accès (0 - 59)

struct accesDef // Structure du tableau des accès
{
	String user; // Utilisateur
	String uid; // UID de la carte
};
accesDef acces[accesNombre]; // Création du tableau des accès


void setup()
{
	Serial.begin(115200);
	Serial.println("Initialisation carte SD ...");

	if (!SD.begin(sdChipSelect)) {
		Serial.println("initialization failed");
		while (true);
	}
	Serial.println("\tCarte SD OK");
	cmdExecute("?"); // Lister les commandes

	//cmdExecute("CHARGER"); // Charger les données du fichier sdFileName qui est sur la carte SD
}

void loop()
{
	if (Serial.available()) // Si commande moniteur
	{
		cmdExecute(Serial.readStringUntil('\n')); // Jusqu'à nouvelle ligne
	}

}

void cmdExecute(String cmdRx)
{
	cmdRx.trim(); // Nettoyage
	cmdRx.replace(" ", ""); // Suppromer les espaces
	cmdRx.toUpperCase(); // En majuscule
	
	Serial.println("Commande recue: " + cmdRx);
	if (cmdRx == "CHARGER")
	{
		Serial.println("\nCharger acces");
		accesCharger();
	}
	else if (cmdRx == "LISTER")
	{
		Serial.println("\nListe acces");
		accesLister();
	}
	else if (cmdRx == "?")
	{
		cmdHelp();
	}
	else if (cmdRx == "SAUVER")
	{
		//Serial.println("\nSauve acces");
		//accesSauver();
	}
	else
	{
		Serial.println("Commande inconnue !!!: " + cmdRx);
	}
}

void cmdHelp()
{
	Serial.println("\nCommandes reconnues:");
	Serial.println("\tCharger:");
	Serial.println("\tLister:");
}

void accesLister() // Liste le contenu de acces
{
	for (int a = 0; a < accesNombre; a ++) // Toutes les entrées du tableau acces à "0"
	{
		accesDisplayLigne(a);
	}
}

void accesSauver() // Sauvegarde des données
{
	if (SD.exists(sdFileName))
	{
		if (SD.remove(sdFileName))
		{
			Serial.println("Fichier supprime avec succes.");
		}
	}

	File sdFile = SD.open(sdFileName, FILE_WRITE);

	if (sdFile)
	{
		for (int a = 0; a < accesNombre; a ++) // Toutes les entrées du tableau acces à "0"
		{
			sdFile.println(acces[a].user + sdFilsSeparateur + acces[a].uid);
			accesDisplayLigne(a);
		}
	}
	else
	{
		Serial.println("error opening " + sdFileName);
	}
	sdFile.close();
}

void accesCharger() // Charger les données
{
	File sdFile = SD.open(sdFileName);

	if (sdFile)
	{
		for (int a = 0; a < accesNombre; a ++) // Toutes les entrées du tableau acces à "0"
		{
			String sdLine = sdFile.readStringUntil('\n'); // Ligne lue
			sdLine.trim(); // Nettoyage
			acces[a].user = sdLine.substring(0, sdLine.indexOf(sdFilsSeparateur)); // Extraire le premier paramètre, jusqu'au séparateur
			acces[a].uid = sdLine.substring(sdLine.indexOf(sdFilsSeparateur) + 1); // Extraire le secondr paramètre, depuis le eéparateur

			accesDisplayLigne(a);
		}
	}
	else
	{
		Serial.println("error opening " + sdFileName);
	}
	sdFile.close();
}

void accesDisplayLigne(int ligne)
{
	Serial.print("Acces " + String(ligne) + " =\t");
	Serial.println(acces[ligne].user + "\t" + acces[ligne].uid);
}

Le programme Excel:
AF_louisjaffeux_SerrureNfcSd.zip (21.0 KB)

A+
Cordialement
jpbbricole

1 Like