Utiliser un verrou ou un servo moteur avec un système de sécurité RFID et un keypad

Salut je me présente je suis étudiantt en informatique je m'interresse depuis un certain temps à Arduino j'ai quelque projet a mon actif réaliser en parfaite autonomie.

Si je crée ce canal de discussion c'est tout simplement pour regrouper des gens afin de s'entraider pour réussir a finaliser son projet ou tout simplement partager des connaissances. :grinning:

Je suis actuellement en train de travailler sur un projet de système de verrouillage de porte.

Le but est simple utiliser le système RFID pour dévérouiller un verrou pas un cerveau moteur mais un verrou de type porte coupe feu (à ma disposition) , tout le partie programmation est bonne a un seul point je veut rajouter un système de mot de passe mais j'arrive a le programmer et à le faire Fonctionner en dehors du code principale mais des que j'essaye de l'incrémenter alors la plus rien ne marche

Programme pour le principale avec Le RFID

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

#define SS_PIN 10
#define RST_PIN 9
#define red_led 7
#define green_led 6
#define yellow_led 5
String UID = "2D C0 57 59";
byte lock = 0;
boolean RFIDMode = true; // boolean to change modes
char initial_password[4] = {'1', '2', '3', '4'}; // Variable pour stocker le mot de passe initial
char password[4]; // Variable qui stock le mot de passe de l'utilisateur 
char key_pressed = 0; // Variable qui sauvegarde les touche du clavier
uint8_t i = 0; // Variable utiliser pour compter

// definition du nombre de ligne et de colone du clavier 
const byte rows = 4;
const byte columns = 4;

// initalisation du schéma du clavier 
char hexaKeys[rows][columns] = {
{'7','8','9', 'D'},
{'4','5','6', 'E'},
{'1','2','3', 'F'},
{'A','0','B', 'C'}
};

// Initialisation des pin du clavier
byte row_pins[rows] = {0, 1, 2, 3};
byte column_pins[columns] = {A0, A1, A2, A3};

Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);

Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);


void setup() {
  Serial.begin(9600);
  servo.write(70);
  lcd.init();
  lcd.backlight();
  servo.attach(8);
  SPI.begin();
  rfid.PCD_Init();
  pinMode(red_led, OUTPUT);
  pinMode(green_led, OUTPUT);
  pinMode(yellow_led,OUTPUT);
}

void loop() {
  if (RFIDMode == true) {
  lcd.setCursor(4, 0);
  lcd.print("BIENVENUE!");
  lcd.setCursor(1, 1);
  lcd.print("Scanner votre badge");
  }

  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Verification");
  Serial.print("NUID tag is :");
  String ID = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    lcd.print(".");
    ID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    ID.concat(String(rfid.uid.uidByte[i], HEX));
    delay(300);
  }
  ID.toUpperCase();

  if (ID.substring(1) == UID && lock == 1 ) {
    servo.write(160);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Porte ouverte");
     digitalWrite(green_led, HIGH);
    delay(2000);
    digitalWrite(green_led, LOW);
    lcd.clear();
    lock = 0;
  } else if (ID.substring(1) == UID && lock == 0 ) {
    servo.write(70);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Porte verrouillee");
    digitalWrite(yellow_led, HIGH);
    delay(1000);
    digitalWrite(yellow_led, LOW);
    lcd.clear();
    lock = 1;
  } else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvais badge!");
     digitalWrite(red_led, HIGH);
    delay(1000);
    digitalWrite(red_led, LOW);
    lcd.clear();
  }
}

Programme du mot de passe

