Projet pour ma Cosplayeuse....

bonjour

comme le titre l indique ma femme est Cosplayeuse et pour son costume des conventions 2020, elle veux ajouter des effet de lumière a son costume.
après quelque recherche sur le web, le ruban a leds adressable et l Arduino nano est le plus pro piste as se projet.
Comme je suis complétement débutant dans se domaine, j entame mon apprentissage dans le monde des microcontrôleur. Au bout d un certain temps de recherche le code suivant sort.

#include <Adafruit_NeoPixel.h>

// Quelle broche sur l'Arduino est connectée au NeoPixels?
#define PIN   6

// Combien de NeoPixels sont attachés à l'Arduino?
#define LED_COUNT 50

// Déclarer notre objet strip NeoPixel:
Adafruit_NeoPixel strip(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

// fonction setup () - s'exécute une fois au démarrage --------------------------------

void setup() {

  strip.begin();// INITIALISE NeoPixel Strip Object (OBLIGATOIRE)
  strip.show(); // Désactive tous les pixels dès que possible

}

// fonction loop () - s'exécute de manière répétée tant que le tableau est activé ---------------

void loop() {

  colorWipe(strip.Color(0, 242, 255), 50);
  colorWipe(strip.Color(0, 0, 0), 50);

}

void colorWipe(uint32_t color, int wait) {
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, color);                        // Définit la couleur du pixel (en RAM)
    strip.show();                                          // Mise à jour de la bande pour correspondre
    strip.setBrightness(255);
    delay(100);

  }
}

je n en ai aucune fierté vue que j ai juste réussi a isoler l effet voulu d un des exemple de la librairie adafruit mais l allumage se fais trop brutal a mon gout.
j essaie de faire un truc simple pour vous, que sa s allume de maniéré progressif dans la 1ere ligne "colorWipe" et s eteingne toujours de manier progressif dans la 2eme ligne "colorwipe".
j ai voulue essaie de trouver le bon code source seul avec différent site d apprentissage et en dernier achat un livre "programmer avec Arduino en s amusant pour les nuls"....
j ai apprit beaucoup de chose avec c est différent support mais pas au point d y parvenir seul.
Encore plein de chose a apprendre mais plus que 6 mois pour le terminer. donc je me tourne vers vous afin de peaufiner son projet.

premièrement , merci d avoir pris le temps de lire ma tartine.
deuxièmement, merci de votre aide quel qu’il soit.

Tu peux déplacer le setBrightness dans le setup, il suffit de le faire une seule fois.

Pour régler la vitesse d'allumage et d'extinction, il faut changer delay(100); en delay(wait);
Ensuite, tu choisis la valeur de ce temps de pause grâce au dernier argument de colorWipe. Par exemple

colorWipe(strip.Color(0, 242, 255), 200);
colorWipe(strip.Color(0, 0, 0), 200);

bonjour lesept,

merci pour ton intervention rapide mais j ai due mal m exprimer.
Se n ai pas le délais d allumage entre les leds mais faire un allumage de manière progressif de ces dernier. avoir un effet plus fondue dans l allumage tout en gardant l effet chenillard. qu'elle ne s allume pas directement a 255 lumen mais part de zéro puis se met a briller de plus en plus et une fois que la dernière led s allume, l première s eteind toujours progressivement.

mais j ai qu'en même ajouter tes première modif du code.

Que donnerait

void loop() {

  colorWipe(strip.Color(0, 242, 255), 40);
  colorWipe(strip.Color(0, 190, 200), 40);
  colorWipe(strip.Color(0, 142, 155), 40);
  colorWipe(strip.Color(0, 90, 100), 40);
  colorWipe(strip.Color(0, 42, 51), 40);
  colorWipe(strip.Color(0, 0, 0), 50);

}

Ou une variation plus continue encore?

Essaye ça:

