Problème de détection bouton poussoir passage du niveau haut vers le niveau bas

arduino ne détecte pas le passage du niveau haut vers le niveau bas de mon bouton poussoir, ou vice versa , voic mon code de l'aide s'il vous plait , le projet consiste à utiliser des cartes rfid pour simuler des produit et le lecteurs lit ceux ci , apres on a la validation par la caissière qui le fait via un bouton poussoir , or problème la détection du passage du niveau haut vers le niveau bas et vice versa n'est pas faite par arduino , je ne comprends pas pourquoi et j'ai tout essayé ,, de l'aide svp

/*
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS 1    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * SPI SS 2    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 */


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <MFRC522.h>

int pinBouton;
boolean etatAllumage;

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_1_PIN        10         // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN        8          // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1

#define NR_OF_READERS   2

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

String UID;

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

struct Produit {
  String code;
  String nom;
  int prix;
  bool etach;
  };

  int cpt =0;
  
Produit Stock[5],Gprod[5];

  


void setup() {

  
  
  Stock[0]={"130253248101","Bambi chocolat",1275,false};
  Stock[1]={"133195164117","Soda",375,false};
  Stock[2]={"53163170117","Gourde",1350,false};
  Stock[3]={"68203159213","Savon",850,false};
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  
    pinBouton = 2;
    pinMode(pinBouton,INPUT);
    etatAllumage=0;

  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  
  lcd.init();  
  lcd.backlight();
  Serial.begin(9600); // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
      mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN);    // Init each MFRC522 card
  }
}

void loop() {

  
  
        
        
//          lcd.print("Attente ");
//          lcd.setCursor(0,1);
//          lcd.print("  de clients ...");
         
          

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
//      Serial.print(F("Reader "));
//      Serial.print(reader);
//      Serial.print(F(" -- "));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
//      Serial.print("My IUD : " + UID);
//      Serial.println();

    //La caissière
    if (reader==0){
      lcd.clear();
      for (int i =0; i<5; i++)
      {
        if (UID == Stock[i].code )
       {
          
          Gprod[cpt].nom = Stock[i].nom;
          Gprod[cpt].code = Stock[i].code;
          Gprod[cpt].prix = Stock[i].prix;
          Gprod[cpt].etach = Stock[i].etach;

          
          lcd.print(Gprod[cpt].nom);
          
          cpt=cpt+1;
          
          }
         
        }


        boolean etatBouton = digitalRead(pinBouton);
        delay(1);

        if (etatBouton)//si bouton appuyé (donc le pin indique 0 car il est en mode INPUT_PULLUP)
                    
                      {
                    
                        if (!etatAllumage) //si etatAllumage à 1
                    
                        {
                    
                          etatAllumage=1; //on le passe à 0
                    
                        }
                      }
           
           if (etatAllumage)
          {
          
            lcd.init();
            int somme =0;
            cpt=0;
            for (int i =0; i<5; i++)
            {
         
          somme = somme+ Gprod[i].prix;  
           for (int j =0; j<5; j++)
           {

           if (Gprod[i].code==Stock[j].code) 
            {
              Stock[j].etach = true;
              }

           
            }

          Gprod[cpt].nom = "";
          Gprod[cpt].code = "";
          Gprod[cpt].prix = 0;
          Gprod[cpt].etach = false;
        }
      
        lcd.print("total : "); 
        lcd.print(somme);
           
            }

                               

                        
          
          
        
       
      
      }

    //La sortie
    //    if (){}


      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
}

/**
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
  UID ="" ;
  for (byte i = 0; i < bufferSize; i++) {
//    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    UID=UID+String(buffer[i]) ;
  }
}

visiblement le debouncing/anti-rebond est fait avec un "delay(1);" donc d'une seule milliseconde, ce qui est assez peu pour que ce soit probant...
La gestion du bouton est aussi bien trop sommaire, ce n'est donc malheureusement pas étonnant que cela ne fonctionne pas ou fonctionne mal.
Pour comprendre comment gérer un ou plusieurs boutons correctement, j'ai tenté d'expliquer dans ce tuto ce qu'il faut faire.

Il y a cette ligne dans ton code

        if (etatBouton)//si bouton appuyé (donc le pin indique 0 car il est en mode INPUT_PULLUP)

or dans le setup() tu ecris ça

pinMode(pinBouton,INPUT);

donc s'il n'y a pas de pullup externe l'entrée est en l'air.

BONJOUR , merci pour vos réponses , mais malheureusement sa ne marche toujours pas , voilà mon code

/*
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS 1    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * SPI SS 2    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 */


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <MFRC522.h>

