/* 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)
}
/*============================================================================*/