Fonction loop mais pas trop

Bonjour,

Alors voila, je suis dans la création d'une tête de lit équipé de 15 leds qui s'allumeraient en partant de chaque côtés du lit jusqu'à la dernière situé au dessus et au centre du lit. La commande sera faite par un inter clap. Mon programme est le suivant:

int EtatBouton = 0;

void setup()
{
pinMode(23, INPUT); // Contact NO
pinMode(24, OUTPUT); //L1
pinMode(25, OUTPUT); //L2
pinMode(26, OUTPUT); //L3
pinMode(27, OUTPUT); //L4
pinMode(28, OUTPUT); //L5
pinMode(29, OUTPUT); //L6
pinMode(30, OUTPUT); //L7
pinMode(31, OUTPUT); //L8
pinMode(32, OUTPUT); //L9
pinMode(33, OUTPUT); //L10
pinMode(34, OUTPUT); //L11
pinMode(35, OUTPUT); //L12
pinMode(36, OUTPUT); //L13
pinMode(37, OUTPUT); //L14
pinMode(38, OUTPUT); //L15

}
 
void loop()
{
  EtatBouton = digitalRead(23);
  
  if(EtatBouton == LOW)
  {
    digitalWrite(31, HIGH); //ETEINDRE L8
    delay(500);
    digitalWrite(30, HIGH); //ETEINDRE L7 
    digitalWrite(32, HIGH); //ETEINDRE L9
    delay(500);
    digitalWrite(29, HIGH); //ETEINDRE L6
    digitalWrite(33, HIGH); //ETEINDRE L10
    delay(500);
    digitalWrite(28, HIGH); //ETEINDRE L5
    digitalWrite(34, HIGH); //ETEINDRE L11
    delay(500);
    digitalWrite(27, HIGH); //ETEINDRE L4
    digitalWrite(35, HIGH); //ETEINDRE L12
    delay(500);
    digitalWrite(26, HIGH); //ETEINDRE L3
    digitalWrite(36, HIGH); //ETEINDRE L13
    delay(500);
    digitalWrite(25, HIGH); //ETEINDRE L2
    digitalWrite(37, HIGH); //ETEINDRE L14
    delay(500);
    digitalWrite(24, HIGH); //ETEINDRE L1
    digitalWrite(38, HIGH); //ETEINDRE L15
  }
  else
  {
    digitalWrite(24, LOW); //ALLUMER L1
    digitalWrite(38, LOW); //ALLUMER L15
    delay(1000);
    digitalWrite(25, LOW); //ALLUMER L2
    digitalWrite(37, LOW); //ALLUMER L14
    delay(1000);
    digitalWrite(26, LOW); //ALLUMER L3
    digitalWrite(36, LOW); //ALLUMER L13
    delay(1000);
    digitalWrite(27, LOW); //ALLUMER L4
    digitalWrite(35, LOW); //ALLUMER L12
    delay(1000);
    digitalWrite(28, LOW); //ALLUMER L5
    digitalWrite(34, LOW); //ALLUMER L11
    delay(1000);
    digitalWrite(29, LOW); //ALLUMER L6
    digitalWrite(33, LOW); //ALLUMER L10
    delay(1000);
    digitalWrite(30, LOW); //ALLUMER L7
    digitalWrite(32, LOW); //ALLUMERL9
    delay(1000);
    digitalWrite(31, LOW);  //ALLUMER L8
  }
}

je tape dans mes mains les leds s'allument je retape et elles s'éteignent.
Mon problème est que quand je tape pour éteindre par exemple l'action n'est pas rapide, la fonction loop répétant le programme à l'infini je suis obliger d'attendre que le programme ai finit pour que les leds s'éteignent. Pour moi la solution serai que le programme ne s’exécute qu'une fois au lieu d'une infinité de fois ... Mais je ne sais pas comment faire et malgré mes recherches je sèche un peu.
L'inter clap agit comme un interrupteur et non pas un BP ...

En vous remerciant d'avance

donc ta détéction de "clap" se fait par un modul externe avec un contact sec, c'est bien ça ?

Bonsoir,

le problème vient du fait de l'utilisation à outrance de la fonction delay(), qui bloque la boucle autant de fois que cette fonction est appelée. Tu n'as donc, effectivement, pas d'autre choix que d'attendre le passage de chaque étape.

Il faut penser le programme autrement, et se tourner vers, au choix:

-la fonction millis()
-Une librairie qui gère ça (ex: ici)