#define PIN_ENTREE_BOUTON 2
#define TEMPS_ANTI_REBOND_MS 50
bool boutonAppuye = false;
unsigned long dateAntiRebond = 0;


#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_1_PIN        10         // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN        8          // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1

#define NR_OF_READERS   2

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

String UID;

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

struct Produit {
  String code;
  String nom;
  int prix;
  bool etach;
  };

  int cpt =0;
  
Produit Stock[5],Gprod[5];

  


void setup() {

  
  
  Stock[0]={"130253248101","Bambi chocolat",1275,false};
  Stock[1]={"133195164117","Soda",375,false};
  Stock[2]={"53163170117","Gourde",1350,false};
  Stock[3]={"68203159213","Savon",850,false};
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  
    // Configurer la PIN où est branché le bouton en tant qu'une entrée
    pinMode(PIN_ENTREE_BOUTON, INPUT);
   
    

  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  
  lcd.init();  
  lcd.backlight();
  Serial.begin(9600); // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
      mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN);    // Init each MFRC522 card
  }
}

void loop() {

  
  bool etatBouton = digitalRead(PIN_ENTREE_BOUTON);
        
        
//          lcd.print("Attente ");
//          lcd.setCursor(0,1);
//          lcd.print("  de clients ...");
         
          

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
//      Serial.print(F("Reader "));
//      Serial.print(reader);
//      Serial.print(F(" -- "));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
//      Serial.print("My IUD : " + UID);
//      Serial.println();

    //La caissière
    if (reader==0){
      lcd.clear();
      for (int i =0; i<5; i++)
      {
        if (UID == Stock[i].code )
       {
          
          Gprod[cpt].nom = Stock[i].nom;
          Gprod[cpt].code = Stock[i].code;
          Gprod[cpt].prix = Stock[i].prix;
          Gprod[cpt].etach = Stock[i].etach;

          
          lcd.print(Gprod[cpt].nom);
          
          cpt=cpt+1;
          
          }
         
        }


        
        if (etatBouton)//si bouton appuyé (donc le pin indique 0 car il est en mode INPUT_PULLUP)
                    
                      {
                    
                        if (dateAntiRebond != 0) //si etatAllumage à 1
                    
                        {
                    
                                          unsigned long tempsEcoule = millis() - dateAntiRebond;
                
                            // si le temps écoulé est supérieur ou égal au temps d'anti-rebond
                            if ( tempsEcoule >= TEMPS_ANTI_REBOND_MS )
                            {
                                // Considérer alors que le bouton est appuyé
                                boutonAppuye = true;
                
                                // arrêter l'anti-rebond
                                dateAntiRebond = 0;
                
                                // afficher l'état appuyé sur la console
                                Serial.println("Appuye");
                            }
                    
                        }

                                             else if ( !boutonAppuye )
                            {
                                // activer l'anti-rebond en obtenant la date actuelle du système
                                dateAntiRebond = millis();
                            }
                      
                      }


                                             else
                          {        
                              // si le bouton était appuyé
                              if ( boutonAppuye )
                              {
                                  // le considérer maintenant comme relaché
                                  boutonAppuye = false;
                      
                                  // afficher l'état relaché sur la console
                                  Serial.println("Relache");
                              }
                              // sinon, le bouton était déjà relaché ou l'anti-rebond était en cours
                              else
                              {            
                                  // arrêter l'anti-rebond s'il était en cours
                                  dateAntiRebond = 0;
                              }
                          }
                      
           
           if (boutonAppuye)
          {
          
            lcd.init();
            int somme =0;
            cpt=0;
            for (int i =0; i<5; i++)
            {
         
          somme = somme+ Gprod[i].prix;  
           for (int j =0; j<5; j++)
           {

           if (Gprod[i].code==Stock[j].code) 
            {
              Stock[j].etach = true;
              }

           
            }

          Gprod[cpt].nom = "";
          Gprod[cpt].code = "";
          Gprod[cpt].prix = 0;
          Gprod[cpt].etach = false;
        }
      
        lcd.print("total : "); 
        lcd.print(somme);
           
            }

                               

                        
          
          
        
       
      
      }

    //La sortie
    //    if (){}


      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
}

