[Résolu] NeoPixel 60 Ring Wall Clock arc en ciel

bonjour jai un 60 Ring Wall Clock jai trouver un code pour faire arc en ciel apres quelque bidouillie je suis tomber sur sa

#include <Adafruit_NeoPixel.h>

// pin ou est branché la commande dataIn du ring
#define LED_PIN  13

// Nombre de led
#define LED_COUNT  60

// NeoPixel luminosite, 0 (min) to 255 (max)
#define BRIGHTNESS 30

// Declare votre neopixel Ring
Adafruit_NeoPixel ring(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Nombre de Pixel dans le Ring
// Argument 2 = Wemos Pin
// Argument 3 = Pixel type
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Led cablé selon GRB (most NeoPixel products)
//   NEO_GRBW    Led cablé selon GRB + W (most NeoPixel products) + Led blanche


// definition des couleurs




void rainbow(int rainbowLoops,int F=100,int speed=3, int S=255) {
  int fadeVal=0, fadeMax;
  fadeMax=constrain(F, 1, 100);
  for(uint32_t firstPixelHue = 0; firstPixelHue < rainbowLoops*65536;
    firstPixelHue += 256) {

    for(int i=0; i<ring.numPixels(); i++) {
      uint32_t pixelHue = firstPixelHue + (i * 65536L / ring.numPixels());
      ring.setPixelColor(i, ring.gamma32(ring.ColorHSV(pixelHue, S,255* fadeVal / fadeMax )));
    }

    ring.show();
    delay(speed);

    if(firstPixelHue < 65536) {                              // Premiere boucle,
      if(fadeVal < fadeMax) fadeVal++;                       // fade in
    } else if(firstPixelHue >= ((rainbowLoops-1) * 65536)) { // Derniere boucle loop,
      if(fadeVal > 0) fadeVal--;                             // fade out
    } else {
      fadeVal = fadeMax; // boucle intermediaire fade=fademax
    }
  }
}

void setup() {

ring.begin();           // INITIALIZE NeoPixel ring object (REQUIRED)
ring.setBrightness(BRIGHTNESS); // Set BRIGHTNESS to about 1/5 (max = 255)
ring.show();            // Turn OFF all pixels ASAP

}

void loop() {
  rainbow(3,50);
  rainbow(5,100,10,200);

}

le problème c'est que au bous d'un moment il s’arrête puis recommence je veux qui tourne en continue
je pence que sa vien de cette partie

if(firstPixelHue < 65536) {                              // Premiere boucle,
      if(fadeVal < fadeMax) fadeVal++;                       // fade in
    } else if(firstPixelHue >= ((rainbowLoops-1) * 65536)) { // Derniere boucle loop,
      if(fadeVal > 0) fadeVal--;                             // fade out
    } else {
      fadeVal = fadeMax; // boucle intermediaire fade=fademax
    }

jai essayer d'enlever de ligne modifier des valeur mes sa marche pas

et si quelqun peux mespliquer le code plus en detail je suis preneur ^^

Pourquoi ne pas utiliser FastLED et sa commande fill_rainbow ?

désoler pour le temps de réponse j'ai regarder j'ai fait sa pour tester

#include "FastLED.h"
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
void setup() { 
FastLED.addLeds<NEOPIXEL, 6>(leds, NUM_LEDS); 
}
void loop() {
    //leds[30] = CRGB::Maroon; FastLED.show(); delay(30);
}

(un exemple qui étais dedans jai trouver sa pour effec arc en ciel

#include "FastLED.h"

[code]
    fill_rainbow (struct CRGB *pFirstLED, int numToFill, uint8_t initialhue, uint8_t deltahue=5)
}

mes je sais pas tros ou le mètre jai essayer a plusieurs endroits mes sa marche pas je vais encor essayer de chercher de mon coter si j'arrive toujour pas je revien de votre coter (merci lesept de ce que jai vue cette librairie est bien et permet plaint de truc :slight_smile:

Il faut que tu joues avec le paramètre initialhue.

Je crois que cette fonction remplit ton tableau de leds avec des couleurs dont la teinte (hue) varie depuis la valeur initiale avec un pas de deltahue. Avec les paramètres HLS, tu peux représenter les couleurs sur un cercle.

Tu vois que initial hue est uint8_t donc un byte. Elle varie de 0 à 255 puis repasse à 0. Comme sur un cercle. C'est pareil pour la teinte des leds. Initialhue est juste là valeur de teinte donnée à la première led du tableau. Le reste du tableau est rempli pas pas de deltahue, modulo 256.

Donc si dans la loop, tu mets par exemple

fill_rainbow (leds, NUM_LEDS , 0, 5);

ton tableau sera rempli avec les valeurs 0 5 10 15...
Comme tu as 60 leds, tu feras un tour du cercle des teintes avec un pas de 255/60 donc 4.

Il faut bien sûr mettre la commande qui affiche les leds

FastLED.show();

Maintenant, tu peux faire varier la valeur de initialhue à chaque exécution de la loop. Ça fera tourner ton arc en ciel sur ton anneau de leds. Il suffit d'ajouter une valeur constante à initialhue à chaque fois.

en cherchant jai trouver sa

#include <FastLED.h>

#define LED_PIN    13

// Information about the LED strip itself
#define NUM_LEDS    60
#define CHIPSET     WS2812B
#define COLOR_ORDER RGB
CRGB leds[NUM_LEDS];

#define BRIGHTNESS  128

#define TEMPERATURE_1 MetalHalide
#define TEMPERATURE_2 OvercastSky

// How many seconds to show each temperature before switching
#define DISPLAYTIME 100


void loop()
{
  // draw a generic, no-name rainbow
  static uint8_t starthue = 10;
  fill_rainbow( leds , NUM_LEDS , --starthue, 4);

  // Choose which 'color temperature' profile to enable.
  uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
  if( secs < DISPLAYTIME) {
    FastLED.setTemperature( TEMPERATURE_1 ); // first temperature
    leds[0] = TEMPERATURE_1; // show indicator pixel
  } else {
    FastLED.setTemperature( TEMPERATURE_2 ); // second temperature
    leds[0] = TEMPERATURE_2; // show indicator pixel
  }

  
  FastLED.show();
  FastLED.delay(8);
}

void setup() {
  delay( 3000 ); // power-up safety delay
  // It's important to set the color correction for your LED strip here,
  // so that colors can be more accurately rendered through the 'temperature' profiles
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalSMD5050 );
  FastLED.setBrightness( BRIGHTNESS );
}

tous marche sa tourne en rond avec un arc en ciel donc tous comme il faut seule problème la led0 (celle en première position) reste blanc et varie pas

désoler lesept j'ai pas vue ta réponse j'ai pas tous compris (le début avent le cercle des couleur)

et pour mon probleme de led blanche jai juste enlever

 Choose which 'color temperature' profile to enable.
  uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
  if( secs < DISPLAYTIME) {
    FastLED.setTemperature( TEMPERATURE_1 ); // first temperature
    leds[0] = TEMPERATURE_1; // show indicator pixel
  } else {
    FastLED.setTemperature( TEMPERATURE_2 ); // second temperature
    leds[0] = TEMPERATURE_2; // show indicator pixel
  }

L'important c'est que ça marche !
Désolé, c'est difficile à expliquer... Tu peux regarder et tester cet exemple, en changeant le nombre de leds

c'est pas grave merci pour FastLEd c'est bien comme librairie même si certain truc je fais oujour avec avec Adafruit_NeoPixel