Problème Code Contrôle d'Accès

Bonjour
Je suis en terminale STI2D et jai comme projet pour le bac de réalisé un contrôle d’accès qu’on peut ouvrir avec un badge RFID et un clavier.
J’ai réalisé, au départ deux codes différents, un pour le badge RFID et un autre pour le clavier, qui fonctionnent comme je le veux, sans problème, mais lorsque j’ai voulu les assemblés, les problèmes sont arrivés. Tout d’abord, le clavier fonctionne parfaitement mais lorsque j’essaye de dévérouiller en utilisant le badge RFID, il y a des “delay” de 2 secondes qui apparaissent, je le vois bien quand j’essaye d’ouvrir avec le clavier après. Ensuite, je peux dévérouiller la gâche qu’une fois avec le badge, alors qu’avec le même code, mais séparé de celui du clavier, il n’y a aucun problème.
Je mets le code à disposition dans l’espoir que quelqu’un m’aide.
Merci d’avance pour ceux qui vont m’aider.

PS: Je suis débutant dans la programmation alors il est fort probable que ce soit une errreur évidente pour quelqu’un qui code régulièrement.

/*****************************************************************************************************************************************
  BIBLIOTHEQUES UTILISEES
*****************************************************************************************************************************************/
#include <Keypad.h> // Bibliothèque pour le clavier
#include <Password.h> // Bibliothèque pour le mot de passe
#include <SPI.h> // Bibliothèque pour le capteur RFID
#include <MFRC522.h> // Bibliothèque pour le capteur RFID

/*****************************************************************************************************************************************
  DEFINITION DES NUMERO DE BROCHE UTILISES
*****************************************************************************************************************************************/
#define relais 2

#define SDA_PIN 10
#define RST_PIN 9

/*****************************************************************************************************************************************
  DEFINITION D'UN OBJET ("Variable") DE TYPE MFRC522
*****************************************************************************************************************************************/
MFRC522 mrfc(SDA_PIN, RST_PIN); // Affection des broches

/*****************************************************************************************************************************************
  DEFINITION D'UN OBJET ("Variable") DE TYPE PASSWORD
*****************************************************************************************************************************************/
Password pwd = Password("1234"); // Définit le mot de passe

/*****************************************************************************************************************************************
  DEFINITION DES VARIABLES et Initialisation
*****************************************************************************************************************************************/
int nbCodeMauvais = 0;

const byte ROWS = 4; // 4 Ligne
const byte COLS = 3; // 3 Colonne

char clavier[ROWS][COLS] = { // Définit les symboles sur les boutons du clavier
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {0, 8, 7, 6}; // Broche pour les lignes
byte colPins[COLS] = {5, 4, 3}; // Broche pour les colonnes 

Keypad keypad = Keypad( makeKeymap(clavier), rowPins, colPins, ROWS, COLS); // Créé une variable de nom keypad de la fonction Keypad 

//simpleMinuteur temps;
bool entree = false; 
bool ouvre = false;


/*****************************************************************************************************************************************
  CONFIGURATION CARTE ARDUINO UNO
*****************************************************************************************************************************************/
void setup() {

  Serial.begin(9600);
  SPI.begin(); // Met les broches SLCK, MOSI et SS en sortie, met SCLK et MOSI au niveau bas et SS au niveau haut
  mrfc.PCD_Init(); // Initialise le capteur D'empreinte digitale



  pinMode(relais, OUTPUT);
  pinMode(A0, INPUT_PULLUP);


  keypad.addEventListener(keypadEvent); // Créé un événement de nom keypadEvent si le clavier est utilisé 
}

/*****************************************************************************************************************************************
  Programme Principal
*****************************************************************************************************************************************/
void loop()
{
  
  int singal = digitalRead(6);
  keypad.getKey();

  if (! mrfc.PICC_IsNewCardPresent())               //Si il n'y a pas de carte
  {
    return;                                         //attendre
  }
  if (! mrfc.PICC_ReadCardSerial())                 //Si la carte n'est pas lu dans le moniteur
  {
    return;                                         //attendre
  }
  Serial.print("Code du badge :");                  //afficher code du badge :
  String contenu = "";
  byte lettre;                                        //uid = code du badge
  for (byte i = 0; i < mrfc.uid.size; i++)            //mrfc.uid.size = Taille du code en HEX
  {
    Serial.print(mrfc.uid.uidByte[i] < 0x10 ? "0" : " ");
    Serial.print(mrfc.uid.uidByte[i], HEX);           //Envoie le code HEX du badge utilisé
    contenu.concat(String(mrfc.uid.uidByte[i] < 0x10 ? "0" : " "));
    contenu.concat(String(mrfc.uid.uidByte[i], HEX)); //Sauvegarde le code sous contenu
  }
  Serial.println();
  Serial.print("Message : ");
  contenu.toUpperCase();
  if (contenu.substring(1) == "940E 6D 1E" || contenu.substring(1) == "60 E8 A7 C3")    //Si le code est bon
  {
    Serial.println("Accès autorisé");           //Afficher accès autorisé
    Serial.println();
    entree = true;
    delay(10);
  }
  else                                          //Si le code est mauvais
  {
    Serial.println("Accès refusé");             //Afficher Accès refusé
    entree = false;
    delay(10);
  }

  if (entree == true) {  // Dévérouille la gâche
    digitalWrite(relais, HIGH);
    delay(10);
    digitalWrite(relais, LOW);
  }
  
}

/*****************************************************************************************************************************************
  Fonction keypadEvent() : Sous-Programme qui attribue à la touche '*' la fonction de vérifier le mot de passe
  et à la touche '#' d'effacer
*****************************************************************************************************************************************/
void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      Serial.println(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': pwd.reset(); break;
        default: pwd.append(eKey);
      }
  }
}

