Essayez ce code (j'ai essayé de "deviner" les UID des cartes que vous aviez mais rien de garanti).
J'ai mis les cartes connues dans un tableau de structures, ça permet de simplifier le code.
Pour comparer 2 cartes j'utilise la fonction memcmp() qui va comparer les octets en mémoire directement et répond 0 si les 2 zones mémoires sont identiques (➜ pas la peine de passer par une String).
#include <MFRC522.h>
const byte pinSS = 10;
const byte pinRST = 9;
MFRC522 mfrc522(pinSS, pinRST);
const byte pinBouton = 2;
const byte pinRelaiSerrure = 6;
const byte pinHautParleur = 7;
const byte pinLedBleue = A0;
const byte pinLedVerte = A1;
const byte pinLedRouge = A2;
struct {
const char* nom; // le nom du badge
const MFRC522::Uid badge; // les informations du badge (sous forme {taille,{UID}, 0})
} cartesConnues[] = {
{"Carte Blanche #1", {4, {169, 27, 176, 178}, 0}},
{"Bip Pompier", {4, {243, 162, 220, 33}, 0}},
{"Carte Blanche #2", {4, { 57, 76, 90, 228}, 0}},
{"Porte clef #1", {4, { 90, 252, 241, 129}, 0}},
{"Porte clef #2", {4, { 89, 51, 81, 193}, 0}},
{"Pass", {4, { 82, 47, 182, 210}, 0}},
};
const byte nombreDeCartesConnues = sizeof cartesConnues / sizeof cartesConnues[0];
// ---- La gestion du bouton ----
void ouvertureParBouton() {
digitalWrite(pinLedRouge, LOW);
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedBleue, HIGH);
digitalWrite(pinRelaiSerrure, HIGH);
delay(3000); // attente
digitalWrite(pinLedRouge, LOW);
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedBleue, LOW);
digitalWrite(pinRelaiSerrure, LOW);
}
bool testBouton() { // retourne true si le bouton a été appuyé
bool appui = false;
if (digitalRead (pinBouton) == LOW) { // test appui du Bouton
ouvertureParBouton();
while (digitalRead (pinBouton) == LOW); // attente relâche du Bouton
delay(20); // anti rebond
appui = true;
}
return appui;
}
// ---- La gestion par carte ----
void imprimeCarte(const MFRC522::Uid& badge) {
for (byte i = 0; i < badge.size; i++) {
Serial.print(badge.uidByte[i]); Serial.write(' ');
}
Serial.println();
}
void ouvertureParCarte() {
digitalWrite(pinLedRouge, LOW);
digitalWrite(pinLedVerte, HIGH);
digitalWrite(pinRelaiSerrure, HIGH);
tone(pinHautParleur, 523, 50); delay(50);
tone(pinHautParleur, 783, 50); delay(50);
tone(pinHautParleur, 1046, 50); delay(50);
tone(pinHautParleur, 1568, 50); delay(50);
tone(pinHautParleur, 2093, 70); delay(70);
delay(3000); // attente
digitalWrite(pinRelaiSerrure, LOW);
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedRouge, HIGH);
}
int testCarte() { // retourne l'index de la bonne carte si une carte connue a été présenté, sinon -1
int carteReconnue = -1; // -1 pour carte inconnue
// test présence d'une carte
if ( ! mfrc522.PICC_IsNewCardPresent()) return -1;
if ( ! mfrc522.PICC_ReadCardSerial()) return -1;
MFRC522::Uid carteActuelle = mfrc522.uid;
mfrc522.PICC_HaltA();
// on compare la carte lue aux cartes connues
for (int p = 0; p < nombreDeCartesConnues; p++) {
if ((carteActuelle.size == cartesConnues[p].badge.size) && (memcmp(carteActuelle.uidByte, cartesConnues[p].badge.uidByte, carteActuelle.size) == 0)) {
carteReconnue = p;
break;
}
}
if (carteReconnue < 0) {
Serial.print(F("Carte Inconnue: "));
imprimeCarte(carteActuelle);
} else {
Serial.print(F("Nom = ")); Serial.println(cartesConnues[carteReconnue].nom);
ouvertureParCarte();
}
return carteReconnue;
}
// ---- Le corps du programme ----
void setup() {
pinMode(pinBouton, INPUT_PULLUP);
pinMode(pinHautParleur, OUTPUT);
pinMode(pinLedRouge, OUTPUT);
pinMode(pinLedVerte, OUTPUT);
pinMode(pinLedBleue, OUTPUT);
pinMode(pinRelaiSerrure, OUTPUT);
Serial.begin(115200); Serial.println();
SPI.begin();
mfrc522.PCD_Init(); delay(4); // certaines cartes ont besoin d'un petit délai pour s'initialiser
digitalWrite(pinLedRouge, HIGH); // on est prêt
}
void loop() {
testBouton();
testCarte();
}
J'ai tapé cela ici un peu au kilomètre (je suis sur mon iPhone), je n'ai donc pas essayé de compiler ni encore moins testé si ça fonctionne.... Mais ça peut vous donner des idées au moins pour rendre votre code plus compact et lisible.
(le moniteur série doit être à 115200 bauds pour voir les messages)