[RESOLU] Problème de code avec 4 boutons poussoirs et 4 relais

Bonjour.

Je suis novice en programmation et ai vraisemblablement présumé de mes capacités.

Pour faciliter la fabrication de palette, Je cherche à allumer 4 lampes, via 4 relais lors de l’appuie sur des boutons poussoir, et indiquer sur un afficheur LCD quel combinaison est sélectionnée.
Concrètement, lors de l'appuie sur le 1er BP, les relais 1 et 2 doivent s'allumer, et afficher sur l'écran 1 petite palette. Lors de l'appuie sur le 2eme BP, les relais 1 et 3 doivent s'allumer, et afficher sur l'écran 1 grande palette. Lors de l'appuie sur le3eme BP, les relais 1, 3 et 4 doivent s'allumer, et afficher sur l'écran 2 grandes palette. Enfin l'appuie sur le 4éme Bp doit éteindre tous les relais et afficher des * sur l'écran.
Pour m'aider dans ce projet, je l'ai préparé sur le site wokwi.com.

PROJET FINAL v1 - Wokwi Arduino and ESP32 Simulator)

Le premier appuie sur n'importe quel bouton fonctionne bien, mais J'ai un comportement inattendu à partir du second appuie.....

Ci dessous le code que j'ai bidouillé :

 

#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C // inclure la librairie LiquidCrystal_I2C 

LiquidCrystal_I2C lcd(0x27, 20, 4); // LiquidCrystal_I2C



int relai1PIN = 6; // PIN de sortie relai n°1
int relai2PIN = 7; // PIN de sortie relai n°2
int relai3PIN = 8; // PIN de sortie relai n°3
int relai4PIN = 9; // PIN de sortie relai n°4
int button1Pin = 2; // PIN d'entrée BP n°1 - 1petite
int button2Pin = 3; // PIN d'entrée BP n°2 - 1 grande
int button3Pin = 4; // PIN d'entrée BP n°3 - 2 grandes
int button0Pin = 11; // PIN d'entrée BP n°0 - OFF

int timeDelay = 500; // 


void setup(){

//Démarrage de l'afficheur et msg de bienvenue
 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(6, 0);
  lcd.print("Bonjour");
  lcd.setCursor(3, 1);
  lcd.print("Quelle palette");
  lcd.setCursor(5, 2);
  lcd.print("fabriquer ?");

pinMode(relai1PIN, OUTPUT); // Définition PIN relai n°1 en sortie
pinMode(relai2PIN, OUTPUT); // Définition PIN relai n°2 en sortie
pinMode(relai3PIN, OUTPUT); // Définition PIN relai n°3 en sortie
pinMode(relai4PIN, OUTPUT); // Définition PIN relai n°4 en sortie
pinMode(button1Pin, INPUT); // Définition PIN BP n°1 en entrée
pinMode(button2Pin, INPUT); // Définition PIN BP n°2 en entrée
pinMode(button3Pin, INPUT); // Définition PIN BP n°3 en entrée
pinMode(button0Pin, INPUT); // Définition PIN BP n°0 en entrée

digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4

}
void loop(){

if (digitalRead(button1Pin) == HIGH) // Appuis sur le BP n°1
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1
digitalWrite(relai2PIN, HIGH); // allume le relai n°2
//digitalWrite(relai3PIN, LOW); // éteint le relai n°3
//digitalWrite(relai4PIN, LOW); // éteint le relai n°4


// affiche le message palette 1 petite

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(6, 2);
  lcd.print("1 petite");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

if (digitalRead(button2Pin) == HIGH) // Appuis sur le BP n°2
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1
//digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, HIGH); // allume le relai n°3
//digitalWrite(relai4PIN, LOW); // éteint le relai n°4

// affiche le message palette 1 grande

lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(6, 2);
  lcd.print("1 grande");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

if (digitalRead(button3Pin) == HIGH) // Appuis sur le BP n°3
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1 
//digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, HIGH); // allume le relai n°3
digitalWrite(relai4PIN, HIGH); // allume le relai n°4
 
 // affiche le message palette 2 grandes
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(5, 2);
  lcd.print(" 2 grandes");
  lcd.setCursor(0, 3);
  lcd.print("********************");

  }

if (digitalRead(button0Pin) == HIGH) // Appuis sur le BP n°0
  {
  
  digitalWrite(relai1PIN, LOW); // éteint le relai n°1
  digitalWrite(relai2PIN, LOW); // éteint le relai n°2
  digitalWrite(relai3PIN, LOW); // éteint le relai n°3
  digitalWrite(relai4PIN, LOW); // éteint le relai n°4

  // affiche le message ***********

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("********************");
  lcd.setCursor(0, 2);
  lcd.print("********************");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

}

Si quelqu'un avait un début de piste à explorer....
D'avance merci !

Bonjour,

Les boutons sont mal câblés, lorsqu'il ne sont pas appuyés, ils sont en l'air. Il faut:

  1. les câbler entre une I/O et GND. Les résistances ne servent à rien.
  2. configurer les entrées en INPUT_PULLUP. Ainsi au repos les entrées sont toutes polarisés à HIGH
  3. dans les tests tester l'état LOW au lieu de HIGH, puisqu'un bouton appuyé se retrouve à GND.

Le code associé