void colorWipe(uint32_t color, int wait) {
  int a;
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, color);                        // Définit la couleur du pixel (en RAM)
    for (a = 0; a <256; a++) {//  ou a = à + 5 si c'est trop lent
      strip.setBrightness(a);
      strip.show();                                          // Mise à jour de la bande pour correspondre
      delay(5);// 5 ou autre chose
    }
  }
}

Helric:
Se n ai pas le délais d allumage entre les leds mais faire un allumage de manière progressif de ces dernier. avoir un effet plus fondue dans l allumage tout en gardant l effet chenillard. qu'elle ne s allume pas directement a 255 lumen mais part de zéro puis se met a briller de plus en plus et une fois que la dernière led s allume, l première s eteind toujours progressivement.

mais j ai qu'en même ajouter tes première modif du code.

Donc chenillard, mais avec intensité croissante au fur et à mesure de l'allumage : c'est bien ça ? Ce que je ne comprends pas dans ta demande, c'est si l'augmentation de luminosité concerne l'ensemble des leds ou seulement celle qui s'allume en plus. C'est à dire : à chaque nouvelle led qui s'allume, est-ce seulement celle-ci qui est plus intense ou toutes celles qui sont allumées ?

Je dirais :

void colorWipe(uint32_t color, int wait) {
  int num = strip.numPixels();
  for (int i = 0; i < num; i++) {
    strip.setPixelColor(i, color*i/num);           // Définit la couleur du pixel (en RAM)
    strip.show();                                  // Mise à jour de la bande 
    delay(wait);
  }
}

A tester ...

Sinon, on remet la brightness dans la boucle :

void colorWipe(uint32_t color, int wait) {
  int num = strip.numPixels();
  for (int i = 0; i < num; i++) {
    int lumi = (int)(255.0*(i+1)/num);
    strip.setBrightness(lumi);
    strip.setPixelColor(i, color);           // Définit la couleur du pixel (en RAM)
    strip.show();                            // Mise à jour de la bande 
    delay(wait);
  }
}

Là, normalement, la luminosité augmente pour toutes les leds allumées à chaque nouvelle led.

EDIT : je vois que je ne suis pas seul sur le sujet...

avant tout chose, j ai tester tous vos code site, un minimum pour le travaille fournie pour m aide

dbrion06:
Que donnerait

void loop() {

colorWipe(strip.Color(0, 242, 255), 40);
 colorWipe(strip.Color(0, 190, 200), 40);
 colorWipe(strip.Color(0, 142, 155), 40);
 colorWipe(strip.Color(0, 90, 100), 40);
 colorWipe(strip.Color(0, 42, 51), 40);
 colorWipe(strip.Color(0, 0, 0), 50);

}




Ou une variation plus continue encore?

cela donne une variation trop par palier de lumière.

savoriano:
Essaye ça:

void colorWipe(uint32_t color, int wait) {

int a;
 for (int i = 0; i < strip.numPixels(); i++) {
   strip.setPixelColor(i, color);                        // Définit la couleur du pixel (en RAM)
   for (a = 0; a <256; a++) {//  ou a = à + 5 si c'est trop lent
     strip.setBrightness(a);
     strip.show();                                          // Mise à jour de la bande pour correspondre
     delay(5);// 5 ou autre chose
   }
 }
}

le ruban a leds reste eteinds, il me semble que j ai essayer un boucle for aussi mais que j avais ecrit sa plus de cette manière :

"for (int fadVal = 0; fadVal < 255; fadVal +=5)"

et sa n avais pas marcher non plus.

lesept:
Donc chenillard, mais avec intensité croissante au fur et à mesure de l'allumage : c'est bien ça ? Ce que je ne comprends pas dans ta demande, c'est si l'augmentation de luminosité concerne l'ensemble des leds ou seulement celle qui s'allume en plus. C'est à dire : à chaque nouvelle led qui s'allume, est-ce seulement celle-ci qui est plus intense ou toutes celles qui sont allumées ?

Je dirais :