#include <Keypad.h>
int compteur =0; // Permet de compte le nombre de touche appuyée
// Définit les 2 leds 
const int led_rouge = 7; 
const int led_verte = 6; 
const byte Ligne = 4; // 4 lignes sur le digicode
const byte Colonne = 4; // 4 colonnes sur le digicode
// Définit maintenant les symboles correspondant à chaque bouton
char hexaBouton[Ligne][Colonne] = {
  {'7','8','9','D'},
  {'4','5','6','E'},
  {'1','2','3','F'},
  {'A','0','B','C'}
};
char code[5]; // Contient les touches tapées par l'utilisateur
byte Ligne_Pins[Ligne] = {0, 1, 2, 3}; // Connecte la ligne du digicode 
byte Colonne_Pins[Colonne] = {A0, A1, A2, A3}; // Connecte la colonne du digicode 
//int compteur =0;
// Initialise la librairie avec nos paramètres (la taille de la matrice et symboles)
Keypad mon_keypad = Keypad( makeKeymap(hexaBouton), Ligne_Pins, Colonne_Pins, Ligne, Colonne); 

void setup(){
  pinMode(led_rouge,OUTPUT); // La led rouge est en sortie
  pinMode(led_verte,OUTPUT); // La led verte est en sortie
  digitalWrite(led_rouge, HIGH); // Met par défaut la led car le coffre est verouillé par défaut
}
  
void loop(){
  char keypad_matrix = mon_keypad.getKey(); // Récupère la touche appuyé
  if (keypad_matrix){ // Si une touche est appuyée
    code[compteur] =keypad_matrix; // Met la valeur dans la liste
    compteur+=1; // Incrémente pour que l'on se déplace dans la liste des valeurs
    if (keypad_matrix =='A'){// Si on appuie sur A, on réintialise les valeurs
      compteur=0;
    }
    if (compteur ==5){ // Si on a 4 valeurs, on vérifie si le code est bon sinon on remet le compteur à 0
      if (code[0] =='0' && code[1] =='1' && code[2] =='2' && code[3] =='3' && code[4] =='D'){ // Si le code est bon
        digitalWrite(led_rouge, LOW); // Eteint la led rouge
        digitalWrite(led_verte, HIGH); // Allume la led verte
      }
      
      if (code[0] !='0' || code[1] !='1' || code[2] !='2' || code[3] !='3' && code[4] =='D'){ // Si le code n'est pas bon
        digitalWrite(led_verte, LOW); // Eteint la led verte si elle était allumée
       // Fait clignoter la led rouge
        digitalWrite(led_rouge, LOW);
         delay(500);
         digitalWrite(led_rouge, HIGH);
         delay(500);
           }
      compteur=0; // Rétablit le compteur à 0 si l'utilisateur veut retenter sa chance
      }
  }
}

Pour toute information complémentaire composant utilisé etc je suis la pour vous répondre .

Bienvenue (les présentations c'est généralement ici)

c'est un peu l'objectif de tout le forum... pas que de votre post :slight_smile:

j'ai deux tutos qui pourraient vous aider:

1 Like

Voici toute la config de mon projet ainsi que le verrou que j'utilise.


Au niveau de l'affectation des PIN Tout est notifier dans le programme mon seul problème est que j'arrive pas à enclencher le verrou.
Pour être connecter au verrou j'ai affecter un un port de l'arduino (PIN 8 ainsi que le GND qui se trouve la où il y a les led.
Voici le schéma qui montre comment j'ai fais le sorte de petit montage pour me connecter au verrou.

Voilà le programme que j'utilise tout marche au niveau RFID communication sauf avec le verrou je pense que cela viens du programme du fait que je ne suis pas très bon en programmation.

#include <Password.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

#define SS_PIN 10
#define RST_PIN 9
#define red_led 7
#define green_led 6
#define yellow_led 5
String UID = "2D C0 57 59";
byte lock = 0;
boolean RFIDMode = true; // boolean to change modes
char initial_password[4] = {'1', '2', '3', '4'}; // Variable pour stocker le mot de passe initial
char password[4]; // Variable qui stock le mot de passe de l'utilisateur 
char key_pressed = 0; // Variable qui sauvegarde les touche du clavier
uint8_t i = 0; // Variable utiliser pour compter
const int verrou = 8; 
int verrouStat = 0; 
// definition du nombre de ligne et de colone du clavier 
const byte rows = 4;
const byte columns = 4;

// initalisation du schéma du clavier 
char hexaKeys[rows][columns] = {
{'7','8','9', 'D'},
{'4','5','6', 'E'},
{'1','2','3', 'F'},
{'A','0','B', 'C'}
};

// Initialisation des pin du clavier
byte row_pins[rows] = {0, 1, 2, 3};
byte column_pins[columns] = {A0, A1, A2, A3};

Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);


void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  SPI.begin();
  rfid.PCD_Init();
  pinMode(red_led, OUTPUT);
  pinMode(green_led, OUTPUT);
  pinMode(yellow_led,OUTPUT);
  pinMode(verrou,INPUT); 
}

