Bonjour,
Je bloque sur mon projet, et j'ai besoin d'aide... Merci d'avance!
Projet:
Serrure pour une cabane à vélos par un vérin électrique commandé par un badge RFID 125khz (+ 1 BP à l’intérieur de la cabane), le tout sur un arduino UNO.
- quelques fin courses, led, boutons poussoirs.
Pour info:
Pour l'instant les fin de course et relais sont simulé par des boutons poussoirs et led.
Pour la partie RFID/comparaison badge je suis allé ici : ici , je ne comprends pas la ligne 69 de l'exemple RFID.flush(); // stops multiple reads
Dans le code, j'ai remplacé mes numéros de badge par des xxx pour ne pas les diffuser.
Mon cycle fonctionne sauf que:
Problème :
1- Si je suis trop lent pour retirer le badge du lecteur, il continu à être lu plusieurs fois.
Le cycle se passe bien, mais il se répète (même s'il n'y a plus de badge présent) autant de fois qu'il a eu le temps de les lire précédemment.
2- Si je présente un badge alors que la porte est ouverte (CaptPF dans le code), le cycle ne se lance pas (normal), par contre il se lance dès que la porte est fermé (ce qui n'est pas voulu)
Bon place au code, attention les yeux, c'est mon premier...
//RFID
#include <SoftwareSerial.h>
SoftwareSerial RFID(2,3); // RX and TX
int data1 = 0;
bool badgeOK = false;
int tag1[14] = {2,xxxxx,3};
int tag2[14] = {2,xxxxx,3};
int tag3[14] = {2,xxxxx,3};
int tag4[14] = {2,xxxxx,3};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons
//cycle
//output
const int kaF=8; //relais fermeture
const int kaO=9; //relais ouverture
const int LedDEF=10; //visu fin course HS
const int LedR=11; //visu ouverture
const int LedV=12; //visu fermeture
//input
const int FcF=4; //fin course ferme
const int FcO=5; //fin course ouvert
const int BpM=6; //BP commande manuel manuel
const int CaptPF=7; //Capteur magnetique controle porte position ferme
//variable
bool mouvF; //fermeture en cours
bool mouvO; //ouverture en cours
unsigned long secuFC; //stockage du temps pour securite si fin course HS
void setup()
{
//RFID
RFID.begin(9600); // start serial to RFID reader
//cycle
pinMode(kaF,OUTPUT);
pinMode(kaO,OUTPUT);
pinMode(LedDEF,OUTPUT);
pinMode(LedR,OUTPUT);
pinMode(LedV,OUTPUT);
pinMode(FcF,INPUT);
pinMode(FcO,INPUT);
pinMode(BpM,INPUT);
pinMode(CaptPF,INPUT);
digitalWrite(kaF,LOW);
digitalWrite(kaO,LOW);
digitalWrite(LedDEF,LOW);
digitalWrite(LedR,LOW);
digitalWrite(LedV,LOW);
mouvF=false;
mouvO=false;
}
//-----------------------------------
//RFID-fonction
boolean comparetag(int aa[14], int bb[14])
{
boolean ff = false;
int fg = 0;
for (int cc = 0 ; cc < 14 ; cc++)
{
if (aa[cc] == bb[cc])
{
fg++;
}
}
if (fg == 14)
{
ff = true;
}
return ff;
}
void checkmytags() // compares each tag against the tag just read
{
badgeOK=false;
if (comparetag(newtag, tag1) == true) //eric
{
badgeOK=true;
}
if (comparetag(newtag, tag2) == true) //carole
{
badgeOK=true;
}
if (comparetag(newtag, tag3) == true) //enzo
{
badgeOK=true;
}
if (comparetag(newtag, tag4) == true) //clara
{
badgeOK=true;
}
}
void readTags()
{
if (RFID.available() > 0)
{
// read tag numbers
delay(100); // needed to allow time for the data to come in from the serial buffer.
for (int z = 0 ; z < 14 ; z++) // read the rest of the tag
{
data1 = RFID.read();
newtag[z] = data1;
}
RFID.flush(); // stops multiple reads
// do the tags match up?
checkmytags();
}
}
//-----------------------------------
//CYCLE-fonction
void fermeture()
{
digitalWrite(kaF,HIGH); //relais fermeture actif
secuFC=millis(); //pour secu fin course HS
mouvF=true; //fermeture en cours
while(mouvF==true) //temps que "fermeture" est en cours
{
digitalWrite(LedR,millis()/250%2); //visu fermeture en cours
if(digitalRead(FcF)==HIGH) //fin course OK fonctionnement normal
{
mouvF=false; //fin de demande fermeture
digitalWrite(kaF,LOW); //relais inactif
digitalWrite(LedR,HIGH); //visu fin de fermeture allume
delay(5000);
digitalWrite(LedR,LOW); //visu fin de fermeture eteind
}
else if(millis()-secuFC>=10000) //securite si fin course HS
{
mouvF=false; //fin de demande fermeture
digitalWrite(kaF,LOW); //relais inactif
digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
digitalWrite(LedR,HIGH); //visu fin de fermeture allume
delay(5000);
digitalWrite(LedR,LOW); //visu fin de fermeture eteind
}
}
delay(100);
}
void ouverture()
{
digitalWrite(kaO,HIGH); //relais ouverture actif
secuFC=millis(); //pour secu fin course HS
mouvO=true; //ouverture en cours
while(mouvO==true) //temps que "ouverture" est en cours
{
digitalWrite(LedV,millis()/250%2); //visu ouverture en cours
if(digitalRead(FcO)==HIGH) //fin course OK fonctionnement normal
{
mouvO=false; //fin de demande ouverture
digitalWrite(kaO,LOW); //relais inactif
digitalWrite(LedV,HIGH); //visu fin de ouverture allume
delay(5000);
digitalWrite(LedV,LOW); //visu fin de ouverture eteind
}
else if(millis()-secuFC>=10000) //securite si fin course HS
{
mouvO=false; //fin de demande ouverture
digitalWrite(kaO,LOW); //relais inactif
digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
digitalWrite(LedV,HIGH); //visu fin de ouverture allume
delay(5000);
digitalWrite(LedV,LOW); //visu fin de ouverture eteind
}
}
delay(100);
}
void loop()
{
if (digitalRead(CaptPF)==LOW) //si porte ferme
{
if (digitalRead(FcO)==HIGH && digitalRead(BpM)==HIGH) //demande fermeture manuel
{
fermeture();
}
else if (digitalRead(FcO)!=HIGH && digitalRead(BpM)==HIGH) //demande ouverture manuel
{
ouverture();
}
readTags(); //fonction readTags
if (digitalRead(FcO)==HIGH && badgeOK==true) //demande fermeture badge
{
fermeture();
badgeOK=false;
}
else if (digitalRead(FcO)!=HIGH && badgeOK==true) //demande ouverture badge
{
ouverture();
badgeOK=false;
}
}
delay(200);
}
Merci de votre aide!