Malgré le rajout de la ligne de code même e attendant 1 bonne minutes je peux toujours pas représenter de carte
Recharges la version tel qu'elle est ici, chez moi elle fonctionne sans problème.
J'ai pourtant fais un copié /collé
Je te fais une version avec la section loop() un peu mieux "tournée", plus facile à debugger. C'est pour dans la soirée.
A+
Cordialement
jpbbricole
Merci beaucoup je vais regarder aussi de mon coté au cas-où
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)
N'étant plus chez moi je peux plus essayer mais déjà le programme se compile correctement
un bon début ![]()
A tester à l'occasion alors
j'ai modifié un peu le code pour grouper sous forme de fonctions, ça simplifie la lecture de la loop qui se réduit à une plus simple expression maintenant :
void loop() {
testBouton();
testCarte();
}
Bonsoir max_grd
Je vais renoncer, @J-M-L a mieux, je voulais faire à peu près la même chose, mais plus progressive.
Bonne continuation
Cordialement
jpbbricole
Pas forcément mieux, sans doute une approche différente. Ça donnerait d’autres pistes et des idées pour coder.
A tout hasard puisque vous avez le montage apparemment, vous avez pu tester mon code ?
Il se peut aussi que ce soit complètement buggué
Bonsoiu J-M-L
Je vais le tester.
Cordialement
jpbbricole
Merci - bonne soirée
Bonsoir J-M-L
Il fonctionne parfaitement, ce qui ne m'étonne pas du tout.
Bonne soirée
Cordialement
jpbbricole
Merci pour le test !
Le problème doit venir de moi alors puisque ça ne fonctionne toujours qu'une seule fois
Les fils de votre RFID sont assez longs et un assemblage (c’est pas génial). En plus ça passe à côté du champ magnétique de la gâchette donc vous avez peut être des perturbations ensuite
Je viens de réessayer en écartant les câbles et tout fonctionne parfaitement. Je vais je pense faire boitier de l'autre coté de la porte pour éviter les interférence.
Super nouvelle !
Prenez éventuelle un bout de câblé ethernet (cat5e) que vous coupez et dénudez juste au bout pour protéger un peu les fils (si vous avez un vieux câble qui traîne)
Si vous pouviez souder le tout ce serais aussi plus résistant
J'ai quelque pcb vide, et des gaines thermo je vais faire ça bien
Ok - plus que la gaine thermo ce serait du fil moins sensible aux perturbations externes qui serait pas mal, mais si vous déplacez le boîtier ça devrait aller.
