Ciao a tutti.
Sto provando a lavorare con i MAX7221 e due IR switches.
Cercavo di far accendere una fila di LED in una direzione quando attivo lo switch 1 e nell'altra quando attivo lo switch 2.
Sostanzialmente la cosa è semplice e in effetti funziona.
Mi sono incasinato (non sono una cima in programmazione, anzi sto proprio nei bassifondi) quando ho cercato il modo di dirgli di ignorare uno dei 2 switches nel caso in cui già stia eseguendo una istruzione.
Mi spiego meglio: lo sketch accende la fila di led in sequenza DX>SX se attivo davanti IR1, attende 10 sec e li spegne i fading. discorso analogo ma al contrario con IR2. Lo sketch usato è questo:
#include "LedControl.h" //carico la libreria per gestire il MAX7221
const unsigned int accendi=250; //creo una costante per il comando delay che accende i singoli LED
const unsigned int spegni=150; //creo una costante per il comando delay che spegne i singoli LED
const unsigned int attesa=10000; //creo una costante per il comando delay del timer LED
const unsigned int IR1=9; //creo una costante per il pin 9 dove collego lo switch 1
const unsigned int IR2=10; //creo una costante per il pin 10 dove collego lo switch 2
int IR1State = HIGH; //definisco una variabile per memorizzare lo stato dello switch IR 1 che adesso è HIGH
int IR2State = HIGH; //definisco una variabile per memorizzare lo stato dello switch IR 2 che adesso è HIGH
LedControl LC1=LedControl (13,11,12,1); //creato controller con DataIn su 13 DataClock su 11 DataLoad su 12 e 1 solo MAX collegato
void setup() {
LC1.shutdown (0,false); //se l'ometto il MAX rimane in powersafe e i LED non si accendono
LC1.setIntensity (0,10); //se ometto il default è 1 su massimo 15 - setta l'intensità dei LED all'accensione
LC1.clearDisplay (0); //all'accensione spengo tutti i LED sul MAX 1 - sennò sono accesi tutti
pinMode (IR1, INPUT);
pinMode (IR2, INPUT);
}
void loop() {
IR1State = digitalRead (IR1); //legge lo stato dello switch IR1
IR2State = digitalRead (IR2); //legge lo stato dello switch IR2
//VALUTO LO STATO DEI DUE SWITCH IR - SE IR1 è STATO ATTIVATO E IR2 è HIGH, ALLORA VUOL DIRE CHE STO ANDANDO IN UNA DIREZIONE
if (IR1State == LOW && IR2State == HIGH) {
LC1.setIntensity (0,10); //questa riga ho dovuto metterla altrimenti al secondo passaggio i LED sono ad intensità bassa
//ACCENDE I LED DELLA PRIMA RIGA
LC1.setLed (0,0,0,true);
delay(accendi);
LC1.setLed (0,0,1,true);
delay(accendi);
LC1.setLed (0,0,2,true);
delay(accendi);
LC1.setLed (0,0,3,true);
delay(accendi);
LC1.setLed (0,0,4,true);
delay(accendi);
LC1.setLed (0,0,5,true);
delay(accendi);
LC1.setLed (0,0,6,true);
delay(accendi);
LC1.setLed (0,0,7,true);
delay(attesa);
LC1.setIntensity (0,10);
delay(spegni);
LC1.setIntensity (0,9);
delay(spegni);
LC1.setIntensity (0,8);
delay(spegni);
LC1.setIntensity (0,7);
delay(spegni);
LC1.setIntensity (0,6);
delay(spegni);
LC1.setIntensity (0,5);
delay(spegni);
LC1.setIntensity (0,4);
delay(spegni);
LC1.setIntensity (0,3);
delay(spegni);
LC1.setIntensity (0,2);
delay(spegni);
LC1.setIntensity (0,1);
delay(spegni);
LC1.setIntensity (0,0);
delay(spegni);
LC1.clearDisplay (0);
} //fine condizione if
//VALUTO LO STATO DEI DUE SWITCH IR - SE IR2 è STATO ATTIVATO E IR1 è HIGH, ALLORA VUOL DIRE CHE STO ANDANDO NELL'ALTRA DIREZIONE
if (IR2State == LOW && IR1State == HIGH){
LC1.setIntensity (0,10); //questa riga ho dovuto metterla altrimenti al secondo passaggio i LED sono ad intensità bassa
//ACCENDE I LED DELLA PRIMA RIGA
LC1.setLed (0,0,7,true);
delay(accendi);
LC1.setLed (0,0,6,true);
delay(accendi);
LC1.setLed (0,0,5,true);
delay(accendi);
LC1.setLed (0,0,4,true);
delay(accendi);
LC1.setLed (0,0,3,true);
delay(accendi);
LC1.setLed (0,0,2,true);
delay(accendi);
LC1.setLed (0,0,1,true);
delay(accendi);
LC1.setLed (0,0,0,true);
delay(attesa);
LC1.setIntensity (0,10);
delay(spegni);
LC1.setIntensity (0,9);
delay(spegni);
LC1.setIntensity (0,8);
delay(spegni);
LC1.setIntensity (0,7);
delay(spegni);
LC1.setIntensity (0,6);
delay(spegni);
LC1.setIntensity (0,5);
delay(spegni);
LC1.setIntensity (0,4);
delay(spegni);
LC1.setIntensity (0,3);
delay(spegni);
LC1.setIntensity (0,2);
delay(spegni);
LC1.setIntensity (0,1);
delay(spegni);
LC1.setIntensity (0,0);
delay(spegni);
LC1.clearDisplay (0);
} //fine condizione if
} // questa è la fine del loop
Non riesco a fargli capire che se attivo IR1 e qualche secondo dopo IR2, deve ignorare IR2 finchè non ha terminato il suo ciclo.
Ho provato a creare delle variabili LastState per memorizzare gli stati high e low dei due switches e usare delle condizioni IF aggiuntive, ma non ha proprio più funzionato.
Mi suggerite una soluzione?
Grazie