Go Down

Topic: gestion d'un bouton avec un bandeau LED (Read 126 times) previous topic - next topic

higgins91

Bonjour,
Je vous explique mon projet:
Un miroir dans la salle de bain, autour un ruban LED RGB adressable (pour ambiance), en haut un ruban LED, LED blanche ou adressable RGB je sais pas encore (pour maquillage), un bouton tactile (gestion ON/OFF) et une Nano.
Principe:
Au premier "touch", on allume le bandeau Blanc.
Au deuxième "touch", on allume le bandeau RGB (avec une animation).
au troisième "touch", on éteint le Blanc ,en laissant le RGB allumé
au quatrième "touch", on éteint le RGB.

Jusque là c'est pas trop compliqué. Là ou cela se corse c'est que je voudrais une animation sur le RGB. Et quand je mets l'animation dans mon code, le programme reste dans la boucle d'animation et ne prend plus en compte le bouton.
Donc j'ai intégré un check du bouton dans l'animation, mais cela ne "quitte" pas l'animation malgré le break. Il faut attendre la fin des for... pour sortir de l'animation et de nouveau avoir le bouton actif. (dans l'avenir la fonction d'animation sera en boucle "infinie")


Si vous avez une piste pour gérer complètement le bouton durant l'animation  (faire un double break par exemple ?)

Merci d'avance ;)

