Bouton poussoir type télérupteur sans delay() (Resolu)

Bonjour,

je cherche désespérément un code qui pourrait faire un genre de télérupteur avec un bouton poussoir.

j’appuis une foie sur le bouton (une simple impulsion) et ma variable de sauvegarde passa à 1 et quand je r appuis dessus elle repasse a 0 et ainsi de suite.

j’ai réussi à trouver le code qui fait ça mais grâce à un delay(300) à la fin du code qui permet de bloquer le temps de relâcher la pression de bouton. car si je supprime ce delay, pendant que je reste appuyé sur le bouton, la variable de sauvegarde passe de 0 a 1 très rapidement. Et donc le résultat est aléatoire entre 0 et 1 quand je relâche le bouton.
Je sent qu’il faudrait une autre variable qui sauvegarderait l’ancien état de la variable de sauvegarde. Mais je n’arrive pas à le trouver. Et je ne trouve rien sur internet.

Car mon but final serait d’avoir une quarantaine de boutons et que l’on puisse appuyer dessus simultanément. Donc je doit éviter le delay() qui serait bloquant si un autre bouton est appuyé.

le code qui concerne le bouton est dans la fonction “void TestBp()”

Merci

//Maitre

#include <Wire.h>
int Bp1;
int EtatBp1;
int Stokage_Bp1;

void setup()
{
Wire.begin(); // Rejoindre le bus I2C (Pas besoin d adresse pour le maitre)
Bp1 = 22;
EtatBp1 = 0 ;
Stokage_Bp1 = 0;
pinMode(Bp1, INPUT);

Serial.begin(9600);

}

void loop()
{
//contenu du programme
TestBp();
Serial.print("VariableStokageBp1 = ");
Serial.println(Stokage_Bp1,DEC);
Serial.print("EtatBP1 = ");
Serial.println(EtatBp1,DEC);
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(Stokage_Bp1);
Wire.endTransmission(); // Arreter la transmission
delay(100); // Attendre 1s

}


void TestBp() {
     EtatBp1 = digitalRead(Bp1);
//essayer un tantque
    
   if ((EtatBp1)== 0 && Stokage_Bp1 == 0){
   Stokage_Bp1++ ;
   delay(300);
   }
    else  if ((EtatBp1)==0 && Stokage_Bp1 == 1){
    Stokage_Bp1 = 0 ;
    delay(300);
    }
 
    
}

bonjour,
regarde les exemples de l'ide dans digital
soit activer la resistance interne soit en monter une sur le bouton pour éviter le rebond, soit trouver un bouton qui en contient une.
au lieu d'utiliser delay avec une faute comme tu le fais

delay(100); // Attendre 1s

100 ms et non 1 seconde qui correspond à 1000
tu peux utiliser la fonction millis()

Bonjour,

Il faut que tu regardes si le bouton a changé d'état, pour cela il faut comparer l'état du bouton à l'état précédent:

void TestBp() {
  static int etatBp1Prec=HIGH;  // état du bouton au cycle précédent
  EtatBp1 = digitalRead(Bp1);
  if (EtatBp1!=etatBp1Prec)
  {
    // le bouton a changé d'état
    etatBp1Prec=EtatBp1;
    if (EtatBp1==LOW)
      Stokage_Bp1=!Stokage_Bp1;          // inverse StokageBp1
  }
}

Bonjour

Première chose totalement incontournable : ton code ne doit pas contenir la moindre instruction delay. Ni dans la gestion des boutons, ni ailleurs.

Par ailleurs, pour te simplifier la gestion des boutons, je te suggère de regarder de plus près la bibliothèque simpleBouton.h

Elle te permettra par exemple ce genre de chose

#include "simpleBouton.h"

simpleBouton BP1(22);
simpleBouton BP2(23);

...

void loop()
{
  BP1.actualiser();
  BP2.actualiser();

  if (BP1.vientDEtreEnfonce())
  {
    ...
  }

  if (BP2.vientDEtreEnfonce())
  {
    ...
  }
}

infobarquee:
bonjour,
regarde les exemples de l'ide dans digital
soit activer la resistance interne soit en monter une sur le bouton pour éviter le rebond, soit trouver un bouton qui en contient une.
au lieu d'utiliser delay avec une faute comme tu le fais

delay(100); // Attendre 1s