void colorWipe(uint32_t color, int wait) {

int num = strip.numPixels();
 for (int i = 0; i < num; i++) {
   strip.setPixelColor(i, color*i/num);           // Définit la couleur du pixel (en RAM)
   strip.show();                                  // Mise à jour de la bande
   delay(wait);
 }
}



A tester ...

Sinon, on remet la brightness dans la boucle :


void colorWipe(uint32_t color, int wait) {
 int num = strip.numPixels();
 for (int i = 0; i < num; i++) {
   int lumi = (int)(255.0*(i+1)/num);
   strip.setBrightness(lumi);
   strip.setPixelColor(i, color);           // Définit la couleur du pixel (en RAM)
   strip.show();                            // Mise à jour de la bande
   delay(wait);
 }
}



Là, normalement, la luminosité augmente pour toutes les leds allumées à chaque nouvelle led.

EDIT : je vois que je ne suis pas seul sur le sujet...

se sont tous les leds déjà allumer qui gagne en intensité, le nouvelle led repart de 0 t intensité a chaque fois.

dans le 1er code le bleu ne reste pas stable et toute les 2, 3 leds, une s allume en vert.....
qu'en au 2eme, est très proche de l effet voulue. il est juste inverser ici par rapport a se que j essaie d avoir

On joue un peu au hasard car tu n'as pas expliqué précisément ce que tu veux faire.

Quand tu dis

il est juste inverser ici par rapport a se que j essaie d avoir

c'est pas très clair, car on ne sait pas ce que tu essaies d'avoir ni ce qui est inversé...

Difficile d'aider efficacement dans ces conditions. Donc soit on continue dans le noir et on perd du temps, soit tu expliques bien clairement.

je vais essayer de m appliquer dans mes explication...

dans l effet chenillard, les leds devrais s allumer de manière progressif. chaque nouvelle led qui s allume repart de 0 intensité. les leds déjà allumer continue de gagner en intensité.

dans le 2eme code que tu m a fournie, chaque nouvelle led qui s allume commence avec l intensité de la précédente

Je pense qu'on ne peut pas avoir une intensité différente pour chaque led, c'est un paramètre global pour l'ensemble du ruban. Du moins avec cette bibliothèque.

Peut-être que la bibliothèque FastLED pourrait traiter ce genre de besoin...?

Je pense qu'on ne peut pas avoir une intensité différente pour chaque led

Apparemment on peut.

strip.setPixelColor(n, red, green, blue, white);

Vu ici page 72

C'est un peu ce que j'avais essayé dans le premier code du message #5, mais différemment il est vrai puisque la couleur était codée sur un entier en 32 bits plutôt qu'avec trois valeurs sur 8 bits.

On essaiera demain...

bonjour

je suis pratiquement sur d avoir vue une vidéo avec l effet voulue, c est juste moi qui n arrive pas a bien expliquer clairement. je vais essayer de la retrouver. les image étant plus clair que mes mots.

Voila

pour éviter de mettre un long vidéo et dire aller a x temps de celle-ci, j ai filmer le moment voulue avec mon gsm. soyer indulgent sur la qualité.

ma 1er vidéo sur ma chaine youtube.... elle ne risque pas de faire le buzz.

Je confirme, l'oscar est encore loin... :grin:

Voilà ce que je propose :

#include <Adafruit_NeoPixel.h>
#define PIN        6
#define LED_COUNT 50
Adafruit_NeoPixel strip(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin(); // INITIALISE NeoPixel Strip Object (OBLIGATOIRE)
  strip.show();  // Désactive tous les pixels dès que possible
  strip.setBrightness(255);
}

void loop() {
  colorWipe(0, 242, 255, 50);
  colorWipe(0, 0, 0, 50);
}

void colorWipe(int red, int green, int blue, int wait) {
  int num = strip.numPixels();
  float coef = 1.0 / num;
  for (int i = 0; i < num; i++) {
    for (int j = 0; j < i; j++) {
      strip.setPixelColor(j, (int)(red * (j + 1) * coef), (int)(green * (j + 1) * coef), (int)(blue * (j + 1) * coef));
    }
    strip.show();
    delay(wait);
  }
}

