Comment allumer LED à la suite

Bonjour tout le monde,

Je vous présente le code ci-dessous qui fonctionne très bien: 2 LED qui clignotent et 2 interrupteurs pour les contrôler. Quand je presse l'interrupteur qui est associé à la LED, elle devient fixe et reste dans cet état. Ok, tout va bien.

Bémol, je souhaiterai les allumer les unes après les autres de cette façon:

  • La LED n°2 doit être éteinte lorsque la LED n°1 clignote.

  • J'active le clignotement de la LED n°2 quand je presse le bouton poussoir qui commande la LED n°1.

  • Comme la LED n°1, la LED n°2 doit devenir fixe quand je presse le bouton poussoir qui lui est associé...

Comment faire ? Ca me bloque... Tous mes essais sont non concluants.

Merci.

#include <Wire.h>
#include "Adafruit_MCP23017.h"
 
Adafruit_MCP23017 mcp;
 
bool clignotement = true;
unsigned long Intervaldeclignotement = 150;
unsigned long Millisactuel;
unsigned long Millisprecedent;
  
bool clignotement1 = true;
unsigned long Intervaldeclignotement1 = 150;
unsigned long Millisactuel1;
unsigned long Millisprecedent1;
 
void setup() {
  
mcp.begin();
 
mcp.pinMode(0, OUTPUT);
mcp.pinMode(1, OUTPUT);
 
mcp.pinMode(2,INPUT);
mcp.pinMode(3,INPUT);
 
mcp.pullUp(2, HIGH);
mcp.pullUp(3, HIGH);
 
mcp.digitalWrite(0, HIGH);
mcp.digitalWrite(1, LOW);

void loop() {
 
 if (clignotement) {
  Millisactuel = millis();
  if ((unsigned long)(Millisactuel - Millisprecedent) >= Intervaldeclignotement) {
   mcp.digitalWrite(0, !mcp.digitalRead(0));
   Millisprecedent = Millisactuel;
  }
 
 } else {
  mcp.digitalWrite(0, HIGH);
   
  }
   
 int lecturebouton = mcp.digitalRead(2);
 delay(50);
  
 if (lecturebouton==LOW){
  clignotement=false;
 
 }
 
 if (clignotement1) {
  Millisactuel1 = millis();
  if ((unsigned long)(Millisactuel1 - Millisprecedent1) >= Intervaldeclignotement1) {
   mcp.digitalWrite(1, !mcp.digitalRead(1));
   Millisprecedent1 = Millisactuel1;
  }
 } else {
  mcp.digitalWrite (1, LOW);
   
}
  int lecturebouton1 = mcp.digitalRead(3);
 delay(50);
  
 if (lecturebouton1==LOW)
  clignotement1=false;
 
  }

Bonjour,

J'ai du mal à comprendre ce que tu veux exactement (logique combinatoire, séquentielle, ou les deux). Un organigramme serait le bienvenu.

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J-M-L super post de ta part mais je sais pas du tout comment inclure ta librairie dans mon programme. Elle fonctionne déjà avec celle de l'I2C sur laquelle sont branchées mes 2 LED et mes 2 boutons poussoir... Et puis je l'ai fait clignoter avec un autre bout de code... Comment tout mélanger ?

Je m'y connais peu en programmation... l'apprentissage est assez hardu.

Mais merci pour ta réponse !

Sinon ci-joint un organigramme pour essayer de rendre mon problème plus clair.

Merci !

Ton organigramme :

Par fixe tu entends quoi, allumée, éteinte, reste dans l'état au moment de la pression du bouton ?

2 questions en rouge sur le dessin

est-ce qu'appuyer sur le mauvais bouton est juste ignoré?

sinon mon tuto est un tuto, pas une librairie. Donc faut comprendre et ensuite utiliser la technique dans son code :slight_smile:

Merci à tous les deux pour vos réponses.

Si BP2 est appuyé avant BP1, il ne doit rien se passer. La LED n°1 clignote tant que BP1 n'est pas pressé et la LED n°2 reste éteinte.

Si l'on presse BP2 et que l'on ré-appuye sur BP1 les LED restent à l'état "fixe".

Pour moi fixe signifie à l'état HAUT en continue. Plus de clignotement, la LED brille continuellement.

Je sais, le problème est un petit peu cornélien et désolé pour mes approximations...

Dans mon code, l'état HAUT est mémorisé. Si je le relâche le BP, la LED reste dans cet état sans interruption.

Tu ne peux pas limiter tes conditions à l'état de tes boutons sinon ils auront toujours une action indépendamment de l'état de gestion des leds

Oui, j'ai été confronté à ce souci. Voilà tout le dileme... (pour moi en tout cas :))

Votre organigramme ne boucle pas...

ma question c'est plus qu'est-ce que je fais si BP1 a été pressé et est pressé à nouveau? est-ce que ça compte comme BP2 --> ça donnerait ça


ou il faut ignorer BP1 ?

--> redessiner l'organigramme ou lisez mon tuto et une description des états et évènements serait


bien sûr le blink c'est aussi un évènement à traiter --> je vous laisser dessiner cela

Il n'y a rien de bien compliqué. Tu dois juste ajouter dans tes conditions des variables qui définissent la situation (qui te différencie des autres) dans laquelle tu te trouves. Demande toi ce qui ce passe au moment précis où tu veux agir sur ton programme.

Ça donnerait exactement l'organigramme que tu as dessiné !

C'est ça: si BP1 est de nouveau appuyé et que BP2 l'a été aussi précédemment, on se retrouve dans la configuration de la dernière case au-dessus de "FIN".

Dans mon code ci-dessus que j'ai donné comme base, les LED clignotent simultanément ensembles. Si j'appuie sur BP1, la LED n°1 devient "fixe". Si j'appuie sur BP2, la LED n°2 devient fixe aussi. Mais l'appuie sur l'un n'a aucune incidence sur l'autre.

L'organigramme que tu as modifié en dernier correspond exactement à ce que je cherche à produire...

C'est ça: si BP1 est de nouveau appuyé et que BP2 l'a été aussi précédemment

Non ce n’est pas ce que j’ai dessiné - ce que j’ai dessiné sur votre organigramme prend en compte 2 fois l’appui de BP1 sans toucher à BP2. je crois que ce vous dites correspond plus à mes 3 bulles en couleur.