Voici mon code (inspiré d'un exemple neopixel)

Code: [Select]

/*
  Gestion de 2 rubans LED:
  1 LED Blanche pour maquillage
  1 LED couleur pour ambiance
  1 bouton pour tout faire:
  1 appui  = Mode 1 = allumage LED Blanche
  1 appui  = Mode 2 = allumage LED Couleur (laisse les blanche allumée)
  1 appui  = Mode 3 = eteindre LED blanche (laisse les couleurs allumée)
  1 appui  = Mode 4 = eteindre LED Couleur = toutes eteintes
*/
#include <Adafruit_NeoPixel.h>

#define bouton_entree   2 // PIN d'entrée du touch sensor pour ON/OFF et animation RGB
#define ruban_blanc    6  // PIN connectée au ruban blanc
#define ruban_couleur    7  // PIN connectée au ruban couleur
#define Nb_PIXEL_blanc 40  // nombre de LED du ruban blanc
#define Nb_PIXEL_couleur 60  // nombre de LED du ruban couleur

// déclare 2 strip LED
Adafruit_NeoPixel stripB(Nb_PIXEL_blanc, ruban_blanc, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripC(Nb_PIXEL_couleur, ruban_couleur, NEO_GRB + NEO_KHZ800);

int mode_led = 4;

void setup() {
  // initialise la voie serie
  Serial.begin(9600);
  // initialise le bouton
  pinMode(bouton_entree, INPUT_PULLUP);
  // initialise les bandeaux led
  stripB.begin(); // Initialize NeoPixel strip object (REQUIRED)
  stripB.show();  // Initialize all pixels to 'off'
  stripC.begin(); // Initialize NeoPixel strip object (REQUIRED)
  stripC.show();  // Initialize all pixels to 'off'
}

void loop() {

  // etat du bouton tactile
  boolean etat_bouton = digitalRead(bouton_entree);
//  Serial.print("Etat bouton = ");
//  Serial.println(etat_bouton);

  // on verifie l'état du bouton
  if (etat_bouton == 1) {
    Serial.println("Bouton pressé");
    // activation bouton on traite l'info

    Serial.print("Mode_led=");
    Serial.println(mode_led);

    if (++mode_led > 4) mode_led = 1; // avance le mode de +1 jusqu'a 4
    switch (mode_led) {          // choix suivant le mode
      case 1:
        Serial.println("Mode 1 = blanc allumé et couleur éteinte");
        stripB.clear();         //   efface les pxl = OFF
        for (int i = 0; i < stripB.numPixels(); i++) { //passe les pxl 1 par 1
          stripB.setPixelColor(i, 64); // definie le pxl à la couleur
          delay(10);
        }
        stripB.show(); // affiche le resultat
        break;
      case 2:
        Serial.println("Mode 2 = blanc reste allumé et couleur allumé");
        
          // Hue of first pixel runs 3 complete loops through the color wheel.
          // Color wheel has a range of 65536 but it's OK if we roll over, so
          // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
          // means we'll make 3*65536/256 = 768 passes through this outer loop:
          for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256) {
            for (int i = 0; i < stripC.numPixels(); i++) { // For each pixel in strip...
              // Offset pixel hue by an amount to make one full revolution of the
              // color wheel (range of 65536) along the length of the strip
              // (strip.numPixels() steps):
              int pixelHue = firstPixelHue + (i * 65536L / stripC.numPixels());
              // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
              // optionally add saturation and value (brightness) (each 0 to 255).
              // Here we're using just the single-argument hue variant. The result
              // is passed through strip.gamma32() to provide 'truer' colors
              // before assigning to each pixel:
              stripC.setPixelColor(i, stripC.gamma32(stripC.ColorHSV(pixelHue)));

//scan le bouton si il est de nouveau pressé
              boolean etat_bouton = digitalRead(bouton_entree);
                if (etat_bouton == 1) {
                  mode_led = 3;
                  Serial.println("Mode 3 FORCE durant annimation = blanc éteint et couleur reste allumé");
                  stripB.clear();         //   efface les pxl = OFF
                  stripB.show();  // affiche

                  break;
                }

            }
            stripC.show(); // Update strip with new contents
            delay(20);  // Pause for a moment
          }

        Serial.println("après mode 2");
        break;
      case 3:
        Serial.println("Mode 3 = blanc éteint et couleur reste allumé");
        stripB.clear();         //   efface les pxl = OFF
        stripB.show();  // affiche
        break;
      case 4:
        Serial.println("Mode 4 = blanc éteint et couleur éteinte");
        stripC.clear();         //   efface les pxl = OFF
        stripC.show();  // affiche
        break;
    }
  }


}


kamill

Bonjour,

Tu mets un flag pour sortir le la première boucle.
Par exemple bExit:
Code: [Select]

      case 2:
        {
        Serial.println("Mode 2 = blanc reste allumé et couleur allumé");

        // Hue of first pixel runs 3 complete loops through the color wheel.
        // Color wheel has a range of 65536 but it's OK if we roll over, so
        // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
        // means we'll make 3*65536/256 = 768 passes through this outer loop:
        bool bExit=false;
        for (long firstPixelHue = 0; firstPixelHue < 3 * 65536 && !bExit; firstPixelHue += 256) {
          for (int i = 0; i < stripC.numPixels(); i++) { // For each pixel in strip...
            // Offset pixel hue by an amount to make one full revolution of the
            // color wheel (range of 65536) along the length of the strip
            // (strip.numPixels() steps):
            int pixelHue = firstPixelHue + (i * 65536L / stripC.numPixels());
            // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
            // optionally add saturation and value (brightness) (each 0 to 255).
            // Here we're using just the single-argument hue variant. The result
            // is passed through strip.gamma32() to provide 'truer' colors
            // before assigning to each pixel:
            stripC.setPixelColor(i, stripC.gamma32(stripC.ColorHSV(pixelHue)));

            //scan le bouton si il est de nouveau pressé
            boolean etat_bouton = digitalRead(bouton_entree);
            if (etat_bouton == 1) {
              mode_led = 3;
              Serial.println("Mode 3 FORCE durant annimation = blanc éteint et couleur reste allumé");
              stripB.clear();         //   efface les pxl = OFF
              stripB.show();  // affiche

              bExit=true;
              break;
            }

          }
          stripC.show(); // Update strip with new contents
          delay(20);  // Pause for a moment
        }

        Serial.println("après mode 2");
        }
        break;

higgins91

je ne vois pas ce que fait le flag, car je reste dans le " for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256) {" tant que c'est pas fini.

Je voudrais que lorsque le bouton est appuyé, on sorte de tout ce bloc:

Code: [Select]
          for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256) {
            for (int i = 0; i < stripC.numPixels(); i++) { // For each pixel in strip...
              // Offset pixel hue by an amount to make one full revolution of the
              // color wheel (range of 65536) along the length of the strip
              // (strip.numPixels() steps):
              int pixelHue = firstPixelHue + (i * 65536L / stripC.numPixels());
              // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
              // optionally add saturation and value (brightness) (each 0 to 255).
              // Here we're using just the single-argument hue variant. The result
              // is passed through strip.gamma32() to provide 'truer' colors
              // before assigning to each pixel:
              stripC.setPixelColor(i, stripC.gamma32(stripC.ColorHSV(pixelHue)));

//scan le bouton si il est de nouveau pressé
              boolean etat_bouton = digitalRead(bouton_entree);
                if (etat_bouton == 1) {
                  mode_led = 3;
                  Serial.println("Mode 3 FORCE durant annimation = blanc éteint et couleur reste allumé");
                  stripB.clear();         //   efface les pxl = OFF
                  stripB.show();  // affiche

                  break;
                }

            }
            stripC.show(); // Update strip with new contents
            delay(20);  // Pause for a moment
          }


en VB6 je pourrais faire (un peut moche mais fonctionnel)  un "GOTO suite"
en plaçant suite: a la fin du bloc ci dessus.
Y'a t-il cette possibilité avec l'arduino ?

merci pour ta réponse ;)

kamill

Relis bien le code que je t'ai proposé et tu verras que le flag est testé dans le premier for.

higgins91

 :-[ pas vu la subtilité!

je vais tester cela en rentrant ce soir, merci ;)

higgins91

