Bonjour,
je suis en train de faire un projet de serrure de porte (on peut en voir pleins partout je sais...je suis désolé...) je me suis inspiré de codes existant, de vidéos et de réponses que j'ai pue trouver sur différents topics et forum. J'en suis à là: (voir code ci dessous).
Le concept, ouvrir l'électroaimant (pour une porte) lorsqu'un badge autorisé est passé devant le lecteur (c'est du RFID mais je passerais plus tard sur du NFC avec ce shield: celui là chez gotronic (mais c'est un autre soucis je m'en occuperais)
#include <SPI.h> //bibliothèques
#include <MFRC522.h> //**
#define RST_PIN 9 //pin reset RC522
#define SS_PIN 10 //pin SS RC522
const int Buzzer = 2; //pin du buzzer sur breadboard
const int LedR = 3; //pin de la Led rouge sur breadboard
const int LedV = 4; //pin de la Led verte sur breadboard
const int Electroaimant = 5; //pin de l'éléctroaimant (serrure via un relay) sur breadboard
int etatLedR = LOW; //etat de base lors de l'initialisation
int etatLedV = LOW; //**
int etatElectroaimant = LOW; //**
MFRC522 monRFID(SS_PIN, RST_PIN); //RC522 initialisation
void setup() {
pinMode(Buzzer, OUTPUT); //pin Mode :
pinMode(LedR, OUTPUT); //**
pinMode(LedV, OUTPUT); //**
pinMode(Electroaimant, OUTPUT); //**
SPI.begin(); //initialisation SPI
monRFID.PCD_Init(); //RFID initialisation
Serial.begin(9600); //Com Série à 9600 baud
digitalWrite(LedR, etatLedR); //mise à l'état de base
digitalWrite(LedV, etatLedV); //**
digitalWrite(Electroaimant, etatElectroaimant); //**
tone(Buzzer, 800, 50); //bip d'initialisation Ok et passage à la boucle loop()
delay(100); //**
tone(Buzzer, 800, 50); //**
}
void loop() {
if ( ! monRFID.PICC_IsNewCardPresent()) //Si Carte ou Badge RFID détécté
{
return;
}
if ( ! monRFID.PICC_ReadCardSerial()) //Si carte ou Badge RFID correctement lue
{
return;
}
String UID = "";
for (byte i = 0; i < monRFID.uid.size; i++)
{
UID.concat(String(monRFID.uid.uidByte[i] < 0x10 ? " 0" : " ")); //"mise en page" en format HEX de l'UID
UID.concat(String(monRFID.uid.uidByte[i], HEX)); //**
}
UID.toUpperCase();
if (UID.substring(1) == "97 F7 1E 39") //Code d'accès autorisé
{
digitalWrite(LedV, HIGH); //allumer LED Verte
digitalWrite(Electroaimant, HIGH); //ouvrir serrure
tone(Buzzer, 1200, 100); //Bip content
delay(125); //** (à voir pour changer delay(125); par millis())
tone(Buzzer, 1800, 100); //**
delay(3000); //attente 3secondes (à remplacer plus tard par la fonction millis())
digitalWrite(LedV, LOW); //RàZ
digitalWrite(Electroaimant, LOW); //**
}
else //Code d'accès refusé
{
digitalWrite(LedR, HIGH); //allumer LED Rouge
tone(Buzzer, 600, 100); //Bip méchant
delay(125); //** (à voir pour changer delay(125); par millis())
tone(Buzzer, 400, 100); //**
delay(1000); //attente 1 secondes (à remplacer plus tard par la fonction millis())
digitalWrite(LedR, LOW);
}
}
Donc j'ai ce code
Le soucis: j'aimerais pouvoir gérer l'accès de différents badge pas que d'un seul je me suis donc intéressé aux tableaux avec ce code (fonctionnel) si dessous:
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10 //Arduino Uno
#define RST_PIN 9
byte tagok = 0;
unsigned long sernum[11] = {0, 1669538043, 4062424836, 958330775, 0, 0, 0, 0, 0,0, 2671698952}; //poste 0 N° carte lue, poste 1 à 9 pour UID carte a tester, poste 10 carte master
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522::MIFARE_Key key;
int led = 3;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println("SERIAL OK ");
}
void loop() {
digitalWrite(led, LOW);
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) return;
Serial.print("Card UID:"); //Dump UID
for (byte i = 0; i < 4; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
Serial.print(" ");
Serial.print(sernum[0]);
Serial.print(" ");
Serial.print(sernum[0], HEX);
Serial.print(" ");
tagok = 0;
for (byte i = 1; i < 10; i++) {
if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
}
if (sernum[0] == sernum[10]) tagok = 255; // carte master reconnue
if (tagok == 0) { // faire si carte inconnue
Serial.print("TAG INCONNU");
}
if (tagok >0) //faire si carte reconnue
{
digitalWrite(led, HIGH);
Serial.print("TAG OK ");
if (sernum[0] == sernum[1]) Serial.print("Badge STOCK " );
if (sernum[0] == sernum[2]) Serial.print("Badge LABO " );
if (sernum[0] == sernum[3]) Serial.print("Bramble card OK " );
if (sernum[0] == sernum[4]) Serial.print("Badge ANECHO " );
if (sernum[0] == sernum[10]) Serial.print("Badge MASTER " );
delay(50);
digitalWrite(led, LOW);
}
if (tagok == 255) //faire si carte master reconnue
{
Serial.print("CARTE MASTER RECONNUE");
}
Serial.println();
mfrc522.PICC_HaltA(); // Halt PICC
}
(code récupéré sur un topic: celui là, lien vers forum.arduino.cc)
donc jusqu'à là aucun soucis, mais j'aimerais, et je ne sais pas si c'est possible, qu'au passage d'un badge "admin ajout d'un accès", mes LEDs clignotent et que l'Arduino reste en attente d'un nouveau badge à scanner pour lui autoriser l'accès.
Et qu'au passage d'un badge "admin suppression d'un accès", mes LEDs clignotent et que l'Arduino reste en attente du badge à supprimer son accès.
Donc je ne sais pas comment faire... mais faudrait une taille de tableau variable (des accès autorisé) qu'il puisse stocker en lui les accès autorisés et en supprimer en fonction du type de badge admin scanné
Merci d'avance si quelqu'un à une solution
PS: j'espère avoir posté au bon endroit