Utilisation bouton poussoir

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 :wink:
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.