100 ms et non 1 seconde qui correspond à 1000
tu peux utiliser la fonction millis()

J'ai bien une résistance monté sur mon bouton. Se n'est pas du tout un problème de rebond. Et pour la faute du delay, c'est un code que j'ai trouvé et j'ai modifier la valeur mais pas le commentaire.

Merci kamill, je n'ai pas testé mais je pense que ça doit être ça que je cherchai à faire.

Merci bricoleau, je vais aussi jeter un œil a cette bibliothèque, ça va peut être me sauver et me servir dans le futur

Bon, j'ai mis le temps mais j'ai trouvé ce que je voulais faire. j'ai modifier le croquis StateChangeDetection. et voila le résultat.

const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 13; // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = -1; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(9600);
}

void loop() {

// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);
if (buttonPushCounter == 1) {
buttonPushCounter = -1 ;
}
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);

} else {
// if the current state is LOW then the button
// wend from on to off:

Serial.println("off");

}
// Delay a little bit to avoid bouncing
delay(50);

}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;

// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (buttonPushCounter % 2 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}

}

je ne comprends pas pour quoi mon code ne marche pas lors de la compilation cela me mes
"extern void delay( uint32_t dwMs ) ;

^

exit status 1"

const int M11=13;
const int M12=12;
const int M21=11;
const int M22=10;
const int M31=9;
const int M32=8;
const int M41=7;
const int M42=6;
const int M5=5;
const int BP1=4;
const int BP2=3;
const int BP3=2;
const int BP4=1;
const int BP5=0;
const int BP6=14;

int etatBP1 = 0;
int etatBP2 = 0;
int etatBP3 = 0;
int etatBP4 = 0;
int etatBP5 = 0;
int etatBP6 = 0;

void setup()
{
pinMode(M11, OUTPUT);
pinMode(M12, OUTPUT);
pinMode(M21, OUTPUT);
pinMode(M22, OUTPUT);
pinMode(M31, OUTPUT);
pinMode(M32, OUTPUT);
pinMode(M41, OUTPUT);
pinMode(M42, OUTPUT);
pinMode(M5, OUTPUT);
pinMode(BP1, INPUT);
pinMode(BP2, INPUT);
pinMode(BP3, INPUT);
pinMode(BP4, INPUT);
pinMode(BP5, INPUT);
pinMode(BP6, INPUT);
}

void loop(){
etatBP1 = digitalRead(BP1);
if(BP1){
digitalWrite(M5, HIGH)
delay(2000);
digitalWrite(M5, LOW);

}

etatBP2 = digitalRead(buttonPin);

if(BP2)
{
digitalWrite(M11, HIGH);
delay(2000);
digitalWrite(M11, LOW);

digitalWrite(M5, HIGH);
delay(2000);
digitalWrite(M5, LOW);

digitalWrite(M12, HIGH);
delay(2000);
digitalWrite(M12, LOW);

}
etatBP3 = digitalRead(buttonPin);

if (BP3)

{
digitalWrite(M11, HIGH);
delay(2000);
digitalWrite(M11, LOW);

digitalWrite(M5, HIGH);
delay(2000);
digitalWrite(M5, LOW);

digitalWrite(M12, HIGH);
delay(2000);
digitalWrite(M12, LOW);

}

etatBP4 = digitalRead(buttonPin);

for (BP4)

{
digitalWrite(M21, HIGH);
delay(1667);
digitalWrite(M21, LOW);

digitalWrite(M22, HIGH);
delay(1667);
digitalWrite(M22, LOW);

}

etatBP5 = digitalRead(buttonPin);

if (BP5)
{
digitalWrite(M11, HIGH);
delay(2000);
digitalWrite(M11, LOW);
delay(2000);

digitalWrite(M31, HIGH);
delay(1667);
digitalWrite(M31, LOW);

digitalWrite(M32, HIGH);
delay(1667);
digitalWrite(M32, LOW);

digitalWrite(M12, HIGH);
delay(2000);
digitalWrite(M12, LOW);
}

etatBP6 = digitalRead(buttonPin);

if (BP6)
{
digitalWrite(M11, HIGH);
delay(2000);
digitalWrite(M11, LOW);
delay();

digitalWrite(M41, HIGH);
delay(1667);
digitalWrite(M41, LOW);

digitalWrite(M12, HIGH);
delay(2000);
digitalWrite(M12, LOW);
}

}