/*****************************************************************************************************************************************
  Fonction checkPassword() : Sous-Programme qui vérifie si le code est bon
  et bloque l'utilisation pendant un temps déterminé si on rate le code 3 fois
*****************************************************************************************************************************************/
void checkPassword() {
  if (pwd.evaluate()) {
    Serial.println("Code bon");
    nbCodeMauvais = 0;
    ouvre = true;
    pwd.reset();

  } else {
    Serial.println("Code mauvais");
    ouvre = false;
    nbCodeMauvais++;
    Serial.print( "Nb Code : ");
    Serial.println(nbCodeMauvais);
    if (nbCodeMauvais == 3)
    { Serial.println("Code bloqué");
      delay(5000);
      nbCodeMauvais = 0;
      Serial.println("Code débloqué");
    }
    pwd.reset();
  }

  if (ouvre == true) {  // Dévérouille la gâche
    digitalWrite(relais, HIGH);
    delay(10);
    digitalWrite(relais, LOW);
  }
}

Programme_Controle_d_Acces.ino (6.96 KB)

Déjà, je pense que tu dois avoir un problème ici :

if (contenu.substring(1) == "940E 6D 1E" || contenu.substring(1) == "60 E8 A7 C3")

Il doit manquer un espace.

A quoi sert cette ligne ?

int singal = digitalRead(6);

Pour trouver ce qui provoque le délai, ajoute des Serial.print pour suivre l'exécution de ton code.

  if (entree == true) {  // Dévérouille la gâche
    digitalWrite(relais, HIGH);
    delay(10);
    digitalWrite(relais, LOW);
  }
  if (ouvre == true) {  // Dévérouille la gâche
    digitalWrite(relais, HIGH);
    delay(10);
    digitalWrite(relais, LOW);
  }

tu peux également ne faire qu'une fonction d'ouverture qui regroupe les 2 actuelles qui en plus utilise 2 variables différentes.
Augmente aussi le temps de ton delay, 10ms c'est vraiment court même juste pour entendre quelque chose bouger!

Ok merci je vais fusionner les deux fonctions en une et je vais ajouter des Serial.print pour trouver la cause du délai.

Pour la variable "singal" il s'agit de l'état de la gâche.

La pin 6 est connectée au clavier...

Ah oui effectivement

Bouyou:
Ok merci je vais fusionner les deux fonctions en une et je vais ajouter des Serial.print pour trouver la cause du délai.

Si tu as l'IDE en version 1.8.9 ou ultérieure, tu peux horodater les print dans la console, ce qui permet de suivre plus facilement le déroulement temporel du code

J'ai la version 1.8.10 donc je peux le faire mais je sais pas comment "horodater les prints dans la console" donc si tu peux m'expliquer comment faire ?

Bonjour,

Dans le terminal en bas à gauche tu as une case à cocher "Afficher l'horodatage"

Ok merci

Bonjour
J’ai fais tout les changements et j’ai remarqué que c’est mon relais qui provoque un “délai”, mais je vois pas dans mon code la raison de ce “délai”.

(J’ai pas encore fusioné les variables “entree” et “ouvre”)

/*****************************************************************************************************************************************
  BIBLIOTHEQUES UTILISEES
*****************************************************************************************************************************************/
#include <Keypad.h> // Bibliothèque pour le clavier
#include <Password.h> // Bibliothèque pour le mot de passe
#include <SPI.h> // Bibliothèque pour le capteur RFID
#include <MFRC522.h> // Bibliothèque pour le capteur RFID

/*****************************************************************************************************************************************
  DEFINITION DES NUMERO DE BROCHE UTILISES
*****************************************************************************************************************************************/
#define relais A0

#define SDA_PIN 10
#define RST_PIN 9

/*****************************************************************************************************************************************
  DEFINITION D'UN OBJET ("Variable") DE TYPE MFRC522
*****************************************************************************************************************************************/
MFRC522 mrfc(SDA_PIN, RST_PIN); // Affection des broches

/*****************************************************************************************************************************************
  DEFINITION D'UN OBJET ("Variable") DE TYPE PASSWORD
*****************************************************************************************************************************************/
Password pwd = Password("1234"); // Définit le mot de passe

/*****************************************************************************************************************************************
  DEFINITION DES VARIABLES et Initialisation
*****************************************************************************************************************************************/
int nbCodeMauvais = 0;

const byte ROWS = 4; // 4 Ligne
const byte COLS = 3; // 3 Colonne