Oui c'est un module externe, avec un contact sec, que je peux modifier en BP après réflexion.
Je vais me pencher sur ces différentes méthodes, je vous remercie pour la rapidité de vos réponses.

Bon après recherche j'ai un peux de mal avec la fonction millis, si je comprend bien je dois ajouter une variable qui mesure le temps, ensuite dans void setup initialiser le temps. Pour finir dans mon loop je dois dire que quand mon contact est fermé, j'allume les leds 1 et 15 et ajouter ensuite la fonction SI millis = 500 alors j'allumer les leds 2 et 14. Et ainsi de suite.

sinon, pourquoi ne pas creer un void ON et un void OFF, tu teste ton contact comme tu le fais actuellement mais plutot que d'executer des commandes ça lance ou ton ON ou ton OFF, plus court ça risque d'etre compliqué :wink:

Bonjour,

Tu passes ton temps à allumer des leds déjà allumées et éteindre des leds déjà éteintes, ce qui bloque la prise en compte du bouton.

Sans trop modifier ton programme tu peux faire le traitement uniquement quand bouton change d'état. Donc tu pourras allumer ou éteindre immédiatement à la fin de l'allumage ou de l'extinction ce qui sera déjà un grand progrès.

int EtatBouton = 0;

void setup()
{
  pinMode(23, INPUT); // Contact NO
  pinMode(24, OUTPUT); //L1
  pinMode(25, OUTPUT); //L2
  pinMode(26, OUTPUT); //L3
  pinMode(27, OUTPUT); //L4
  pinMode(28, OUTPUT); //L5
  pinMode(29, OUTPUT); //L6
  pinMode(30, OUTPUT); //L7
  pinMode(31, OUTPUT); //L8
  pinMode(32, OUTPUT); //L9
  pinMode(33, OUTPUT); //L10
  pinMode(34, OUTPUT); //L11
  pinMode(35, OUTPUT); //L12
  pinMode(36, OUTPUT); //L13
  pinMode(37, OUTPUT); //L14
  pinMode(38, OUTPUT); //L15

}

void loop()
{
  static int etatBoutonPrec = LOW; // état précédent du bouton

  EtatBouton = digitalRead(23);

  if (EtatBouton != etatBoutonPrec)  // teste si le bouton a changé d'état
  {
    if (EtatBouton == LOW)
    {
      digitalWrite(31, HIGH); //ETEINDRE L8
      delay(500);
      digitalWrite(30, HIGH); //ETEINDRE L7
      digitalWrite(32, HIGH); //ETEINDRE L9
      delay(500);
      digitalWrite(29, HIGH); //ETEINDRE L6
      digitalWrite(33, HIGH); //ETEINDRE L10
      delay(500);
      digitalWrite(28, HIGH); //ETEINDRE L5
      digitalWrite(34, HIGH); //ETEINDRE L11
      delay(500);
      digitalWrite(27, HIGH); //ETEINDRE L4
      digitalWrite(35, HIGH); //ETEINDRE L12
      delay(500);
      digitalWrite(26, HIGH); //ETEINDRE L3
      digitalWrite(36, HIGH); //ETEINDRE L13
      delay(500);
      digitalWrite(25, HIGH); //ETEINDRE L2
      digitalWrite(37, HIGH); //ETEINDRE L14
      delay(500);
      digitalWrite(24, HIGH); //ETEINDRE L1
      digitalWrite(38, HIGH); //ETEINDRE L15
    }
    else
    {
      digitalWrite(24, LOW); //ALLUMER L1
      digitalWrite(38, LOW); //ALLUMER L15
      delay(1000);
      digitalWrite(25, LOW); //ALLUMER L2
      digitalWrite(37, LOW); //ALLUMER L14
      delay(1000);
      digitalWrite(26, LOW); //ALLUMER L3
      digitalWrite(36, LOW); //ALLUMER L13
      delay(1000);
      digitalWrite(27, LOW); //ALLUMER L4
      digitalWrite(35, LOW); //ALLUMER L12
      delay(1000);
      digitalWrite(28, LOW); //ALLUMER L5
      digitalWrite(34, LOW); //ALLUMER L11
      delay(1000);
      digitalWrite(29, LOW); //ALLUMER L6
      digitalWrite(33, LOW); //ALLUMER L10
      delay(1000);
      digitalWrite(30, LOW); //ALLUMER L7
      digitalWrite(32, LOW); //ALLUMERL9
      delay(1000);
      digitalWrite(31, LOW);  //ALLUMER L8
    }
    etatBoutonPrec = EtatBouton;
  }
  delay(10);
}

Merci pour les astuces, je vais essayer tout ça.