4 buttons, 5 fonctions et un joli bug!

Bonjour,
Je viens demander de l'aide, et je m'excuse d'avance si je pose des questions inapproprié mais considéré que j'ai 6 ans (pas vraiment) et que je découvre le codage, les microcontrôleurs et l’électronique sans base, à l'aide de tutos et avec de grosses difficultés de compréhension (je bloque vraiment au niveau des variables et j'ai de réelles et grandes difficultés a pleins de petites choses comme compter de tête ...). Tout ça pour vous prévenir que non, je troll pas, je comprends pas tout.
Merci de vote patience.

Voici le vif du sujet, j'ai paramétré un arduino uno pour répondre a des buttons.
je créé "un boitier météo":
Butt1 allume la Led1 : Intensité variable pour imiter la pluie
Butt2 allume Led2 et 3 par clignotement pour imiter orage
Butt3 allume Led4 : intensité variable pour imiter éclaircie (soleil)
Butt5 allume Led5 : fixe pour allumer le logo

Butt4 reprends tous les ordres pour faire un défilement automatique des séquences.

Les branchements et les programmes fonctionnent (yeah!) mais indépendamment les uns des autres, quand je veux tout regrouper sur un seul programme dans IDE et téléverser, je n'ai pas d'erreur, mais les boutons ont des réponses incorrectes (par exemple le butt3 n'allumera plus la Led4 mais la Led1, et le Butt5 va lancer tous les programmes a la suite a la place Butt 4.

Bref, après avoir parcourut beaucoup de tutos et tenter des bool et des while et des delay et des {} un peu partout, je ne sais plus. Bien sur ce projet est pour vendredi, je pensais faire les finitions de présentation puisque les programmes fonctionnes, pas devoir tout reprendre en catastrophe. Donc je suis désespérée (et j'ai plus beaucoup de neurones fonctionnelles)

Si quelqu'un saurait comment remedier au défaut d'intégration, je suis prette a essayer !
Par avance merci.

Matériel
Arduino Uno
Led1, 2, 3 et 5 : Blanche
Led4 : Jaune et rouge
Button : 5 (carré avec 4 broches)

Code pluie :

int buttonPin1=7;
int led1=10;
int x;
//Pluie
void setup() 
{
 pinMode(buttonPin1,INPUT);
 pinMode(led1, OUTPUT);
}
void loop() 
{
  if(digitalRead(buttonPin1)==HIGH)
 {
  x = 0;
  // Allumer progressivement la LED (0 --> 255)
  while (x <= 255) 
{
    analogWrite(led1, x);
    delay(10);
    x = x + 1;
  }
  // Eteindre progressivement la LED (255 --> 0)
  x = 255;
  while (x >= 0)
 {   
    analogWrite(led1, x);
    delay(10);
    x = x - 1;
  }
}
}

Code orage

int buttonPin2=6;
int led2=11;
int led3=12;

void setup() {
pinMode(buttonPin2,INPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}

void loop() {
if(digitalRead(buttonPin2)==HIGH)
{
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(50);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(50);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(200);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(200);
digitalWrite(led3,LOW);
delay(200);
}
}

Code soleil

int buttonPin3=5;
int led4=9;
int x;
//Soleil
void setup() {
 pinMode(buttonPin3,INPUT);
 pinMode(led4, OUTPUT);
}
void loop() {
  if(digitalRead(buttonPin3)==HIGH)
 {
  x = 0;
  // Allumer progressivement la LED (0 --> 255)
  while (x <= 255) {
    analogWrite(led4, x);
    delay(10);
    x = x + 1;
  }
  // Eteindre progressivement la LED (255 --> 0)
  x = 255;
  while (x >= 0) {   
    analogWrite(led4, x);
    delay(10);
    x = x - 1;
  }
}
}

Code Logo :

int buttonPin5=3;
int led5=8;
void setup() 
{
  pinMode(buttonPin5,INPUT);
  pinMode(led5, OUTPUT);
}
void loop() 
{
  //Alpi
 if(digitalRead(buttonPin5)==HIGH)
    {
    digitalWrite(led5,HIGH);
    delay(10000);
    }
      else
    {
    digitalWrite(led5,LOW);
    }
}

Et le dernier, le code Butt4 qui lance successivement tous les allumages :

int buttonPin4=4;
int led1=10;
int led2=11;
int led3=12;
int led4=9;
int led5=8;
int x;

void setup() 
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(buttonPin4,INPUT);
}
void loop() 
{
  if(digitalRead(buttonPin4)==HIGH)
      {
 //pluie
       x = 0;
        // Allumer progressivement la LED (0 --> 255)
        while (x <= 255) 
        {
        analogWrite(led1, x);
        delay(10);
         x = x + 1;
        }
        // Eteindre progressivement la LED (255 --> 0)
        x = 255;
        while (x >= 0) 
        {   
        analogWrite(led1, x);
        delay(10);
        x = x - 1;
        }

//orage
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(50);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(50);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(200);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(200);
digitalWrite(led3,LOW);
delay(200);

 //soleil
       x = 0;
         // Allumer progressivement la LED (0 --> 255)
          while (x <= 255) 
          {
          analogWrite(led4, x);
          delay(10);
          x = x + 1;
          }
         // Eteindre progressivement la LED (255 --> 0)
       x = 255;
        while (x >= 0) 
        {   
        analogWrite(led4, x);
        delay(10);
        x = x - 1;
       }
//logo
    {
    digitalWrite(led5,HIGH);
    delay(50000);
    }
}
}

Voila, chacun fonctionne mais maintenant quand je veux tout mettre sur la même page et téléverser :

int buttonPin1=7;
int buttonPin2=6;
int buttonPin3=5;
int buttonPin4=4;
int buttonPin5=3;
int led5=8;
int led4=9;
int led3=12;
int led2=11;
int led1=10;
int x;

void setup() 
{
 pinMode(buttonPin1,INPUT);
 pinMode(led1, OUTPUT);
  pinMode(buttonPin2,INPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
    pinMode(buttonPin3,INPUT);
    pinMode(led4, OUTPUT);
      pinMode(buttonPin4,INPUT);
        pinMode(buttonPin5,INPUT);
        pinMode(led5, OUTPUT);
}
void loop() 
{
 //Pluie
  if(digitalRead(buttonPin1)==HIGH)
 {
  x = 0;
  // Allumer progressivement la LED (0 --> 255)
  while (x <= 255) 
  {
    analogWrite(led1, x);
    delay(10);
    x = x + 1;
  }
  // Eteindre progressivement la LED (255 --> 0)
  x = 255;
  while (x >= 0) 
  {   
    analogWrite(led1, x);
    delay(10);
    x = x - 1;
  }
}
  //orage
if(digitalRead(buttonPin2)==HIGH)
{
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(50);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(50);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(200);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(200);
digitalWrite(led3,LOW);
delay(200);
}
//soleil
  if(digitalRead(buttonPin3)==HIGH)
 {
  x = 0;
  // Allumer progressivement la LED (0 --> 255)
  while (x <= 255) {
    analogWrite(led4, x);
    delay(10);
    x = x + 1;
  }
  // Eteindre progressivement la LED (255 --> 0)
  x = 255;
  while (x >= 0) {   
    analogWrite(led4, x);
    delay(10);
    x = x - 1;
  }
}
  //Alpi
 if(digitalRead(buttonPin5)==HIGH)
    {
    digitalWrite(led5,HIGH);
    delay(10000);
    }
      else
    {
    digitalWrite(led5,LOW);
    }
  if(digitalRead(buttonPin4)==HIGH)
      {
 //pluie
       x = 0;
        // Allumer progressivement la LED (0 --> 255)
        while (x <= 255) 
        {
        analogWrite(led1, x);
        delay(10);
         x = x + 1;
        }
        // Eteindre progressivement la LED (255 --> 0)
        x = 255;
        while (x >= 0) 
        {   
        analogWrite(led1, x);
        delay(10);
        x = x - 1;
        }
//orage
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(50);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(50);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(50);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led2,HIGH);
delay(150);
digitalWrite(led2,LOW);
delay(150);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(500);
digitalWrite(led3,HIGH);
delay(150);
digitalWrite(led3,LOW);
delay(150);
digitalWrite(led2,HIGH);
delay(200);
digitalWrite(led2,LOW);
delay(200);
digitalWrite(led3,HIGH);
delay(200);
digitalWrite(led3,LOW);
delay(200);
 //soleil
       x = 0;
         // Allumer progressivement la LED (0 --> 255)
          while (x <= 255) 
          {
          analogWrite(led4, x);
          delay(10);
          x = x + 1;
          }
         // Eteindre progressivement la LED (255 --> 0)
       x = 255;
        while (x >= 0) 
        {   
        analogWrite(led4, x);
        delay(10);
        x = x - 1;
       }
//logo
    {
    digitalWrite(led5,HIGH);
    delay(10000);
    }
}
}

Les allumages deviennent fous !

C’est bien de vous auto-excuser mais bof bof… le post n’est pas un tutoriel, donc mis au mauvais endroit… je le déplace . Bravo pour l’usage des balises et la documentation cependant (ce serait mieux si l’image était lisible) !

(lire les recommandations listées dans « Les bonnes pratiques du Forum Francophone”)

Merci pour le déplacement, j'ai lu les consignes de posts mais c'est pas évident de trouver le bon chemin!

le post est à la bonne place maintenant

On ne voit pas bien comment vous avez connecté les boutons. est-ce qu'ils fonctionnent tous dans les codes indépendants ? vous devriez utiliser les pullup interne de votre Arduino, ça vous éviterait d'avoir à brancher des résistances on fait juste pin --> bouton --> GND

Et pour simplifier votre gestion des boutons, éventuellement utilisez la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd.

un bon post si vous lisez l'anglais: Toggle Library for Debouncing Data, Buttons and Switches


quand vous faites

  //Alpi
  if (digitalRead(buttonPin5) == HIGH)
  {
    digitalWrite(led5, HIGH);
    delay(10000);
  }
  else
  {
    digitalWrite(led5, LOW);
  }

le else est fait donc tout le temps quand le boutonPin5 n'est pas appuyé


Le dernier code est assez long : ce serait bien de le reprendre et de l'indenter correctement afin qu'il soit plus facilement lisible. Pour ça : CTRL T dans l'IDE.

Aussi, utilise des fonctions, par exemple (là c'est trivial, mais lorsque tu as des trucs plus longs, c'est mieux) :

  //Alpi
 if(digitalRead(buttonPin5)==HIGH)
    {
    digitalWrite(led5,HIGH);
    delay(10000);
    }
      else
    {
    digitalWrite(led5,LOW);
    }

pourrait devenir (ces lignes vont s'insérer avant le setup) :

void Alpi() {
    digitalWrite(led5,HIGH);
    delay(10000);
}

et l'appel devient :

  //Alpi
 if(digitalRead(buttonPin5)==HIGH) Alpi();
 else digitalWrite(led5,LOW);

Si tu fais ça pour toute ta loop, elle deviendra très facile à lire, et tu n'auras plus qu'à écrire et vérifier tes fonctions une par une.

Aussi, tu vois que ta fonction Alpi est bloquante : pendant 10 secondes, le code attend et ne fait rien. Tout appui sur un bouton ne sera pas pris en compte. Pour régler ça, tu peux étudier ce petit tuto :

oui mais faut faire attention au else car il sera aussi exécuté si un autre bouton est appuyé

Oui, ce genre de problème serait à régler ensuite (à mon avis), lorsque le code sera facilement lisible.

Merci pour toutes ces propositions, j'ai été voir les tutos de bricoleau et d'autres mais ce sont jamais les mêmes termes que ceux que j'ai écrit,
et c'est effectivement très basique mais je ne comprends pas plus que ça (allume, éteinds :wink: )

J'ai fait ctrl+T dans ide et ça a rangé quelques lignes
Pour le branchement des butons c'est 5V-,a,coté : GND et en face Pin

Je m'en vais lire les 2 tutos (je lit pas l'anglais mais j'ai un traducteur

Voici un exemple de branchement en INPUT_PULLUP : le bouton est ici connecté entre la pin 2 et le GND.

Merci pour le CTRL T, mais ce serait surtout utile de mettre à jour les codes dans le message 1...

Je vais refaire les branchements et le code en INPUT_PULLUP
(donc pas besoin de 5V, ok)

Je pense pas que je vais réussir a faciliter le code mais je vais essayer, je vais en avoir pour un moment :smiley:

par contre j'ai une question, est ce qu'il faut écrire "serial.begin(9600), ou un autre numéro (j'ai lu un débat pas très clair) ou non ?

Le numéro c'est la vitesse de la communication entre ton Arduino et le PC, via la console de l'IDE.
Tu peux mettre 115200, l'important est que la même valeur soit sélectionnée dans ladite console.

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