Go Down

Topic: LED SEQUENZA NEOPIXEL (Read 541 times) previous topic - next topic

Federico66

la luminosità la reimposta solo se arriva dal telecomando il giusto comando e visto che usa un solo tasto credo che voglia  avere comunque un feedback immeiato della luminosità impostata. Dentro l'if del comando fa incrementi di uno ogni pressione del tasto, quando arriva al massimo inizia a decrementare. Se non aggiorna la luminosità ad ogni comando non "vede" a che punto è.
Vero, mi sono dimenticato di aggiungere che (visto che deve riscrivere il programma) dovrebbe gestirli (+o-) a STATI, perchè cosi com'è, quando cambia la luminosità, interrompe la sequenza (resta acceso solo l'ultimo), e deve ri-comadare per far ripartire l'intera sequenza con la nuova luminosità, altrimenti cambia la luminosità solo di quello acceso.

Usando una logica a stati, la nuova luminosità è solo un nuovo parametro prima dello show.
Risparmia la sequenza di aggiornamenti per la sola luminosità, ed ha una risposta quasi immediata mentre la sequenza è in corso.

Federico

PS
Sto usando questa logica per il mio WordClock, dove la luminosità la regolo manualmente con uno slider dallo smarphone, o automaticamente con una fotoresistenza e un LDR ;)
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Federico66

Ricordati che, con gli APA102, il metodo più veloce per trasmettere dati è usare il bus SPI...
... si ma io sto ottimizzando con i neopixel, gli APA li ho nel carrello degli acquisti per un futuro progetto ;)

Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

gpb01

... si ma io sto ottimizzando con i neopixel, gli APA li ho nel carrello degli acquisti per un futuro progetto ;)


Guglielmo
Search is Your friend ... or I am Your enemy !

thewolf87

ho inserito nel post iniziale un video per far capire la sequenza corretta.

il regolare la luminosità, è un passo successivo che viene effettuato solo a sequenza primaria terminata.


fabpolli

#19
Nov 13, 2019, 09:01 am Last Edit: Nov 13, 2019, 09:01 am by fabpolli
La sequenza era chiara, modifica il tuo codice con l'uso del for, se dopo averlo modificato non funziona come vuoi tu o hai problemi postalo che ti aiutiamo.
La luminosità poi la vediamo in un secondo momento (non è che ci sia molto da fare comunque)

Federico66

Concordo con @fabpolli, la sequenza era già chiara, quello che devi fare è cercare di costruire una procedura con un ciclo for (forse 2), e qualche condizione, che sia indipendente dal numero di led, e che in pratica riproduce quella sequenza di accensione e spegnimento (condizionati) che hai già scritto.

In pratica si potrebbe schematizzare così
Code: [Select]

0X 1X 2X 3X 4
0X 1X 2X 3
0X 1X 2
0X 1
0

dove ogni numero rappresenta il led che accendi, e la successiva X indica che lo spegni; per ogni ciclo (riga) non spegni l'ultimo, quindi alla fine sono tutti accessi.
Quindi hai bisogno di due cicli (sui led) innestati, due condizioni per verificare se accendere e se spegnere e un contatore.

Come dice @fabpolli, prova a scrivere qualcosa e postalo.

Federico

PS
Il modo migliore per schematizzare un processo (ciclico) è usare carta, matita e "disegnarlo".
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

thewolf87

ok con questo riesco ad accenderli e spegnerli in sequenza

Code: [Select]

#include <Adafruit_NeoPixel.h>
#define NL 5
#define COM 6
Adafruit_NeoPixel led = Adafruit_NeoPixel(NL, COM, NEO_GRB + NEO_KHZ800);

void setup() {
    led.begin();
  led.show();
}

int c = 0;
void loop() {
for (int i = 0; i < NL; i++) {
    int r = (c % NL);
    if (i == r) {
      led.setPixelColor(i, led.Color(0,120,120)); 
    } else {
      led.setPixelColor(i, led.Color(0,0,0));   
    } 
    }
  led.show();
  delay(1000);
  c++;
   }


