/* UD5.LAB5A - Clockwise/Counterclockwise */
/*============================== CONFIGURAZIONI ==============================*/
# define PIN_SEG_A 2 //L'istruzione #define permette di as-
# define PIN_SEG_B 3 //sociare ad ogni piedino del display a
# define PIN_SEG_C 4 //7 segmenti (da A ad F) un corrispon-
# define PIN_SEG_D 6 //dente PIN digitale sulla scheda
# define PIN_SEG_E 7 //ARDUINO UNO
# define PIN_SEG_F 9
# define PIN_BUTTON 10 //Macro per associare ad un piedino del
//pulsante un corrispondente PIN digita-
//le sulla scheda ARDUINO UNO
# define T 500 //Macro per stabilire il tempo di accen-
//sione del singolo segmento misurato in
//millisecondi
/*============================================================================*/
/*============================ VARIABILI GLOBALI =============================*/
// Array monodimensionale dei PIN collegati ai segmenti
int pinArray[6] = {PIN_SEG_A,PIN_SEG_B,PIN_SEG_C,PIN_SEG_D,PIN_SEG_E,PIN_SEG_F};
int i=0; //Indice dell'array
int before=0; //Variabile impiegata per rilevare il
//fronte di salita alla pressione del
//pulsante
int rotation=0; //Flag per stabilire la direzione di ac-
//censione sequenziale dei segmenti:
//0 = clockwise, 1 = counterclockwise
unsigned long lastMillis=0; //Variabili utilizzate per temporizzare
unsigned long nowMillis; //l'accensione dei segmenti
/*============================================================================*/
/*=========================== FUNZIONI PRINCIPALI ============================*/
void setup() {
for(int i=0; i<6; i++) {
pinMode(pinArray[i],OUTPUT); //Ciclo per inizializzare in modalità
} //OUTPUT i PIN sulla scheda ARDUINO UNO
//abbinati ai segmenti del display (vedi
//sezione CONFIGURAZIONI all'inizio di
//questo sorgente)
pinMode(PIN_BUTTON,INPUT_PULLUP); //Inizializzo in modalità INPUT con re-
//sistenza di pullup attiva il PIN sulla
//scheda ARDUINO UNO destinato al
//collegamento di uno dei piedini del
//pulsante (l'altro piedino del pulsante
//andrà collegato a un piedino GND)
}
void loop() {
int now = !digitalRead(PIN_BUTTON); //Alla pressione del pulsante, rile-
if( (before == 0) && (now == 1) ) { //vo il fronte di salita e cambio
rotation=!rotation; //il flag di rotazione
}
before = now;
delay(30); //Debounce (delay per prevenire il
//"rimbalzo" quando viene premuto il
//pulsante)
nowMillis = millis(); //Sfrutto la funzione millis(), che
if (nowMillis - lastMillis > T) { //restituisce il tempo trascorso
lastMillis = nowMillis; //dall'accensione della scheda Ardu-
if (rotation == 0) { //ino UNO in millisecondi, per ini-
clockwise(); //zializzare la variabile nowMillis
} //Quando la differenza tra il tempo
if (rotation == 1) { //attuale (nowMillis) e l'ultimo
counterclockwise(); //tempo rilevato (lastMillis) è mag-
} //giore di T (vedi sezione CONFIGU-
} //RAZIONI all'inizio di questo sor-
} //gente), viene eseguito un test sul
//flag di rotazione e richiamo la
//subroutine corrispondente
/*============================================================================*/
/*============================== ALTRE FUNZIONI ==============================*/
//La seguente subroutine accende i LED in senso orario
void clockwise() {
digitalWrite(pinArray[i], LOW); //Spengo il LED con indice array i
i++; //Incremento di uno l'indice array i
if (i>5) { //Gestisco l'eventuale overflow
i=0;
}
digitalWrite(pinArray[i], HIGH); //Accendo il LED con indice array i ap-
} //pena incrementato
//La seguente subroutine accende i LED in senso antiorario
void counterclockwise() {
digitalWrite(pinArray[i], LOW); //Spengo il LED con indice array i
i--; //Decremento di uno l'indice array i
if (i<0) { //Gestisco l'eventuale underflow
i=5;
}
digitalWrite(pinArray[i], HIGH); //Accendo il LED con indice array i ap-
} //pena decrementato
/*============================================================================*/