bitroby ha scritto:
devo illuminare degli scalini, tale sequenza di led, deve avviarsi quando passando davanti al sensore infrarosso, tale sensore fornisce una tensione al piedino A2 di Arduino,
Molto meglio!
Come scritto prima "fornire una tensione" non è una cosa molto corretta. Tra l'altro ci sono tanti tipi di sensori ad infrarossi: alcuni hanno un'uscita digitale, altri analogica. In più alcuni danno un impulso di lunghezza fissa mentre altri danno un segnale per tutta la durata del rilevamento.
Questi "dettagli" sono importanti, e cambiano un pochino l'algoritmo della sequenza.
una volta avviata tale sequenza, deve fermarsi quando si è spento l'ultimo led della striscia.
Ovvero dopo un segnale da parte del sensore dovrà essere eseguito un solo ciclo. Fino al prossimo rilevamento.
Cosa deve succedere se durante il ciclo arriva un altro segnale dal sensore? DEVI deciderlo!
Il numero 230 che vedete nella seconda riga, è il numero di led con cui ora sto facendo le prove, in realtà sugli scalini ne ho installati 508, ma quest'ultimo dettaglio ha poca importanza nella risoluzione del mio problema
La direzione della sequenza ( scritta nella riga del "for" )va al contrario, quindi inizia dal led numero 507 andando verso il led "0", questo perché mi è arrivato solo il sensore del primo piano e attendo quello che monterò al piano terra.
Quindi ci saranno due sensori?
Hai mai pensato di fare un diagramma di flusso? Anche con carta e penna!
FastLED.addLeds<NEOPIXEL, 6>(leds, NUM_LEDS);
Quel 6 non va bene, dichiaralo con un #define più sopra. Prendi la buonissima abitudine subito.
if(SensoreSu > 140)
Altra costante! Regola: si possono usare come costanti solo -1, 0, 1 ed anche 2 e 10 ma SOLO quando indicano la base numerica. Altrimenti definiscile sempre come "costanti simboliche" e dagli un nome decente (lungo, esplicativo).
for (int i = 230; i > NUM_LEDS -231; i--) // prima i era = a 0 e > era <
Il ciclo deve andare da NUM_LEDS fino a 0 (compreso? non è chiaro), decrementando.
Osserva come ho scritto in ITALIANO e come puoi trasformare la frase in un costrutto for pari pari. Se ci metti un pelo di attenzione ti riesce facile e ti aiuta tantissimo.
leds.fadeToBlackBy(10);// lo spazio spento tra la sequenza iniziale e quella finale
La dichiarazione della funzione è questa:
CRGB & fadeToBlackBy (uint8_t fadefactor)
fadeToBlackBy is a synonym for nscale8( ..., 255-fadefactor)
inline CRGB& nscale8 (const CRGB & scaledown )
{
r = ::scale8(r, scaledown.r);
g = ::scale8(g, scaledown.g);
b = ::scale8(b, scaledown.b);
return *this;
}
Quindi nel tuo caso non fa niente!
leds[i] = CHSV(hue++, 255, 255);
Assegni un colore con tinta che cambia, facendo una sfumatura.
Però quando hue arriva a 255 cosa succederà, secondo te?
leds(NUM_LEDS / 1, NUM_LEDS - 1) = leds(NUM_LEDS / 5 - 1 , 0);
Questa riga non ha senso, stai cercando di usare una delle cose più contorte del C++, lascia stare! Usa la carta a quadretti e disegna, poi scrivi del codice "normale".
FastLED.delay(30); //la velocità
Sbagliato: non la velocità ma la PAUSA. Che l'effetto della pausa determini la velocità è secondario! Chiama le cose col loro nome, poi puoi commentare per esteso...
FastLED.show();
Questa riga manca ed è indispensabile!
Manca ancora la logica per fare il ciclo una sola volta.
Ma facciamo un passo alla volta.