Bonjour,
Tout d'abord, je tiens à préciser que je suis un débutant sur Arduino, j'ai commencé il y a peu de temps à faire des programmes avec Arduino.
Je suis en Terminale S-SI et je dois faire un système que je dois présenter pour le bac.
J'ai voulu faire un programme basé sur des badges RFID, j'ai imaginé un système dans lequel l'utilisateur puisse sécuriser son vélo. Il arrive pour la première fois, scanne son badge RFID et le tag de celui-ci est enregistré. Ensuite, le moment où il veut récupérer son vélo, il scanne de nouveau son badge RFID et s'il correspond au badge premièrement scanné, alors son vélo est déverrouillé sinon, il ne se passe rien.
Pour cela, j'ai réalisé un programme en utilisant la méthode "Switch...Case" de Arduino. J'ai utilisé un écran pour voir si la détection de mes badges se faisaient correctement. Cependant, le programme se déroule bien jusqu'à que l'on scanne un badge RFID, au lieu que ce soit simplement la procédure de l'enregistrement de la carte qui se lance, toutes les étapes se déroulent.
Alors voilà, je voudrais savoir d'où vient le problème et si possible comment le résoudre.
Je tiens à préciser que j'ai branché mon Lecteur de badges RFID sur la sortie UART du module Grove Shield.
Les composants :
Le code :
#include <LiquidCrystal.h>
LiquidCrystal Ecran(8,9,4,5,6,7);
unsigned char tag;
unsigned char tag2;
int changement;
void setup()
{
Serial.begin(9600);
changement=0;
Ecran.begin(16,2);
Ecran.setCursor(0,0);
Ecran.print("BONJOUR");
delay(2000);
Ecran.clear();
}
void new_user()
{
Ecran.begin(16,2);
Ecran.setCursor(0,0);
Ecran.print("CARTE ENREGISTREE");
delay(1000);
for (int position=0; position<5; position++) {
Ecran.scrollDisplayLeft();
delay(400);
Ecran.clear();}
changement=1;
}
void carte_enregistree()
{
bool badgeOk = tag==tag2 ;
if (badgeOk)
{
Ecran.setCursor(0,0);
Ecran.print("TEST ACCEPTE");
delay(1000);
for (int position=0; position<20; position++) {
Ecran.scrollDisplayLeft();
delay(400);
}
Ecran.clear();
changement=0;
}
else
{
Ecran.setCursor(0,0);
Ecran.print("TEST REFUSE");
delay(1000);
Ecran.clear();
}
}
void loop(){
switch (changement) {
case 0 :
if (Serial.available()) {
tag=Serial.read();
new_user();}
break;
case 1 :
if (Serial.available()) {
tag2=Serial.read();
carte_enregistree();}
break;
default :
break;
}
}
En vous remerciant d'avance,
Azeddine
Il faudrait initialiser changement à 0 dans l'entête du programme.
Sinon, je pense que pour un écran de 16 colonnes, il n'est pas nécessaire de faire un décalage à gauche de 20 espaces (dans carte_enregistree). Est-ce que la lecture des badges se passe bien ? Je veux parler de lignes "tag=Serial.read();" et "tag2=Serial.read();" car ça me semble simple mais je ne connais pas le lecteur que tu utilises...
Pour ce qui est d'initialiser changement à 0, je l'ai fait dans la fonction void setup.
En ce qui concerne le décalage, il est vrai qu'il est inutile ici mais je l'ai laissé car dans le vrai programme que je souhaite réaliser le message est plus long et le décalage est nécessaire, c'est cela que j'ai décidé de le laisser.
Le lecteur que j'utilise est un lecteur grove 125khz, j'ai mis le lien dans le post initial. Par rapport au fait que la lecture se passe bien, je suppose que oui mais comme je l'ai dit, je suis encore débutant donc je ne peux pas affirmer que tout se passe bien. Quand je passe un badge, l'écran affiche "CARTE ENREGISTREE" mais il affiche tout de suite après "TEST REFUSE", je n'ai pas le temps de repasser un badge, il lance directement l'étape suivante.
Pour la condition bool badgeOk = tag==tag2 ; j'aurais mis des parenthèses :
bool badgeOk = (tag==tag2) ;
mais il est probable que ça fonctionne comme tu l'as écrit.
Je ne suis pas sûr de ta façon de lire les badges. Tu testes si la liaison série est disponible
if (Serial.available())
puis tu lis ce qui en arrive :
tag=Serial.read();
et tu affiches un message avec new_user();
A ce moment, changement passe à 1 donc tu accèdes à la seconde partie du switch et tu lances la lecture du second badge.
if (Serial.available()) {
tag2=Serial.read();
Je ne connais pas ce lecteur (je n'en connais aucun) mais en lisant la doc sur le site que tu indiques, il semble que la lecture d'un badge c'est légèrement plus compliqué qu'un simple Serial.read().
Voici leur code :
#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64]; // buffer array for data receive over serial port
int count = 0; // counter for buffer array
void setup()
{
SoftSerial.begin(9600); // the SoftSerial baud rate
Serial.begin(9600); // the Serial port of Arduino baud rate.
}
void loop()
{
// if date is coming from software serial port ==> data is coming from SoftSerial shield
if (SoftSerial.available())
{
while(SoftSerial.available()) // reading data into char array
{
buffer[count++] = SoftSerial.read(); // writing data into array
if(count == 64)break;
}
Serial.write(buffer, count); // if no data transmission ends, write buffer to hardware serial port
clearBufferArray(); // call clearBufferArray function to clear the stored data from the array
count = 0; // set counter of while loop to zero
}
if (Serial.available()) // if data is available on hardware serial port ==> data is coming from PC or notebook
SoftSerial.write(Serial.read()); // write it to the SoftSerial shield
}
void clearBufferArray() // function to clear buffer array
{
// clear all index of array with command NULL
for (int i=0; i<count; i++)
{
buffer[i]=NULL;
}
}
Ils ne lisent pas un simple char mais un tableau de char pouvant aller jusqu'à 64 caractères.
Tu devrais d'abord tester ce code et voir ce qu'il affiche sur la console. Ensuite comprendre comment il fonctionne.
Je ne sais pas si tu connais
SoftwareSerial SoftSerial(2, 3);
ça crée une liaison série "logicielle" en plus de la liaison matérielle (pins 0 et 1 ou TX et RX de l'Arduino) qui sert à discuter avec ton PC via la console. Cette nouvelle liaison sert à discuter avec le lecteur.
Il y a aussi une bibliothèque faite pour gérer la communication avec le lecteur. Ce lien indique précisément comment connecter le lecteur et donne des exemples d'utilisation que tu peux tester et étudier à loisir.
Tu peux t'inspirer des exemples et faire ton programme, en comparant le code du tag lu au début avec celui qui est lu ensuite.
Après quelques jours à comprendre et travailler avec tous les documents que tu m'as donné, j'ai enfin réussi à faire un code qui fonctionne.
Merci beaucoup pour m'avoir aidé.
Bonne continuation.