ça compile, mais je ne sais pas si ça fera ce que tu veux...

bonjour,

après a voir teste le code... ce n est pas encore sa.
la, la 1er s allume avec un faible intensité et chaque nouvelles leds s allument avec un peu plus de luminosité. les précédente restant a l intensité a laquelle elles se sont allumées.

Et ça ?

#include <Adafruit_NeoPixel.h>
#define PIN        6
#define LED_COUNT 50
Adafruit_NeoPixel strip(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin(); // INITIALISE NeoPixel Strip Object (OBLIGATOIRE)
  strip.show();  // Désactive tous les pixels dès que possible
  strip.setBrightness(255);
}

void loop() {
  Serial.begin(115200);
  while (!Serial);
  colorWipe(0, 242, 255, 50);
  colorWipe(0, 0, 0, 50);
}

void colorWipe(int red, int green, int blue, int wait) {
//  char texte[30];
  int num = strip.numPixels();
  float coef = 1.0 / num;
  for (int i = 0; i < num; i++) {
    for (int j = 0; j < i; j++) {
      int redint = (int)(red * (i - j+1) * coef);
      int greenint = (int)(green * (i - j+1) * coef);
      int blueint = (int)(blue * (i - j+1) * coef);
//      sprintf (texte, "%d %d %d %d %d\n", i, j, redint, greenint, blueint);
//      Serial.println(texte);
      strip.setPixelColor(j, redint, greenint, blueint);
    }
//    Serial.println();
    strip.show();
    delay(wait);
  }
}

EDIT : petite modif cosmétique...

bonjour

se n est toujours pas sa....

maintenant je trouver sa, en recherchant sur internet :

#include <Adafruit_NeoPixel.h>

// Quelle broche sur l'Arduino est connectée au NeoPixels?
#define PIN   6

// Combien de NeoPixels sont attachés à l'Arduino?
#define LED_COUNT 26

// Déclarer notre objet strip NeoPixel:
Adafruit_NeoPixel strip(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

// fonction setup () - s'exécute une fois au démarrage --------------------------------

void setup() {

  strip.begin();// INITIALISE NeoPixel Strip Object (OBLIGATOIRE)
  strip.show(); // Désactive tous les pixels dès que possible

}

// fonction loop () - s'exécute de manière répétée tant que le tableau est activé ---------------

void loop() {
  colorFade(0, 242, 255, 150); // fade into red
  colorFade(0, 0, 0, 150); // and then into white
  delay(1000);
}

void colorFade(uint8_t r, uint8_t g, uint8_t b, uint8_t wait) {
  for (uint16_t i = 0; i < strip.numPixels(); i++) {
    uint8_t curr_r, curr_g, curr_b;
    uint32_t curr_col = strip.getPixelColor(i); // get the current colour
    curr_b = curr_col & 0xFF; curr_g = (curr_col >> 8) & 0xFF; curr_r = (curr_col >> 16) & 0xFF;  // separate into RGB components

    while ((curr_r != r) || (curr_g != g) || (curr_b != b)) { // while the curr color is not yet the target color
      if (curr_r < r) curr_r++; else if (curr_r > r) curr_r--;  // increment or decrement the old color values
      if (curr_g < g) curr_g++; else if (curr_g > g) curr_g--;
      if (curr_b < b) curr_b++; else if (curr_b > b) curr_b--;
      strip.setPixelColor(i, curr_r, curr_g, curr_b);  // set the color
      strip.show();
      // delay(wait);  // add a delay if its too fast
    }
    delay(1000);
    
  }
}

je ne sais pas si sa t aide. j ai bien un effet progressif mais même en mettant les delay a 1 sa reste plus lent que le delay 100 de mon 1er code. se qui coince un peu pour le projet.

sur le site en anglais que je ne maitrise pas.... merci google traduction, ils disaient que c est avec la décoloration des couleur qu il fais varier l intensiter des des couleur.