/**
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
  UID ="" ;
  for (byte i = 0; i < bufferSize; i++) {
//    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    UID=UID+String(buffer[i]) ;
  }
}

bonjour,

BONJOUR , merci pour vos réponses , mais malheureusement sa ne marche toujours pas , voilà mon code

ca n'aide pas du tout.
qu'est ce qui ne fonctionne pas?

il a été indiqué plus haut

donc s'il n'y a pas de pullup externe l'entrée est en l'air.

et aucune modification de ta part dans ce sens

mais dès que je passe deux carte rfid la somme apprait seul sans que je ne presse sur le bouton

Un fil en l'air comme tu as actuellement fait absolument n'importe quoi.
Commence par faire ce qu'Infobarquee te dit avant d'ergoter.

mido35:
mais dès que je passe deux carte rfid la somme apprait seul sans que je ne presse sur le bouton

fais un

bool etatBouton = digitalRead(PIN_ENTREE_BOUTON);
Serial.println(etatBouton);

EDIT :
et tu verras ce que ca donne dans le temps
si tu ne suis pas les indications qu'on te donne, ca le fera pas.

Et surtout mets ça:

pinMode(pinBouton,INPUT_PULLUP);

je ne comprend pas pourquoi vous parlez d'un fil en l'air , j'en ai pas , expliquez moi s'il vous plait

mido35:
je ne comprend pas pourquoi vous parlez d'un fil en l'air , j'en ai pas , expliquez moi s'il vous plait

as tu lu le lien proposé plus haut?

sans résistance de rappel externe ou interne autant laisser le fil du bouton en l'air.
ca fait n'importe quoi.
donc faits ce qu'on te dit et tu verra que ca ira nettement mieux.

j'utilise une résistance de pull-up externe , en série avec le bouton poussoir et quand je teste la tension avec le multimètre la tension passe de 4,96 à 0 volt , donc tous semble bien marcher au niveau du bouton mais arduino ne détecte toujours pas ce changement d'état

as tu lu le lien proposé plus haut?

oui j'ai lue ce tuto et c'est avec sa que j'ai modifié mon code , regarde le deuxième post de code que j'ai fait tu veras la modification , même avec sa : bool etatBouton = digitalRead(PIN_ENTREE_BOUTON);
Serial.println(etatBouton);

sur le moniteur série j'ai en permanence 1 , même avec un appui du bouton , or quand je vérifie avec le multimètre ce n'est pas le cas la broche 2 passe bien de 4.96 à 0 volt

Est-ce que tu testes la bonne entrée de ton arduino ? :wink:
Des fois, surtout sur les clones, les numéros peuvent ne pas être bien alignés...

non c'est la bonne broche

alors, essaie de ne gérer que le bouton tout seul, vu que t'as copié-collé le code de mon tuto, essaie d'utiliser un des exemples du tuto pour voir si tout est ok déjà dans un premier temps. Si ca ne fonctionne toujours pas t'as soit un problème de branchement quand même soit quelque chose qui a "grillé" ou défectueux sur ton Arduino.
Si ca fonctionne, c'est qu'il faut que tu prennes le temps de bien comprendre le principe pour le mettre en œuvre dans ton code, en l'adaptant à ton besoin, sans faire que du copier-coller. Le copier-coller ca marche (pas bien non plus mais mieux) pour des documents texte, mais alors pour du code ca ne fonctionne pas du tout si tu n'essaies pas de comprendre ce que tu fais... :wink:

sur le moniteur série j'ai en permanence 1 , même avec un appui du bouton , or quand je vérifie avec le multimètre ce n'est pas le cas la broche 2 passe bien de 4.96 à 0 volt

y a un blem quelque part soit
dans ton branchement
dans la pin attribuée
dans la pin tout court

comment est relié ton bouton?
5v--->bouton---->pin
ou
gnd--->bouton--->pin

Quand c'est comme cela il n'y a qu'une seule solution : tout décâbler, ne recâbler que le bouton et le faire fonctionner.
Toute autre tentative ne sera que perte de temps.

Et ensuite recâbler fonction par fonction en vérifiant systématiquement le bon fonctionnement avant d'aller plus loin.