Ciao a tutti.
Ho realizzato una illuminazione per la mia scala interna di casa, con l'idea di accendere in sequenza ogni gradino a seconda della direzione, per poi farli spegnere dopo un certo tempo nella stessa direzione.
Come led ho utilizzato dei WS2812, e come interruttori 2 IRSwitch (1 sul primo gradino e 1 sull'ultimo).
Poi ho fatto una semplice programmazione di test (Test01), utilizzando un ciclo For per l'accensione in una direzione, e un altro ciclo analogo per lo spegnimento.
In salita tutto ha funzionato a meraviglia: ogni scalino (gruppi di 3 led a gradino) si accende in sequenza non appena metto il piede sul primo gradino.
Allora ho implementato il codice (stessa filosofia) per la discesa. Ma stavolta non ne vuole sapere di funzionare.
A parte che funziona solo in discesa (ma questo penso sia un problema legato alla taratura dell'IR switch che regola la discesa), comunque ho provato a collegare il solo IR della salita (che è già tarato a dovere) utilizzandollo come se fosse quello della discesa ma il risultato non è cambiato.
In pratica i led si accendono in modo giusto in sequenza; ma si spengono in un colpo solo tutti insieme.
Ho provato a cambiare il colore dello spegnimento da nero a rosso. Con il rosso funziona: da bianchi si "spengono" in rosso in sequenza giusta. Come rimetto il colore nero, di nuovo ricominciano a spegnersi tutti contemporaneante.
Inoltre, utilizzando i 2 IRswitch, oltre al "non funzionamento" di cui sopra, il sensore della salita viene completamente ignorato. in pratica ho regolato al minimo il sensore della discesa (per attivarlo praticamente devo toccarlo) così da non mandare segnali, ma passando davanti a quello della salita, non viene più rilevato.
Penso che tutto sia un problema riconducibile alla programmazione, ma non so più dove mettere le mani...
Vi posto entrambe i codici (quello relativo alla sola salita - che funziona a dovere - e quello con salita e discesa - che è quello che non ne vuole sapere di funzionare)
Mi ci date uno sguardo? magari trovate l'errore, o se avete qualche altra soluzione....
Grazie
Andrea
/*
File di test in salita
Accende 16 scalini da 3 led (totale 48 led) ws2812 in sequenza in una direzione
Usa un IRSwitch per comandare l'accensione
Attende, poi li spegne nella stessa sequenza
*/
#include <FastLED.h> //Carico la libreria FastLed
#define NumLed 48 //Creo la costante NumLed pari a 48 leds
#define DataPin 7 //Creo la costante DataPin che assegna il pin 7 di controllo dei led
#define timer1 200 //definisco la costante timer1 pari a 200 ms
#define timer2 15000 //definisco la costante timer2 pari a 15000 ms (15 secondi)
CRGB leds[NumLed];
const unsigned int IR1=8; //definisco la costante IR1 e la assegno al pin 8 - switch 1 rampa sala>notte
int IR1State = HIGH; //definisco la variabile IR1State e le setto a HIGH - stato dello switch 1
void setup() {
FastLED.addLeds<NEOPIXEL, DataPin>(leds, NumLed);
pinMode (IR1, INPUT); //stabilisco che il pin di IR1 è in input
}
void loop() {
IR1State = digitalRead (IR1); //leggo lo stato di IR1
if (IR1State == LOW) { //accende in salita la scala sala>notte
Rampa01A();
}
}
void Rampa01A() {
for (int m = 0; m < NumLed; m=m+1){ //questo ciclo accende in sequenza gruppi di 3 led
leds[m] = CRGB::White;
leds[m=m+1] = CRGB::White;
leds[m=m+1] = CRGB::White;
FastLED.show();
delay(timer1);
}
delay (timer2);
for (int m = 0; m < NumLed; m=m+1){ //questo ciclo spegne in sequenza gruppi di 3 led
leds[m] = CRGB::Black;
leds[m=m+1] = CRGB::Black;
leds[m=m+1] = CRGB::Black;
FastLED.show();
delay(timer1);
}
e questo è quello per salita e discesa
/*
File di test per salita e discesa
Accende 16 scalini da 3 led (totale 48 led) ws2812 in sequenza in 2 direzioni
Usa 2 IRSwitch per comandare l'accensione
Attende, poi li spegne nella stessa sequenza
*/
#include <FastLED.h> //Carico la libreria FastLed
#define NumLed 48 //Creo la costante NumLed pari a 48 leds
#define DataPin 7 //Creo la costante DataPin che assegna il pin 7 di controllo dei led
#define timer1 200 //definisco la costante timer1 pari a 200 ms
#define timer2 15000 //definisco la costante timer2 pari a 15000 ms (15 secondi)
CRGB leds[NumLed];
const unsigned int IR1=8; //definisco la costante IR1 e la assegno al pin 8 - switch 1 rampa sala>notte
const unsigned int IR2=9; //definisco la costante IR1 e la assegno al pin 9 - switch 1 rampa notte>sala
int IR1State = HIGH; //definisco la variabile IR1State e la setto a HIGH - stato dello switch 1
int IR2State = HIGH; //definisco la variabile IR2State e la setto a HIGH - stato dello switch 2
void setup() {
FastLED.addLeds<NEOPIXEL, DataPin>(leds, NumLed);
pinMode (IR1, INPUT); //stabilisco che il pin di IR1 è in input
pinMode (IR2, INPUT); //stabilisco che il pin di IR2 è in input
}
void loop() {
IR1State = digitalRead (IR1); //leggo lo stato di IR1
IR2State = digitalRead (IR2); //leggo lo stato di IR2
if (IR1State == LOW) { //accende in salita la scala sala>notte
Rampa01A();
}
if (IR2State == LOW) { //accende in salita la scala notte>sala
Rampa01B();
}
}
void Rampa01A() {
for (int m = 0; m < NumLed; m=m+1){ //questo ciclo accende in sequenza gruppi di 3 led in salita
leds[m] = CRGB::White;
leds[m=m+1] = CRGB::White;
leds[m=m+1] = CRGB::White;
FastLED.show();
delay(timer1);
}
delay (timer2);
for (int m = 0; m < NumLed; m=m+1){ //questo ciclo spegne in sequenza gruppi di 3 led in salita
leds[m] = CRGB::Black;
leds[m=m+1] = CRGB::Black;
leds[m=m+1] = CRGB::Black;
FastLED.show();
delay(timer1);
}
}
void Rampa01B() {
for (int m=NumLed; m>=0; m=m-1) { //questo ciclo accende in sequenza gruppi di 3 led in discesa
leds[m] = CRGB::White;
leds[m=m-1] = CRGB::White;
leds[m=m-1] = CRGB::White;
FastLED.show();
delay(timer1);
}
delay(timer2);
for (int m=NumLed; m>=0; m=m-1) { //questo ciclo spegne in sequenza gruppi di 3 led in discesa
leds[m] = CRGB::Black;
leds[m=m-1] = CRGB::Black;
leds[m=m-1] = CRGB::Black;
FastLED.show();
delay(timer1);
}
}