Problema - creare effetto fade a striscia led ws2813.

Buonasera, sono nuovo di questo campo e avrei bisogno del vostro aiuto per correggere il mio codice, che allegherò di seguito.

Possiedo un Arduino Uno R3 ed una striscia di 50 cm con 30 led WS2813 e con essi vorrei creare un effetto dissolvenza con colori fissi, ma diversi per ogni led (per esempio led 0 colore bianco, led 1 colore rosso, led 2 colore blu... ecc.) ove l'intensità parta da 0(spenta) ed arrivi alla massima illuminazione in 3 minuti, pausa accesa di 5 minuti e dissolvenza in verso contrario.

Per ora sono riuscito a pilotare i led con i colori che voglio e creare un effetto "fade" di un unico colore senza però riuscire ad unirli.

Vi ringrazio anticipatamente per il vostro aiuto.

#include <FastLED.h>
#include <Adafruit_NeoPixel.h>


#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   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     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(30, PIN, NEO_GRB + NEO_KHZ800);

CRGB leds[NEO_GRB + NEO_KHZ800];

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel. Avoid connecting
// on a live circuit... if you must, connect GND first.

void setup() {
  
  FastLED.addLeds<WS2813, PIN, GRB>(leds,NEO_GRB + NEO_KHZ800);
  
  strip.begin();
  strip.show(); // initialize all pixels to "off"
}



void loop() {
  
  //sceglo i colori fissi da tenere ai led.
  
  leds[0] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[1] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[2] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[3] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[4] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);
  leds[5] = CRGB(0, 0, 255);
  FastLED.show();
  delay(500);  
  leds[6] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);  
  leds[7] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[8] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[9] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[10] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);
  leds[11] = CRGB(0, 0, 255);
  FastLED.show();
  delay(500);  
  leds[12] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);  
  leds[13] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[14] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[15] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[16] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[17] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);  
  leds[18] = CRGB(0, 0, 255);
  FastLED.show();
  delay(500);  
  leds[19] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);
  leds[20] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[21] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[22] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[23] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500);  
  leds[24] = CRGB(0, 0, 255);
  FastLED.show();
  delay(500);  
  leds[25] = CRGB( 255, 0, 0);
  FastLED.show();
  delay(500);
  leds[26] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[27] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
  leds[28] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);
  leds[29] = CRGB(170, 170, 170);
  FastLED.show();
  delay(500);  
   
  brighten();
  darken();
}

// 0 to 255
void brighten() {
  Serial.begin(9600);
  uint16_t i, j;

  for (j = 0; j < 255; j++) {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 0, 0, j);
    }
    strip.show();
    delay(10);
  }
  delay(1500);
}

// 255 to 0
void darken() {
  Serial.begin(9600);
    uint16_t i, j;

  for (j = 255; j > 0; j--) {
    for (i = 0; i < strip.numPixels(); i++) {
     strip.setPixelColor(i, 0, 0, j);
    }
    strip.show();
    delay(10);
    Serial.println(j);
  }
    delay(1500);
}

prova_fede_e_fitos_1.ino (3.72 KB)

Benvenuto,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

nid69ita

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:
Ed il cross posting è vietato

Pubblicata la presentazione, grazie per la dritta

Io uso solo la FastLED senza la Adafruit_NeoPixel.h

Definisco l'array dei led:
CRGB leds[NUM_LEDS];

Nel setup inizializzo con:
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
e imposto la luminosità di default dell'intera striscia:
FastLED.setBrightness(luminosita);

Poi nel loop, quando serve, imposto i vari colosi, nel mio caso con una funzione che ne calcola il colore in modo casuale, ma poco cambia (colors è un array di CRGB con i colori che mi servono già preimpostati tra cui scegliere in modo casuale):
leds[0] = colors[random(1, 7)];
leds[1] = colors[random(1, 7)];
leds[2] = colors[random(1, 7)];
leds[3] = colors[random(1, 7)];
...
alla fine dell'impostazione e non dopo ogni singola riga, faccio:
FastLED.show();
che invia tutti i dati alla striscia.
Nel tuo caso, questa parte la potresti fare nel setup, visto che i colori sono fissi e nel loop solamente temporizzare e fare le due operazioni seguenti:

FastLED.setBrightness(nuova_luminosita_calcolata_per_la_dissolvenza);
FastLED.show();
che reinvia tutto alla striscia con la nuova luminosità di tutto.

In maiuscolo le costanti numeriche tipicamente definite tramite #define all'inizio di tutto.

"luminosita" contiene valori da 0 a 255 se non ricordo male il range.

Occhio che il tutto consuma, quindi spero sia alimentato opportunamente e non da arduino altrimenti rischi il panevin anzitempo, considera 60mA a led.

Scusa se ti rispondo adesso, sono appena rientrato dal lavoro, ho cercato di aggiustare il codice, ma da novizio non ho capito molto.

Ho spostato tutta la questione del scegliere il colore nel setup (con i tuoi suggerimenti) e definendo le costati numeriche all'inizio.
Fin qui una passeggiata, adesso però ti chiedo, per cortesia, quale codice inserire nella sezione di loop, perché a dir il vero non sono riuscito a cambiarlo.

(allego codice "aggiornato")

#]include <FastLED.h>

#define DATA_PIN 6
#define NUM_LEDS 5

CRGB leds[NUM_LEDS];


void setup() {

 FastLED.addLeds< NEOPIXEL, DATA_PIN >(leds, NUM_LEDS);
 
 leds[0] = CRGB(170, 170, 170);
 leds[1] = CRGB(170, 170, 170); 
 leds[2] = CRGB(170, 170, 170);
 leds[3] = CRGB(170, 170, 170);
 leds[4] = CRGB(255, 0, 0);

 FastLED.show();

}

void loop() {
 
 analogWrite( leds, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);                       // wait for a second
 analogWrite( leds, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);


}

>Mikashitamo: ti ricordo che, indipendentemente dal numero di righe, in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo