Ignorare temporaneamente un INPUT

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

A parte che il codice non è molto leggibile (non è indentato bene, usa l'autoformattazione la prox volta :stuck_out_tongue: ), ma quel che non capisco è: lo sketch di ora ti dà lo stesso il problema? Ad occhio non dovrebbe perché fai la lettura dei pin solo ad inizio loop.

leo72:
A parte che il codice non è molto leggibile (non è indentato bene, usa l'autoformattazione la prox volta :stuck_out_tongue: ), ma quel che non capisco è: lo sketch di ora ti dà lo stesso il problema? Ad occhio non dovrebbe perché fai la lettura dei pin solo ad inizio loop.

Scusa per la formattazione del codice :~ (a mia eventuale giustificazione direi che sono proprio niubbo totale in questo genere di forum)....
Quanto al codice, adesso sono in ufficio e materialmente non riesco a ri-provarlo (a dire il vero l'ultima volta che ho lavorato su Arduino era a Natale, poi mi sono depresso e l'ho messo in naftalina), appena arrivo a casa lo riprovo e ti faccio sapere.

Ok. Siamo qua :wink:

jocman:
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

guarda bene se... anche come hai inizializzato i pin di input vanno bene lo stesso di solito e pinmode ecc nel set up

e per il rest fai 2 o più variabili che partono con zero es: byte mela = 0

e alla fine del/dei cicli/lampeggio li porti a 1 nell'if vi verifica dello swict metti anche
if (IR1State == LOW && IR2State == HIGH && mela ==1 )

cosi se mela non è stata portata a uno (alla fine di un lampeggio) non parte nulla
ricordati di riportare le variabili a zero se no sempre a uno rimangono
if (IR1State == LOW && IR2State == HIGH && mela ==1 ) (mela =0 ect....

La vecchiaia è una brutta bestia....
Il codice che ho postato in effetti funziona benissimo...
Mi sono semplicemente reso conto che continuavo a caricare su arduino uno sketch non funzionante.
Comunque provero anche con la modifica della "mela",un controllo in piu non penso faccia male.
Grazie dell'aiuto e buona befana.