Utilisation bouton poussoir

Bonjour,
J’essaye d’allumer une DEL avec un bouton poussoir, dans un code avec seulement ces lignes tous fonctionnent correctement mais lorsque je met le même code dans un autre pour contrôler une serrure la DEL s’allume toute seule. Pourtant même code, même branchement et la DEL ne s’allume que dans cette partie du code et si j’enlève la partie la DEL ne s’allume pas. Le simple fait d’être mis dans un plus grand code fait disfonctionner. Une idée ?
Arduino Uno
Photo du bouton :

Oui, et on est supposé deviner ce qui déconne sans rien voir.
Il y a des personnes balèzes ici, mais il y a des limites (sans vouloir les rabaisser).
Alors un peu de lecture avant d'aller plus loin

Sachant que je m’attends à une réponse me parlant plus du software que de l’hardware je voyais pas ce qui pouvait être utile en plus mais je vais envoyer le code si vous le souhaitez

Code fonctionnel :


void setup() {
  pinMode(A0, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(2))
    digitalWrite(A0, HIGH);
    delay(1000);
    digitalWrite(A0, LOW);
    delay(1000);
}

Code complet ne fonctionnant pas :

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);
String card_ID = "";

//Add as many cards you want
String Name1 = "16927176178";//carte blanche1
String Name2 = "24316222033";//bip pompier
String Name3 = "577690228";//carte blanche2
String Name4 = "90252241129";//porte clef1
String Name5 = "895181193";// porte clef2
String Name6 = "8247182210";//pass

int NumbCard[6];
int j = 0;
int statu[6];
int s = 0;

int redpin = A2; // select the pin for the red LED
int greenpin = A1; // select the pin for the green LED
int buzz = 7;
int serrure = 6;
int bouton = 2;
int bluepin = A0;
String Log;
String Name;
long Number;
int n ;
int ID = 1;
void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode (buzz, OUTPUT);
  pinMode (redpin, OUTPUT);
  pinMode (greenpin, OUTPUT);
  pinMode (bluepin, OUTPUT);
  pinMode(serrure, OUTPUT);
  pinMode (bouton, INPUT_PULLUP);
  analogWrite(redpin, LOW);
  analogWrite(greenpin, LOW);
  analogWrite(bluepin, LOW);
  digitalWrite(serrure, -255);
  digitalWrite(bouton, LOW);
  delay(200);

}

