Réglage luminosité d'une bande Led

Bonjour @ ts,

J'ai pas beaucoup évolué dans le monde d'Arduino (en programmation et c'est pour cela que je viens vers vous.

Mon fils voudrait aménager son bureau en mettant une bande led RGB pour le rendre plus fun. J'ai trouvé un code assez sympa et je voudrai modifier une partie où toutes les leds s'allument d'une couleur pendant un certain temps.
Ce que je voudrai faire c'est qu'elle s'allume progressivement puis s'éteignent de la même façon.
Pour l'instant la luminosité a été définie à "100" pour toutes les séquences et je voudrai le changer juste pour cette partie.

Je met le code, enfin que la partie que je voudrai modifier (je ne met pas les autres séquences que je conserve tel quel.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

#define NUM_LEDS 60
 
#define BRIGHTNESS 100

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {

 MediumVioletRed();
  delay(2000);
}


void MediumVioletRed() {
   
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(199,21,133) );
    }
      strip.show();
}

Merci par avance pour votre aide...

@+
Didier

ben vous appelez   strip.setBrightness(xxx); avant votre effet avec xxx étant la luminosité souhaitée, puis après l'effet vous appelez   strip.setBrightness(BRIGHTNESS);pour remettre comme c'était avant

Bonjour et merci pour votre réponse.

Si j'ai bien compris il faut que je mette la ligne "strip.setBrightness(xxx);" comme cela:

void MediumVioletRed() {
   
 
     [b]strip.setBrightness(xxx);[/b]

    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(199,21,133) );
    }
      strip.show();
}

Puis dans la boucle du "void loop" après la sequence "void MeediumVioletRed" remettre "strip.setBrightness(BRIGHTNESS);"

Par contre je voudrais faire, je ne sais pas si on peut appeler ça comme ça, un Fade In et un Fade out (augmentation et extinction progressifs de la luminosité) est-ce que si je remplace xxx par une variable f (par exemple) et que au début de void MediumVioletRed j’insère une boucle for(f=0; f<150; f++) et en mettant également un delay après le strip.show();
puis refaire la même chose en sens inverse ça pourrait fonctionner?

Merci par avance pour votre réponse.

@+
Didier

à chaque fois que vous appelez strip.setBrightness() et qu'ensuite vous faites un strip.show(); la nouvelle luminosité est prise en compte

donc oui si vous voulez que la luminosité varie pendant l'effet, il faut changer cette luminosité dans la boucle

Bonjour et merci pour l'info.

Voici le code modifié:

void MediumVioletRed() {

   for(int b=0; b<150; b++) {
  strip.setBrightness(b);
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(199,21,133) );
    }
      strip.show();
      delay(20);
   }   
    for(int b=150; b>0; b--) {
  strip.setBrightness(b);
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(199,21,133) );
    }
      strip.show();
      delay(20);
   }
}

Je vais encore abuser de vous car je voudrais aller plus loin dans le code.
Pour l'instant le code fonctionne pour une couleur, mais si je voudrais le faire avec plusieurs couleurs.
Je sais que je pourrai le faire en copiant la séquence et en changeant les valeurs x,y,z de "strip.Color(x,y,z)". Cela risque prendre pas mal de mémoire à partir d'un certain nombre de couleurs. Du coup je pensais créer un tableau en renseignant les couleurs voulues et aller chercher les valeurs de x,y,z de chaque couleur dans ce tableau.
Comme je l'ai écrit au début du post, je n'ai pas beaucoup de connaissance avec Arduino et je n'ai jamais utilisé de tableau (ce serait l'occasion d'apprendre à le faire).

Pourriez-vous m'aider, svp, à réaliser cette modification?

Encore merci par avance pour votre réponse.

@+
Didier

vous pouvez passer les couleurs en paramètres à votre fonction, et pendant que vous y êtes aussi mettre le 20ms d'attente en paramètre avec une valeur par défaut.

void animationCouleur(byte rouge, byte vert, byte bleu, byte deltaT = 20) {

  for (int b = 0; b < 150; b++) {
    strip.setBrightness(b);
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(rouge, vert, bleu) );
    }
    strip.show();
    delay(deltaT);
  }
  for (int b = 150; b > 0; b--) {
    strip.setBrightness(b);
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(rouge, vert, bleu) );
    }
    strip.show();
    delay(deltaT);
  }
}

il suffit ensuite de donner 3 valeurs lors de l'appel pour les couleurs et une pour la durée d'attente par exemple

 animationCouleur(199,21,133); // prendra 20 comme attente par défaut
animationCouleur(199,21,133, 10); // prendra 10 comme attente

Les valeurs des paramètres pourraient bien entendu provenir d'un tableau si vous le souhaitez

const byte couleurs[][3] = {
  {255, 0, 0},
  {0, 255, 0},
  {0, 0, 255},
  {199, 21, 133}
};

const byte nbCouleurs = sizeof(couleurs) / sizeof(couleurs[0]);

// .... plus loin 

for (byte i = 0; i < nbCouleurs; i++)
  animationCouleur(couleurs[i][0], couleurs[i][1], couleurs[i][2]);

Bonjour et à nouveau merci pour ces explications,

Effectivement, entre temps j'ai trouvé un exemple "strantest" dans le logiciel Arduino qui utilise votre 1ère solution.

Mais la solution du tableau que vous avez indiquée me permet de voir comment cela fonctionne et de pouvoir l'utiliser dans d'autre circonstance.

Si je peux abuser de vos connaissances, j'aimerai revenir sur l'utilisation de "strip.setBrightness(xxx);"
car je voudrai faire une autre séquence d'allumage où cette fois-ci je voudrai allumer plusieurs led en même temps mais avec un intensité lumineuse progressive. Je m'explique: allumer 20 leds(par exemple) avec l'intensité de la 1ère à 8, la 2éme à 16, la 3ème à 24, etc... jusqu'à 160 pour la dernière.

Elles s'allumeraient pendant 5s.

Pour l'instant je n'ai réussi qu'à les allumer toutes à la même intensité progressivement (comme l'objet de mon1er post) ou alors ça bloque et ne s'allume pas du tout.

A nouveau merci par avance pour votre réponse.

@+
Didier

strip.setBrightness() c'est pour tout le bandeau. si vous voulez une intensité moindre, il faut utiliser un courant moins fort dans la LED. par exemple strip.setPixelColor(0, strip.Color(10, 0, 0) );va allumer le premier pixel en rouge peu brillant, alors que strip.setPixelColor(0, strip.Color(127, 0, 0) );sera à la moitié de la brillance et enfin strip.setPixelColor(0, strip.Color(255, 0, 0) );sera un rouge le plus brillant possible.

C'est un peu approximatif car l'oeil ne perçoit pas la brillance de la même façon pour chaque couleur primaire et l'échelle n'est pas non plus linéaire.

Une meilleure façon de faire est de ne pas décrire les couleurs en RGB mais en HSB mais je ne crois pas que la bibliothèque Adafruit_NeoPixel propose cela (fastLED le permet). En mode HSB on définit les couleurs par une teinte (H pour Hue), un Saturation (S pour Saturation) et une Brillance (B pour Brightness). donc en jouant simplement sur le dernier paramètre on peut changer la brillance perçue d'un pixel.

Je comprend mieux pourquoi ça c'était toute la bande qui prenait la valeur de strip.setPixelColor() et non la led.

Encore merci pour toutes ces explications.

Je vais donc essayer ça dès que possible et je reviendrai vers vous pour vous montrer les résultats si j'arrive à faire ce que je veux ;D

@+
Didier