#include <LiquidCrystal_I2C.h> LiquidCrystal_I2Cinclure la librairie LiquidCrystal_I2C 

LiquidCrystal_I2C lcd(0x27, 20, 4); // LiquidCrystal_I2C



int relai1PIN = 6; // PIN de sortie relai n°1
int relai2PIN = 7; // PIN de sortie relai n°2
int relai3PIN = 8; // PIN de sortie relai n°3
int relai4PIN = 9; // PIN de sortie relai n°4
int button1Pin = 2; // PIN d'entrée BP n°1 - 1petite
int button2Pin = 3; // PIN d'entrée BP n°2 - 1 grande
int button3Pin = 4; // PIN d'entrée BP n°3 - 2 grandes
int button0Pin = 11; // PIN d'entrée BP n°0 - OFF

int timeDelay = 500; // 


void setup(){

//Démarrage de l'afficheur et msg de bienvenue
 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(6, 0);
  lcd.print("Bonjour");
  lcd.setCursor(3, 1);
  lcd.print("Quelle palette");
  lcd.setCursor(5, 2);
  lcd.print("fabriquer ?");

pinMode(relai1PIN, OUTPUT); // Définition PIN relai n°1 en sortie
pinMode(relai2PIN, OUTPUT); // Définition PIN relai n°2 en sortie
pinMode(relai3PIN, OUTPUT); // Définition PIN relai n°3 en sortie
pinMode(relai4PIN, OUTPUT); // Définition PIN relai n°4 en sortie
pinMode(button1Pin, INPUT_PULLUP); // Définition PIN BP n°1 en entrée
pinMode(button2Pin, INPUT_PULLUP); // Définition PIN BP n°2 en entrée
pinMode(button3Pin, INPUT_PULLUP); // Définition PIN BP n°3 en entrée
pinMode(button0Pin, INPUT_PULLUP); // Définition PIN BP n°0 en entrée

digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4

}
void loop(){

if (digitalRead(button1Pin) == LOW) // Appuis sur le BP n°1
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1
digitalWrite(relai2PIN, HIGH); // allume le relai n°2
//digitalWrite(relai3PIN, LOW); // éteint le relai n°3
//digitalWrite(relai4PIN, LOW); // éteint le relai n°4


// affiche le message palette 1 petite

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(6, 2);
  lcd.print("1 petite");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

if (digitalRead(button2Pin) == LOW) // Appuis sur le BP n°2
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1
//digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, HIGH); // allume le relai n°3
//digitalWrite(relai4PIN, LOW); // éteint le relai n°4

// affiche le message palette 1 grande

lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(6, 2);
  lcd.print("1 grande");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

if (digitalRead(button3Pin) == LOW) // Appuis sur le BP n°3
  {
digitalWrite(relai1PIN, LOW); // éteint le relai n°1
digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, LOW); // éteint le relai n°3
digitalWrite(relai4PIN, LOW); // éteint le relai n°4
digitalWrite(relai1PIN, HIGH); // allume le relai n°1 
//digitalWrite(relai2PIN, LOW); // éteint le relai n°2
digitalWrite(relai3PIN, HIGH); // allume le relai n°3
digitalWrite(relai4PIN, HIGH); // allume le relai n°4
 
 // affiche le message palette 2 grandes
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("Palette selectionnee");
  lcd.setCursor(5, 2);
  lcd.print(" 2 grandes");
  lcd.setCursor(0, 3);
  lcd.print("********************");

  }

if (digitalRead(button0Pin) == LOW) // Appuis sur le BP n°0
  {
  
  digitalWrite(relai1PIN, LOW); // éteint le relai n°1
  digitalWrite(relai2PIN, LOW); // éteint le relai n°2
  digitalWrite(relai3PIN, LOW); // éteint le relai n°3
  digitalWrite(relai4PIN, LOW); // éteint le relai n°4

  // affiche le message ***********

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("********************");
  lcd.setCursor(0, 1);
  lcd.print("********************");
  lcd.setCursor(0, 2);
  lcd.print("********************");
  lcd.setCursor(0, 3);
  lcd.print("********************");
  }

}

Il faut faire attention avec cette ligne, car les autres messages étant plus longs, on risque de se retrouver avec des caractères non voulus à la fin. Autant compléter avec des espaces sur 16 caractères :

  lcd.setCursor(0, 2);
  lcd.print("     1 petite   ");

De plus, ce code peut énormément se simplifier en utilisant des tableaux : tableau pour les numéros des pins des boutons, des pins des relais associés aux boutons et même du message (celui qui change).

Re bonjour.

Tout d'abord merci infiniment fdufnews pour cette solution qui marche à merveille et lesept pour le complément pour l'affichage !
Je n'ai pas encore les bases et j'ai recopié bêtement des bout de code par ci par là.
Compléter avec des espaces n'avait pas eu le résultat attendu et le message commençait sur le premier caractère de l'afficheur; j'avais probablement mal fait car je viens de réessayé et cette solution fonctionne !
Je vais explorer l'utilisation de tableau pour améliorer tout ça.
Dans l'état le projet peut être mis en service comme ça, j'implémenterais le code au fur et à mesure de mes apprentissages.

Merci encore à vous pour votre aide précieuse!

Bien sincèrement,

Hugo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.