void loop() {
  digitalWrite(serrure, -1);
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  for (byte i = 0; i < mfrc522.uid.size; i++) {
    card_ID += mfrc522.uid.uidByte[i];
  }

  Serial.println(card_ID);

  if (card_ID == Name1) {
    Name = "First employee";
    Number = "79 DD 81 2F";
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if (card_ID == Name2) {
    Name = "Second employee";
    Number = 789101;
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if (card_ID == Name3) {
    Name = "Third employee";
    Number = 789101;
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if (card_ID == Name4) {
    Name = "Fourth employee";
    Number = 789101;
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if (card_ID == Name5) {
    Name = "Fiveth employee";
    Number = 789101;
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if (card_ID == Name6) {
    Name = "Sixth employee";
    Number = 789101;
    analogWrite(redpin, LOW);
    analogWrite(greenpin, 255);
    digitalWrite(serrure, HIGH);
    delay(200);
    tone(buzz, 523, 50);
    delay(50);
    tone(buzz, 783, 50);
    delay(50);
    tone(buzz, 1046, 50);
    delay(50);
    tone(buzz, 1568, 50);
    delay(50);
    tone(buzz, 2093, 70);
    delay(3000);
    digitalWrite(serrure, LOW);
  }
  else if ( !digitalRead (bouton)) {
    analogWrite(redpin, LOW);
    analogWrite(greenpin, LOW);
    analogWrite(bluepin, 255);
    digitalWrite(serrure, HIGH);
    delay(3000);
    analogWrite(redpin, LOW);
    analogWrite(greenpin, LOW);
    analogWrite(bluepin, LOW);
    digitalWrite(serrure, LOW);

  }
  else {
    analogWrite (greenpin, 0);
    digitalWrite (serrure, -255);
    analogWrite(redpin, 255);
    delay(200);
    tone(buzz, 370, 50);
    delay(100);
    tone(buzz, 370, 300);
    delay(3000);
    goto cont;
  }



cont:
  delay(2000);
  digitalWrite(greenpin, LOW);
  digitalWrite(redpin, LOW);
  card_ID = "";

}

Sachant que pour les branchement le bouton est relié à D2 et à GND, et que j'ai essayer pas mal d'autre code avec : digitalRead(bouton)==HIGH et LOW au cas où. J'ai aussi essayer de séparer le code en créant un void ouverture avec uniquement le code pour le bouton et aussi en mettant le bouton sur les pin analogique. Mais rien n'y fait lorsque je téleverse le code complet la DEL bleu s'allume et s'éteint comme si le bouton était activé non stop.

c'est quoi ça?

digitalWrite() prend HIGH ou LOW comme paramètre... (votre -1 ou -255 va devenir HIGH)

vous enchainez les if/else if donc si vous avez trouvé un bon card_ID vous ne testez pas le bouton

à quoi sert le goto cont; ?

Alors pour le -1 c’est la seule solution que j’ai trouvé en mettant LOW, HIGH, 0 la serrure reste ouverte et le -255 est ce que je mettais de base car cela fonctionnait aussi. Qu’est-ce qu’in bon card_id ? Et le goto count est simplement que le texte original vient d’un horodateur pour réguler l’accès comme on trouve dans des magasins pour pointer ses heures de travail et n’étant pas sûr de toute les parties qui sont utiles pour le rfid j’ai préféré le laisser vu que ça ne pose pas de réelle probléme

désolé mais c'est n'importe quoi. La fonction ne traite que 0 pour LOW et autre chose pour HIGH...

ce sont tous les tests que vous faites

if (card_ID == Name1) {
 ...
}
else if (card_ID == Name2) {
  ..
}
else if (card_ID == Name3) {

}
...
else if (card_ID == Name6) {
  ...
}

et là vous faites
else if ( !digitalRead (bouton)) { ➜ le test du bouton est dans un else-if donc ne se fait que si un des tests sur card_ID n'est pas vrai

Pour le -1 j’ai fait des tests et la seule fois où la serrure restait fermée c’était avec des chiffres négatifs, que ce soir 0, LOW, HIGH les 3 avaient le même résultat

Et oui du coup sans présenter aucune carte pour moi du coup l’état du bouton est ensuite chercher mais pareil peu importe le if, else if ou juste un autre void avec ce code mais le code s’active seul tout le temps

Le test pas vrai des card_id c’est si il ne détecte pas de carte ou si il détecte une carte qui n’est pas renseignée ?

Vous comprenez bien que c'est du grand n'importe quoi j'espère... L'informatique ce n'est pas de l'approximation ni de la magie noire, les choses sont normées et il faut respecter les APIs...

La fonction attend (sur un octet) HIGH ou LOW qui valent respectivement 1 et 0. Si vous passez autre chose que LOW sur l'octet de poids faible, la fonction telle que c'est codé considère que c'est HIGH...

Postez un schéma du câblage.

Croyez moi que j’aimerais ne pas avoir à faire à tâtons mais quand en mettant LOW la serrure s’ouvre puis quand je met HIGH la serrure s’ouvre exactement pareil j’ai pas vraiment compris la vie. J’ai même essayé de changer de relai (serrure 12v) et même résultat

c'est ce que j'appelle de la magie noire... En dehors de HIGH et LOW il n'y a rien d'autre, donc si vous avez un comportement erratique il vient d'ailleurs. Ce n'est pas la peine de vous acharner sur digitalWrite()...

Vous avez soit un souci d'alimentation, de GND, soit un bug dans le code...

J’essaye de vous faire un schéma écrit

Sérieusement vous pensez que c'est utilisable... (mais bon, bel effort quand même)

si je remets un peu les choses à l'endroit, c'est un peu plus lisible, mais guère plus..

Pouvez vous clarifier

  • comment vous avez connecté le lecteur RFID exactement ?
  • quel type de haut parleur ?
  • quel type de relai (conso, diode, ...) ?
  • quelle type de serrure (conso) ?
  • quelle puissance pour l'alimentation 12V

une photo du montage ne ferait pas de mal

Avant de coder une application un peu complexe, Il faut faire un montage minimaliste, en l’occurrence le relais tout seul piloté par l'Arduino et voir si on arrive à le piloter sans problème.
Si c'est OK on fait la même chose avec les autres périphériques.
Et quand on maîtrise tout les sous-ensembles on peut commencer à réfléchir sur l'application finale.

L'avantage de cette démarche c'est que lorsqu'on rencontre un problème, on présente, ici,un montage simple et un code court ce qui permet de trouver plus rapidement d'où peut venir le problème.

J’ai un deuxième relai donc je vais réessayer.