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 .