séquence de boutons

Bonjour à tous,

J'essaie de créer une séquence de boutons à appuyer pour déclencher une ouverture de ventouse électrique.

Mon problème est que je ne sait pas comment reset le switchState afin que dès qu'on relache le bouton, tout s'éteint.

Voila ce que j'ai (je débute complètement). N'hésitez pas à pointer les erreurs (et expliquer) que je comprenne :wink:

int Button1 = 2;
int Button2 = 3;
int Button3 = 4;
int Button4 = 5;
int Ventouse1 = 9;

int switchState = 0;


void setup() {


pinMode (2, INPUT);
pinMode (3, OUTPUT);
pinMode (4, INPUT);
pinMode (5, OUTPUT);
pinMode (6, INPUT);
pinMode (7, OUTPUT);
pinMode (8, INPUT);
pinMode (9, OUTPUT);
}


void loop() {
 
switchState = digitalRead(2);
if (switchState == HIGH) {
  digitalWrite(3, HIGH);
}
delay(250);
switchState = digitalRead(4);
if (switchState == HIGH) {
  digitalWrite(5, HIGH);
}
delay(250);
switchState = digitalRead(6);
if (switchState == HIGH) {
  digitalWrite(6, HIGH);
}
delay(250);
switchState = digitalRead(8);
if (switchState == HIGH) {
  digitalWrite(9, HIGH);
}
else {
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}
}

En résumé : J'appuie sur le bouton 1 (en laissant appuyé) puis le bouton 2 etc. Quand les 4 boutons sont appuyés en meme temps, l'ouverture se fait.

Or la, quand j'appuie le premier bouton, ca reste enclenché (j'ai une led de vérif sur le circuit, et elle reste allumée).

Merci de vos réponses !

hello
si tu lis ton code, tu verras que tes if regardent si le bp est appuyé, et si c’est la led est allumée.
mais que se passe t’il lorsque la loop est effectuée ensuite et que tu as relâché le bp?
la led reste dans l’état ou elle a été mise lorsque le prg est entré dans le if parce que tu avais actionné le BP.

donc il faut rajouter un else derrière chacun des if.

puisque tu débute, histoire de t’inciter à programmer en respectant une faire,voici ton peg revu ( non testé)
regarde comment il est écrit:
les définitions et leur utilisation ensuite dans le programme. tu verras qu’il est beaucoup plus facile de suivre un programme écrit de cette façon

edit: correction de la condition des if qui était “HIGH” remplacé par “LOW”, car les BP sont déclarés en input_pullup et sur une pression ils doivent faire contact entre l’entrée et GND

#define Button1    2
#define led1       3
#define Button2    4
#define led2       5
#define Button3    6
#define led3       7
#define Button4    8
#define led4       9
#define Ventouse1 10

int switchState = 0;


void setup() {
pinMode (2, INPUT_PULLUP);//BP1
pinMode (3,       OUTPUT);//led1
pinMode (4, INPUT_PULLUP);//BP2
pinMode (5,       OUTPUT);//led2
pinMode (6, INPUT_PULLUP);//BP3
pinMode (7,       OUTPUT);//led3
pinMode (8, INPUT_PULLUP);//BP4
pinMode (9,       OUTPUT);//led4
}


void loop() {
switchState = digitalRead(Button1);
if (switchState == LOW) {
  digitalWrite(led1, HIGH);
}
else {reset_leds();}
delay(250);
switchState = digitalRead(Button2);
if (switchState == LOW) {
  digitalWrite(led2, HIGH);
}
else {reset_leds();}
delay(250);
switchState = digitalRead(Button3);
if (switchState == LOW) {
  digitalWrite(led3, HIGH);
}
else {reset_leds();}
delay(250);
switchState = digitalRead(Button4);
if (switchState == LOW) {
  digitalWrite(led4, HIGH);
}
else {reset_leds();}
}
void reset_leds()
{
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
}

merci de la réponse.
J'étudie ça avec attention :wink:

Quelques demandes de précisions toutefois :

#define X Y, c'est pareil que int X Y ? c'est un choix de langage ou cela à vraiment une importance ?

INPUT_PULLUP est spécifique aux bouton poussoir j'imagine et que le INPUT seul ne fonctionnait pas correctement vu qu'il s'attend à rester en ON ou OFF une fois enclenché (sur un bouton normal).

Dans le code que tu as écrit, en appuyant juste le bouton 4, cela ne va t il pas déclencher l'ouverture de la ventouse (en 9, à la place de la Led) ?

Histoire que je comprenne bien.

Merci pour la technique du reset, je ne connaissais pas encore mais c'est indispensable dans un max de projets.

Je posterai surement d'autres question en cas de souci, merci beaucoup !

#define X Y veut dire que lors de la compilation, partout dans ton code où il y a écrit X ce sera remplacé par Y

ça n’a rien à voir avec int X; ou int Y; qui sont des déclarations de variables, de type int, et qui porteront les noms X et Y

INPUT_PULLUP veut dire que tu vas activer la résistance de tirage à Vcc interne au microcontrolleur pour l’entrée concernée. ça évite de devoir ajouter une résistance en plus dans le montage

ok merci des précisions !