char clavier[ROWS][COLS] = { // Définit les symboles sur les boutons du clavier
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {8, 7, 2, 3}; // Broche pour les lignes
byte colPins[COLS] = {4, 5, 6}; // Broche pour les colonnes 

Keypad keypad = Keypad( makeKeymap(clavier), rowPins, colPins, ROWS, COLS); // Créé une variable de nom keypad de la fonction Keypad 

bool entree = false; 
bool ouvre = false;


/*****************************************************************************************************************************************
  CONFIGURATION CARTE ARDUINO UNO
*****************************************************************************************************************************************/
void setup() {

  Serial.begin(9600);
  SPI.begin(); // Met les broches SLCK, MOSI et SS en sortie, met SCLK et MOSI au niveau bas et SS au niveau haut
  mrfc.PCD_Init(); // Initialise le capteur D'empreinte digitale



  pinMode(relais, OUTPUT);
  pinMode(A3, INPUT_PULLUP);


  keypad.addEventListener(keypadEvent); // Créé un événement de nom keypadEvent si le clavier est utilisé 
}

/*****************************************************************************************************************************************
  Programme Principal
*****************************************************************************************************************************************/
void loop()
{
  int singal = digitalRead(A3);
  keypad.getKey();


  if (! mrfc.PICC_IsNewCardPresent())               //Si il n'y a pas de carte
  {
    //Serial.println("Pas de carte");
    return;                                         //attendre
  }
  if (! mrfc.PICC_ReadCardSerial())                 //Si la carte n'est pas lu dans le moniteur
  {
    Serial.println("Carte non connue");
    return;                                         //attendre
  }
  Serial.print("Code du badge :");                  //afficher code du badge :
  String contenu = "";
  byte lettre;                                        //uid = code du badge
  for (byte i = 0; i < mrfc.uid.size; i++)            //mrfc.uid.size = Taille du code en HEX
  {
    Serial.print(mrfc.uid.uidByte[i] < 0x10 ? "0" : " ");
    Serial.print(mrfc.uid.uidByte[i], HEX);           //Envoie le code HEX du badge utilisé
    contenu.concat(String(mrfc.uid.uidByte[i] < 0x10 ? "0" : " "));
    contenu.concat(String(mrfc.uid.uidByte[i], HEX)); //Sauvegarde le code sous contenu
  }
  Serial.println();
  Serial.print("Message : ");
  contenu.toUpperCase();
  if (contenu.substring(1) == "940E 6D 1E" || contenu.substring(1) == "60 E8 A7 C3")    //Si le code est bon
  {
    Serial.println("Accès autorisé");           //Afficher accès autorisé
    Serial.println();
    entree = true;
  }
  else                                          //Si le code est mauvais
  {
    Serial.println("Accès refusé");             //Afficher Accès refusé
    entree = false;
  }

  if (entree == true) {  // Dévérouille la gâche
    Serial.println("Porte ouverte");
    digitalWrite(relais, HIGH);
    delay(1000);
    digitalWrite(relais, LOW);
  }
}

/*****************************************************************************************************************************************
  Fonction keypadEvent() : Sous-Programme qui attribue à la touche '*' la fonction de vérifier le mot de passe
  et à la touche '#' d'effacer
*****************************************************************************************************************************************/
void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      Serial.println(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': pwd.reset(); break;
        default: pwd.append(eKey);
      }
  }
}

/*****************************************************************************************************************************************
  Fonction checkPassword() : Sous-Programme qui vérifie si le code est bon
  et bloque l'utilisation pendant un temps déterminé si on rate le code 3 fois
*****************************************************************************************************************************************/
void checkPassword() {
  if (pwd.evaluate()) {
    Serial.println("Code bon");
    nbCodeMauvais = 0;
    ouvre = true;
   
    pwd.reset();

  } else {
    Serial.println("Code mauvais");
    ouvre = false;
    nbCodeMauvais++;
    Serial.println ("Mauvais");
    Serial.print (nbCodeMauvais);
    if (nbCodeMauvais == 3)
    { Serial.println("Code bloqué");
      delay(5000);
      nbCodeMauvais = 0;
      Serial.println("Code débloqué");
    }
    pwd.reset();
  }
   if (ouvre == true) {  // Dévérouille la gâche
    Serial.println ("C'est OUvert");
    digitalWrite(relais, HIGH);
    delay(1000);
    digitalWrite(relais, LOW);
  }
}

Tu n'as pas modifié ceci

if (contenu.substring(1) == "940E 6D 1E" || contenu.substring(1) == "60 E8 A7 C3")

qui devrait être celà :

if (contenu.substring(1) == "94 0E 6D 1E" || contenu.substring(1) == "60 E8 A7 C3")

Peux-tu expliquer plus précisément ce que tu appelles "un délai de 2 secondes qui apparaît" ?
Dans quelles circonstances précises apparaît ce délai et comment le remarques-tu ?

Bonjour
J'ai réussis à résoudre le problème parce que j'avais oublié de mettre des "ouvre=false" ou "entree=false" et maintenant il n'y a plus aucun problème.