ora la mia domanda è: come faccio a dire fare in modo che l'ultimo led resti acceso e a scalare li lasci accesi tutti?

Maurotec

#22
Nov 19, 2019, 03:31 am Last Edit: Nov 19, 2019, 03:34 am by Maurotec
Quote
PS
Il modo migliore per schematizzare un processo (ciclico) è usare carta, matita e "disegnarlo".
Grazie pensavo fossi io il rinco che non capisce la sequenza.

ON(0) OFF(0) ON(1) OFF(1) ON(2) OFF(2) ON(3) OFF(3) ON (4)
ON(0) OFF(0) ON(1) OFF(1) ON(2) OFF(2) ON(3)
ON(0) OFF(0) ON(1) OFF(1) ON(2)
ON(0) OFF(0) ON(1)
ON (0)

Esprimendolo a parole accendili e spegni tutti a partire da 0 fino 3, tranne il 4° che devi solo accendere
4° che è l'ultimo.

Code: [Select]

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
#define NL 5
byte lastLed = NL;

void ciclaLed(byte last) {
  for (byte idx = 0; idx < last; idx++) {
    //led.setPixelColor(idx, led.Color(0, 120, 120));
    Serial.print("ON(");
    Serial.print(idx);
    Serial.print(")");
    delay(200);
    if (idx != last - 1) {
      //led.setPixelColor(idx, led.Color(0, 0, 0));
      Serial.print("OFF(");
      Serial.print(idx);
      Serial.print(") ");
      delay(200);
    }
  // led.show();
  } // end for
  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
  if (lastLed > 0) {
    ciclaLed(lastLed);
    lastLed--;
  }
}


L'output in serial monitor:

ON(0)OFF(0) ON(1)OFF(1) ON(2)OFF(2) ON(3)OFF(3) ON(4)
ON(0)OFF(0) ON(1)OFF(1) ON(2)OFF(2) ON(3)
ON(0)OFF(0) ON(1)OFF(1) ON(2)
ON(0)OFF(0) ON(1)
ON(0)




Ciao.

fabpolli

Come ti ha detto @Federico66 ti servono due cicli for uno dentro l'altro, quello esterno io lo farei decrescente e quello interno simile a quanto hai già scritto, io farei così:
Code: [Select]

for (byte idxExt = NL; idxExt >=0 ; idxExt--) /Scorrendo all'indietro l'ultimo resta acceso
{
  for(byte idxInt = 0; idxInt <= idxExt; idxInt++)
  {
     if(idxInt>0) //Dal secondo ciclo spengo il led precedente
     {
        led.setPixelColor(idxInt-1, led.Color(0,0,0));
     }
     led.setPixelColor(idxInt, led.Color(0,120,120));
  }
}

Scritto di getto senza provare, potrebbe non funzionare alla perfezione, provalo  ;)

Federico66

ora la mia domanda è: come faccio a dire fare in modo che l'ultimo led resti acceso e a scalare li lasci accesi tutti?
Devi aggiungere una condizione per lo spegnimento, cioè spegni solo se non è l'ultimo.


Questa è la mia versione
Code: [Select]

#define LED_COUNT 5

void setup() {
  Serial.begin(9600);
}


void sequence1(){
  uint8_t current = LED_COUNT - 1;
  for (uint8_t c = 0; c < LED_COUNT; c++) {
    for (uint8_t led = 0; led < LED_COUNT; led++) {
      if (led <= current) {
        //strip.setPixelColor(led, strip.Color(0, 120, 120));
        Serial.print(led);
        delay(200);
        if (led < current) {
          //strip.setPixelColor(led, strip.Color(0, 0, 0));
          Serial.print("X");
        } else {
          Serial.print(" ");
        }
        //strip.show();
      }
    }
    current--;
    Serial.println();
  }  
}

void loop() {
  sequence1();
  delay(1000);
  //fai altro

}



Rispetto a quella di @Maurotec è chiusa tutta in una funzione, ho ipotizzato che dopo volessi fare altro, spegnerli, variare luminosità, etc, così, per il momento ti risparmi una gestione a stati. Non volevo aggiungere carne al fuoco :)


Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Federico66

