Utilisation bouton poussoir

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)