Le Logiciel :
C'est certainement la partie la plus interressante du projet ....
Les bibliothèques :
3 bibliothèques sont nécessaires :
1/ La bibliothèque 'SPI.h' (Serial Peripheral Interface = Pour utiliser le port Serie de l'Arduino , nécessaire dans ce projet pour controler le lecteur de cartes SD.
2/ La bibliothèque 'SoftwareeSerial.h' (Spécialement développée pour permettre une communication avec d'autres Pins de l'Arduino ). Dans notre projet, nécessaire pour piloter le 'Lecteur RFID'.
3/ La bibliothèque 'SD.h' (SD Card = Pour utiliser le lecteur de carte SD)
Ces 3 bibliothèques sont à déclarer tout au début de votre code :
Définition des variables :
Initialisation du lecteur RFID (via la bibliothèque SoftwareSerial) et du lecteur de carte SD (via la bibliothèque SD) :
Définition du port pour la commande du Relais (port 2 de l'Arduino)
Définition des ports pour les Leds
Définition des variables pour gérer le clignotement des leds
Définition des variables pour gérer la mémorisation des badges (maximum = 10) ainsi que la définition des 2 badges 'superviseurs' pour l'AJOUT de nouveaux badges et l'EFFACEMENT de badges mémorisés.
Le codage d'un badge se fait via une suite de 14 chiffres, dont le premier est toujours un '2' et le dernier est toujours un '3'.Il vous sera expliqué comment 'récupérer' le codage d'un badge un peu plus loin. La seule chose à savoir pour le moment, est que le numéro de codage ne correspond pas à celui gravé sur les cartes (si vous en avez)....Enfin, pour des raisons de sécurité, j'ai masqué le codage de mes 2 badges 'AJOUTER' et 'SUPPRIMER'...'. Il faudra inscrire ici, le codage de vos 2 badges.
SETUP :
Le 'SETUP' est très important. Il est éxécuté qu'une seule fois au tout début du programme et permet de paramétrer les broches de l'Arduino utilisées par nos différents composants :
Définition et paramétrage des broches pour les LEDs, puis éclairage de toutes les LEDs pendant 1 seconde, puis extinction de toutes les LEDS. Ceci nous permettra, à chaque mise sous tension de l'Arduino, de vérifier que les LEDS fonctionnent parfaitement !.
L'allumage ou l'extinction des LEDs est réalisée via la procédure 'allumerled()'
La procédure 'allumerled() nécessite 3 paramètres :
1/ le n° de la led à allumer et/ou éteindre ( 1 = rouge, 2 = vert, 3 = bleu et 4 = jaune
2/ le delai (en millisecondes) pendant lequel la LED sélectionnée doit rester allumée
3/ une information pour indiquer si la LED doit être éteinte APRES les delai
Dans le SETUP, nous alons également paramétrer la broche utilisée pour la commande du relais en sortie (et à l'état 'BAS' : lignes 113 à 155), ainsi que la broche pour le pilotage de la carte SD (également en sortie, lignes 117 à 119)
Initialisation du port Serie (lignes 122 à 124)
Puis définition de la variable 'badgelu' = true) utilisée pour vérifier si un badge a été lu (ligne 126)
Initialisation de la variable 'ledallumee' à 'false' (ligne 127)
définition d'un délai entre 2 clignotement de led (ligne 128)
On execute la procédure (sous programme) 'efface_tous_les_badges()', qui comme son nom l'indique, va effacer tous les badges mémorisés en mémoire. (ligne 131)
Une fois tous les badges effacés, on vérifie si le lecteur de carte SD est opérationnel et si un carte SD est bien présente, via le sous programme : sdcardconnecte(). Si c'est la cas, la variable 'sd_card_ready' sera mise à 'true' (vrai) . (ligne 134)
Enfin, si le lecteur de carte SD est opérationnel, on lit les données enregistrées sur la carte SD pour les mémoriser dans les variables 'tag' de l'Arduino (ligne 137).
LOOP :
Cette partie 'LOOP' est éxécutée sans fin par l'Arduino , d'ou son nom de 'boucle' en Francais
Dans la partie 'SETUP', la variable 'badgelu' a été forcée à 'TRUE'. Donc la condition à la ligne 1125 est vrai : 'if (badgelu == true)'. Cela siginifie que les lignes 1127 et 1128 vont être executées et que le message 'Passez un badge devant le lecteur...' va s'affichier sur la console.
La ligne 1130 assure le clignotement de la led 'Bleu' (n° 3)
La ligne 1131 lance le coeur du programme via la procédure 'readTags'.
Procédure 'readTags()' :
la ligne 1042 fait appel à la procédure 'lecturebadge()', qui retournera dans la variable 'badgelu, la valeur 'TRUE' si un badge a été lu...Les lignes 987 à 994 s'asurent que la 1ere donnée lue est bien un '2'.
Pour rappel, le codage du badge commence toujours par un 2 et se termine par un 3. Si le 1er chiffre lu est un 2, on continue la lecture, sinon, on ne prend pas en compte la donnée.
Les lignes 1013 à 1019 permettent de s'assurer que les 14 chiffres du badge ont bien été lus.. Il peut arriver en effet que le badge soit retirer trop tôt du lecteur et que la lecture soit incomplète.Si c'est le cas, la LED rouge est allumée et le message 'lecture : INCOMPLETE...LECTURE ANNULEE...' s'affiche sur la console.
La ligne 1027 lance la procédure 'videbuffer() qui permet d'effacer la mémoire tampon du lecteur RFID utilisée pour la lecture du badge et ainsi de s'assurer qu'aucune donnée viendra 'poluer' notre programme.
Via la ligne 1028, retour à la procédure 'readTags' (ligne 1042) en précisant , si un badge a été lu ou non
Si un bage est lu, il convient de vérifier si celui-ci est connu et si il permet d'actionner le relais. C'est le role de la procédure 'checkmytags()' .Cette procédure retournera un chiffre entre 0 et 30 en fonction du résultat de l'analyse du badge lu.
Précisions complémentaires :
Il ne sera pas possible de détailler chaque ligne du code sur ce site, mais vous avez maintenant en votre possession, tous les éléments nécessaire pour comprendre le code. De plus, celui-ci fait l'objet de nombreux commentaires afin de faciliter son fonctionnement.
Quelques précisions sont cependant encore nécessaires :
Procédure 'ecriturecard()'
Comme son nom l'indique, elle est en charge d'assurer l'enregistrement des nouveaux badges sur la carte SD. Cependant, l'enregistrement se fait sur un fichier 'TXT' (rfid.txt) donc en ASCI.
Il faut donc raisonner en ASCI. En ASCI, le chiffre '0' est représenté par 48. 49 correspond au chiffre 1 , et ainsi de suite. C'est pour cette raison que le chiffre 48 est ajouté avant écriture dans le fichier TXT.
De plus, le chiffre 25 sera enregistré sur le fichier TXT par 2 caractères : un premier caractère pour le '2' (qui correspond au code ASCI 50) et un deuxième pour le chiffre '5' (qui correspond au code ASCI 55).
Comme vous pouvez le constater, il est donc nécessaire de vérifer si la donnée à écrire dans le fichier TXT comporte 1 ou 2 caractères ( ce qui correspond à déterminer si la donnée est inférieure à 10). Tous ces paramètres sont pris en compte dans la procédure 'ecriturecard()
Procédure 'lecturecard()'
Comme son nom l'indique, cette procédure a pour objectif de lire et de mettre en mémoire de l'Arduibo, les badges lus sur la carte SD. Le fichier enregistré sur la carte SD étant en ASCI, il faudra décoder les caractères ASCI pour les transformer données numériques. C'est le mécanisme inverse de celui utilisé dans la procédure 'ecriturecard()'.
Les données des badges enregistrées dans le fichier TXT diovent commencer par un '/' (code ASCI = 47) et chaque chiffre, séparé par une ',' (code ASCI = 44). Enfin , un '/' final vient 'FERMER' les données.
Exemple du format utilisé pour un badge : Badge n° 1 : /2,10,11,12,13,14,15,16,17,18,19,20,21,3/
Vous voyez que vous disposez de quelques caractères avant le premier '/' pour indiquer, par exemple, le propriétaire du badge (exemple : Papa, Maman, tonton, etc...). Vous avez au total 100 caractères disponibles.
La procédure 'lecturebadge()' va donc tenter de déterminer le premier '/'... Si elle le trouve, elle commencera la lecture des chiffres du badge.
Si aucun '/' est détecté après avoir lu 100 caractère, la procédure décidera que la fichier enregistré sur la carte SD n'est pas conforme et retournera l'erreur n° 5.
D'autres controles sont effectués, comme vérifier qu'une ',' est bien présente entre chaque données. Si ce n'est pas le cas, l'erreur n° 7 est retournée.
Tous les codes erreurs sont détaillés ci dessous :
Code complet :
Vous pouvez télécharger le code complet avec le lien ci joint :
télécharger le code complet