Grazie pensavo fossi io il rinco che non capisce la sequenza.
Oramai alla mia età, se non uso carta e penna faccio fatica ;)
In realtà l'ho sempre fatto, è un modo come un'altro per "vedere" e memorizzare.


Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Federico66

...quello esterno io lo farei decrescente
Vero, lo rende più conciso...

Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

thewolf87

Come ti ha detto @Federico66 ti servono due cicli for uno dentro l'altro, quello esterno io lo farei decrescente e quello interno simile a quanto hai già scritto, io farei così:
Code: [Select]

for (byte idxExt = NL; idxExt >=0 ; idxExt--) /Scorrendo all'indietro l'ultimo resta acceso
{
  for(byte idxInt = 0; idxInt <= idxExt; idxInt++)
  {
     if(idxInt>0) //Dal secondo ciclo spengo il led precedente
     {
        led.setPixelColor(idxInt-1, led.Color(0,0,0));
     }
     led.setPixelColor(idxInt, led.Color(0,120,120));
  }
}

Scritto di getto senza provare, potrebbe non funzionare alla perfezione, provalo  ;)
questo è quello più semplice.

l'unica cosa, c'è la possibilità di evitare il primo ciclo in cui nessuno resta acceso?
li sto studiando un pò tutti per capire la logica di base

fabpolli

#28
Nov 25, 2019, 09:20 am Last Edit: Nov 25, 2019, 09:21 am by fabpolli
Suppogo di si, senza avere il progetto in mano potrei fare solo supposizioni. Ma evito appositamente di farle, non me ne volere, sembrerò cattivo ma visto che hai notato che il primo ciclo va a vuoto (spegne tutti i led) come hai fatto ad analizzare la questione? Avrai stampato dei valori sulla seriale o ti sei limitato a guardare i led? Se è la seconda ipotesi, mettiti dei messaggi di debug e controlla cosa succede all'interno dei due for e prova a trovare una soluzione in autonomia. Nella tua presentazione hai dichiarato di voler colmare le tue lacune in ambito di programmazione, il debug è molto molto molto utile per imparare, anche se all'inizio può essere sconfortante.
Personalmete ti ho buttato giù il codice perchè ho visto nelel tue risposte la volontà di applicare i suggerimenti forniti, altrimenti non avrei neanche buttato giù il pezzetto e ti avrei fornito solo il pseudocodice. Tutto 'sto pippine che continuerò ad aiutarti... soprattutto ad imparare!
La soluzione è molto molto semplice se ho individuato la casistica che fa spegnere tutti i led al primo giro ;)

thewolf87

Suppogo di si, senza avere il progetto in mano potrei fare solo supposizioni. Ma evito appositamente di farle, non me ne volere, sembrerò cattivo ma visto che hai notato che il primo ciclo va a vuoto (spegne tutti i led) come hai fatto ad analizzare la questione? Avrai stampato dei valori sulla seriale o ti sei limitato a guardare i led? Se è la seconda ipotesi, mettiti dei messaggi di debug e controlla cosa succede all'interno dei due for e prova a trovare una soluzione in autonomia. Nella tua presentazione hai dichiarato di voler colmare le tue lacune in ambito di programmazione, il debug è molto molto molto utile per imparare, anche se all'inizio può essere sconfortante.
Personalmete ti ho buttato giù il codice perchè ho visto nelel tue risposte la volontà di applicare i suggerimenti forniti, altrimenti non avrei neanche buttato giù il pezzetto e ti avrei fornito solo il pseudocodice. Tutto 'sto pippine che continuerò ad aiutarti... soprattutto ad imparare!
La soluzione è molto molto semplice se ho individuato la casistica che fa spegnere tutti i led al primo giro ;)
ok va bene! mi metto sotto e me lo studio.

più che altro al momento ho preso gli esempi che avete creato, estrapolo la logica e cerco di creare un progetto mio prendendo spunto da tutti i consigli che mi state dando. vedo se già di stasera o domani riesco a buttare giù qualcosa

Go Up