void loop() {
  if (RFIDMode == true) {
  lcd.setCursor(4, 0);
  lcd.print("BIENVENUE!");
  lcd.setCursor(1, 1);
  lcd.print("Scanner votre badge");
  }

  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Verification");
  Serial.print("NUID tag is :");
  String ID = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    lcd.print(".");
    ID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    ID.concat(String(rfid.uid.uidByte[i], HEX));
    delay(300);
  }
  ID.toUpperCase();

  if (verrouStat ==LOW) {
    digitalWrite(verrou,LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Porte ouverte");
     digitalWrite(green_led, HIGH);
    delay(2000);
    digitalWrite(green_led, LOW);
    lcd.clear();
    lock = 0;
  } else if (verrouStat == HIGH) {
    digitalWrite(verrou,HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Porte verrouillee");
    digitalWrite(yellow_led, HIGH);
    delay(1000);
    digitalWrite(yellow_led, LOW);
    lcd.clear();
    lock = 1;
  } else {
    digitalWrite(verrou,HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Mauvais badge!");
     digitalWrite(red_led, HIGH);
    delay(1000);
    digitalWrite(red_led, LOW);
    lcd.clear();
  }
}

J'ai reussi a trouver la solution à mon propre problème.
Si vous voulez essayez de faire le même projet que moi je pourrais vous aiguillez par contre vous devrez utilisez un cervo moeur et non un verrou que vous n'aurais surement pas chez vous.

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

#define SS_PIN 10
#define RST_PIN 9
#define red_led 7
#define green_led 6
#define yellow_led 5
#define mode_button 4

String UID = "2D C0 57 59"; // UID du badge autorisé
boolean RFIDMode = true; // booléen pour changer de mode
boolean RFIDValidated = false; // booléen pour vérifier si le scan RFID a été validé
char initial_password[5] = {'0', '1', '2', '3', 'D'}; // Mot de passe initial
char password[5] = {'\0'}; // Variable pour stocker le mot de passe de l'utilisateur
char key_pressed = 0; // Variable pour sauvegarder la touche appuyée du clavier
uint8_t i = 0; // Compteur
const int verrou = 8; 
int compteur = 0; // Compteur pour les touches du clavier

// définition du nombre de lignes et de colonnes du clavier 
const byte rows = 4;
const byte columns = 4;

// initialisation du schéma du clavier 
char hexaKeys[rows][columns] = {
  {'7', '8', '9', 'D'},
  {'4', '5', '6', 'E'},
  {'1', '2', '3', 'F'},
  {'A', '0', 'B', 'C'}
};

// Initialisation des pins du clavier
byte row_pins[rows] = {0, 1, 2, 3};
byte column_pins[columns] = {A0, A1, A2, A3};

Keypad mon_keypad = Keypad(makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  SPI.begin();
  rfid.PCD_Init();
  pinMode(red_led, OUTPUT);
  pinMode(green_led, OUTPUT);
  pinMode(yellow_led, OUTPUT);
  pinMode(verrou, OUTPUT);
  pinMode(mode_button, INPUT_PULLUP); // Bouton pour changer de mode
  digitalWrite(red_led, HIGH); // Verrouillé par défaut
  digitalWrite(verrou, HIGH); // Verrou fermé par défaut
}

void loop() {
  if (digitalRead(mode_button) == LOW) {
    RFIDMode = !RFIDMode;
    RFIDValidated = false; // Réinitialise la validation RFID lorsque le mode change
    delay(500); // Debounce delay
  }

  if (RFIDMode) {
    lcd.setCursor(4, 0);
    lcd.print("BIENVENUE!");
    lcd.setCursor(1, 1);
    lcd.print("Scanner badge");

    if (!rfid.PICC_IsNewCardPresent()) return;
    if (!rfid.PICC_ReadCardSerial()) return;

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Verification");
    Serial.print("NUID tag is : ");
    String ID = "";
    for (byte i = 0; i < rfid.uid.size; i++) {
      if (rfid.uid.uidByte[i] < 0x10) {
        ID += "0";
      }
      ID += String(rfid.uid.uidByte[i], HEX);
      if (i < rfid.uid.size - 1) {
        ID += " ";
      }
    }
    ID.toUpperCase();
    Serial.println(ID);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ID lue: ");
    lcd.setCursor(0, 1);
    lcd.print(ID);

    delay(2000); // Afficher l'ID lue pendant 2 secondes

    if (ID == UID) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Carte OK!");
      digitalWrite(green_led, HIGH);
      delay(2000);
      digitalWrite(green_led, LOW);
      lcd.clear();
      RFIDValidated = true; // Marquer la validation RFID
      RFIDMode = false; // Changer de mode pour demander le mot de passe
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Mauvais badge!");
      digitalWrite(red_led, HIGH);
      delay(1000);
      digitalWrite(red_led, LOW);
      lcd.clear();
    }
  } else {
    if (RFIDValidated) {
      lcd.setCursor(0, 0);
      lcd.print("Entrez le code:");
      char keypad_matrix = mon_keypad.getKey(); // Récupère la touche appuyée
      if (keypad_matrix) { // Si une touche est appuyée
        password[compteur] = keypad_matrix; // Met la valeur dans la liste
        lcd.setCursor(compteur, 1);
        lcd.print('*'); // Affiche une étoile pour chaque touche appuyée
        compteur += 1; // Incrémente pour que l'on se déplace dans la liste des valeurs
        if (keypad_matrix == 'A') { // Si on appuie sur A, on réinitialise les valeurs
          compteur = 0;
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Entrez le code:");
        }
        if (compteur == 5) { // Si on a 5 valeurs, on vérifie si le code est bon sinon on remet le compteur à 0
          password[5] = '\0'; // Assurez-vous que la chaîne est terminée par un caractère nul
          if (strncmp(password, initial_password, 5) == 0) { // Si le code est bon
            digitalWrite(red_led, LOW); // Éteint la led rouge
            digitalWrite(green_led, HIGH); // Allume la led verte
            digitalWrite(verrou, LOW); // Déverrouiller
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Acces accorde!");
            delay(2000);
            digitalWrite(green_led, LOW);
            digitalWrite(verrou, HIGH); // Verrouiller à nouveau après un délai
            RFIDMode = true; // Retourner au mode RFID
            RFIDValidated = false; // Réinitialise la validation RFID
          } else { // Si le code n'est pas bon
            digitalWrite(green_led, LOW); // Éteint la led verte si elle était allumée
            // Fait clignoter la led rouge
            digitalWrite(red_led, LOW);
            delay(500);
            digitalWrite(red_led, HIGH);
            delay(500);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Mauvais code!");
            delay(2000);
          }
          compteur = 0; // Rétablit le compteur à 0 si l'utilisateur veut retenter sa chance
          memset(password, 0, sizeof(password)); // Réinitialiser le mot de passe
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Entrez le code:");
        }
      }
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Scanner badge");
      lcd.setCursor(0, 1);
      lcd.print("pour acceder");
      delay(1000);
      RFIDMode = true; // Retourner au mode RFID
    }
  }
}

Et Voilà le resultat vidéo pour vos yeux . :sunglasses:

ne postez pas un truc sur google drive

si c'est une vidéo, mettez la sur YouTube et postez le lien directement dans un message, la vidéo s'affichera ainsi dans le forum

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.