Bon j'ai avancé dans le code et testé les modifications.
J'ai modifié le code pour faire un fonctionnement différent,
soit on allume/éteint le blanc via un relai sur D6, soit les couleurs sur D7. je verrais si les 2 en même temps c'est utile.
J'ai aussi rajouté une variable d'état pour savoir si le bouton est déjà pressé ou si il a été relâché (avant l'état du mode led variait 10 fois le temps de l'appui!)

Code: [Select]

#include <Adafruit_NeoPixel.h>

#define bouton_entree   2 // PIN d'entrée du touch sensor pour ON/OFF et animation RGB
#define ruban_blanc    6  // PIN connectée au ruban blanc
#define ruban_couleur    7  // PIN connectée au ruban couleur
#define Nb_PIXEL_couleur 60  // nombre de LED du ruban couleur
int etat_precedent=0;

// déclare 1 strip LED pour RGB
Adafruit_NeoPixel stripC(Nb_PIXEL_couleur, ruban_couleur, NEO_GRB + NEO_KHZ800);

int mode_led = 4;

void setup() {
  // initialise la voie serie
  Serial.begin(9600);
  // initialise le bouton
  pinMode(bouton_entree, INPUT_PULLUP);
  pinMode(ruban_blanc, OUTPUT);
  // initialise le bandeau led
  stripC.begin(); // Initialize NeoPixel strip object (REQUIRED)
  stripC.show();  // Initialize all pixels to 'off'
}

void loop() {

  // etat du bouton tactile
  boolean etat_bouton = digitalRead(bouton_entree);

  // on verifie l'état du bouton
  if ((etat_bouton == 1) && (etat_precedent == 0)) {
    etat_precedent = 1;
    Serial.println("Bouton pressé");
    // activation bouton on traite l'info

    Serial.print("Mode_led=");
    Serial.println(mode_led);
    Serial.print("etat_precedent=");
    Serial.println(etat_precedent);
   
    if (++mode_led > 4) mode_led = 1; // avance le mode de +1 jusqu'a 4
    switch (mode_led) {          // choix suivant le mode
      case 1:
        Serial.println("Mode 1 = blanc allumé et couleur éteinte");
        digitalWrite(ruban_blanc, HIGH);
        stripC.clear();         //   efface les pxl = OFF
        stripC.show();  // affiche
        break;

      case 2:
        Serial.println("Mode 2 = blanc éteint");
        digitalWrite(ruban_blanc, LOW);
        stripC.clear();         //   efface les pxl = OFF
        stripC.show();  // affiche
        break;

      case 3:
        Serial.println("Mode 3 = couleur allumé");

        // Hue of first pixel runs 3 complete loops through the color wheel.
        // Color wheel has a range of 65536 but it's OK if we roll over, so
        // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
        // means we'll make 3*65536/256 = 768 passes through this outer loop:
        bool bExit = false;
        for (long firstPixelHue = 0; firstPixelHue < 3270 * 65536 && !bExit; firstPixelHue += 256) {
              Serial.print("firstPixelHue=");
              Serial.println(firstPixelHue);
         
          for (int i = 0; i < stripC.numPixels(); i++) { // For each pixel in strip...
            // Offset pixel hue by an amount to make one full revolution of the
            // color wheel (range of 65536) along the length of the strip
            // (strip.numPixels() steps):
            int pixelHue = firstPixelHue + (i * 65536L / stripC.numPixels());
            // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
            // optionally add saturation and value (brightness) (each 0 to 255).
            // Here we're using just the single-argument hue variant. The result
            // is passed through strip.gamma32() to provide 'truer' colors
            // before assigning to each pixel:
            stripC.setPixelColor(i, stripC.gamma32(stripC.ColorHSV(pixelHue)));

            //scan le bouton si il est de nouveau pressé
            boolean etat_bouton = digitalRead(bouton_entree);
            if ((etat_bouton == 1) && (etat_precedent == 0)) {
              Serial.println("Bouton pressé");
              etat_precedent = 1;
              Serial.print("etat_precedent=");
              Serial.println(etat_precedent);
              mode_led = 4;
              Serial.println("Mode 4 = blanc éteint et couleur éteinte");
              stripC.clear();         //   efface les pxl = OFF
              stripC.show();  // affiche
              digitalWrite(ruban_blanc, LOW);
              bExit = true;
              break;
            }
            if (etat_bouton == 0) {
              etat_precedent = 0;
            }

          }
          stripC.show(); // Update strip with new contents
          delay(20);  // Pause for a moment
        }
        Serial.println("fin du mode 3 après la boucle FOR par securité on coupe tout!");
        digitalWrite(ruban_blanc, LOW);
        stripC.clear();         //   efface les pxl = OFF
        stripC.show();  // affiche
       
        break;

    }
  }

  if (etat_bouton == 0) {

    etat_precedent = 0;

  }


}


reste plus qu'a tout installer...

Go Up