/* UD5.LAB7B - Monostabile con array monodimensionale */




/*============================== CONFIGURAZIONI ==============================*/
//Macro per definire i pin utilizzati per collegare i pulsanti e i led alla
//scheda Arduino
#define PIN_RED_BTN 11		//Coppia 0
#define PIN_RED_LED 2

#define PIN_GRN_BTN 12		//Coppia 1
#define PIN_GRN_LED 3

#define PIN_BLU_BTN 13		//Coppia 2
#define PIN_BLU_LED 4

//Definire di seguito altre coppie. Ad esempio (decommentare le righe utili):
//#define PIN_WHI_BTN [pin number]	//Coppia 3
//#define PIN_WHI_LED [pin number]
//#define PIN_YEL_BTN [pin number]	//Coppia 4
//#define PIN_YEL_LED [pin number]


//Coppie pulsanti-led utilizzate (modificare il valore della macro in base al
//numero di coppie impostate in precedenza)
#define BTN_LED_PAIRS 3


//Macro per definire l'intervallo di accensione (in millisecondi) dei led
#define TIMER_RED_LED 2000
#define TIMER_GRN_LED 4000
#define TIMER_BLU_LED 6000
//#define TIMER_WHI_LED [milliseconds]
//#define TIMER_YEL_LED [milliseconds]
/*============================================================================*/




/*============================ VARIABILI GLOBALI =============================*/
//Array dei pin per collegare i pulsanti 
int pinBTNs[BTN_LED_PAIRS] = {PIN_RED_BTN, PIN_GRN_BTN, PIN_BLU_BTN};


//Array dei pin per collegare i led
int pinLEDs[BTN_LED_PAIRS] = {PIN_RED_LED, PIN_GRN_LED, PIN_BLU_LED};


//Array dei timer di accensione dei led
int ledTimers[BTN_LED_PAIRS] = {TIMER_RED_LED, TIMER_GRN_LED, TIMER_BLU_LED};


//Array per memorizzare la stato iniziale dei pulsanti
int initializeBTNs[BTN_LED_PAIRS];


//Array per memorizzare l'istante in cui il pulsante viene premuto
unsigned long timerStart[BTN_LED_PAIRS];


//Variabile contatore
int i=0;
/*============================================================================*/




/*=========================== FUNZIONI PRINCIPALI ============================*/
void setup() {
	//Serial.begin(9600);					//Decommentare la riga per attivare
											//l'uscita seriale (utile per il 
											//debugging)
	
	for(int j=0;j<BTN_LED_PAIRS;j++) {
		pinMode(pinBTNs[j],INPUT_PULLUP);	//Imposta la modalità dei pin colle-
		pinMode(pinLEDs[j],OUTPUT);			//gati ai pulsanti (input con resi-
	}										//stenza di pullup attiva) e dei pin 
}											//collegati ai led (output)



void loop() {
	initializeBTNs[i] = !digitalRead(pinBTNs[i]);	//Inizializzo i pulsanti su
													//zero logico memorizzando
													//il valore nella posizione
													//i dell'array
	
	
	if(initializeBTNs[i]) {				//Se il valore logico memorizzato in po- 
		digitalWrite(pinLEDs[i],HIGH);	//sizione i dell'array passa a 1 (alla  
		timerStart[i] = millis();		//pressione del pulsante), l'uscita del
										//pin al quale è collegato il led i
										//viene portata alta, il led i si ac-
										//cende e, con la funzione millis(),
										//viene memorizzato l'istante di accen-
										//sione nella posizione i dell'array
										//timerStart
	}
	
	
	if(millis() - timerStart[i] > ledTimers[i]) {	//Se la differenza tra il 
		digitalWrite(pinLEDs[i],LOW);				//tempo trascorso dall'ac-
	}												//censione di Arduino e lo 
													//istante i di pressione del
													//pulsante i è maggiore del
													//ledTimer i, l'uscita del
													//pin al quale è collegato
													//il led i viene portata
													//bassa e il led i si spegne


	i++;								//Incremento il contatore di 1

	
	if(i>=BTN_LED_PAIRS) {				//Se il contatore eguaglia o eccede il 
		i=0;							//numero di coppie, viene riportato a 0
	}
	
			
	delay(30);							//Ritardo introdotto per evitare "rim-
										//balzi" dei pulsanti (debounce)
}
/*============================================================================*/
$abcdeabcde151015202530fghijfghij