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




