/* UD5.LAB5A - Rotazione Display Bidirezionale */
/* CONNESSIONI HARDWARE */
#define PIN_SEG_A 4 // Pin connesso al segmento A del display
#define PIN_SEG_B 5 // Pin connesso al segmento B del display
#define PIN_SEG_C 6 // Pin connesso al segmento C del display
#define PIN_SEG_D 7 // Pin connesso al segmento D del display
#define PIN_SEG_E 8 // Pin connesso al segmento E del display
#define PIN_SEG_F 3 // Pin connesso al segmento F del display
#define PIN_BUTTON 10 // pin connesso al pulsante (inversione di direzione)
/* PARAMETRI DI FUNZIONAMETO */
#define STEP_MILLIS 400 // Durata di uno step
/* Altri parametri */
#define NUM_SEG 6 // Numero dei segmenti utilizzati
/* Variabili Globali x Display */
int pinDisplay[NUM_SEG] = {PIN_SEG_A, PIN_SEG_B, PIN_SEG_C, PIN_SEG_D, PIN_SEG_E, PIN_SEG_F}; // Array per i pin collegati al display
int pinIndex = 0; // indice del segmento acceso (0..NUM_SEG-1) incrementato/decrementato
int dirRotation = 0; // Rotazione oraria:1, antioraria:0
unsigned long millisLastEvent = 0; // Ultimo istante in cui si è verificato l'evento di incremento/decremento segmento del display
/* Variabili Globali x Pulsante */
int buttonOld = 0; // Valore del pulsante nel precedente loop
void setup() {
Serial.begin(9600); // Inizializzazione porta seriale
for (int index = 0; index < NUM_SEG; index++) { // Ciclo sui pin del display (array) per impostarli come Uscite
pinMode(pinDisplay[index], OUTPUT);
}
pinMode(PIN_BUTTON, INPUT_PULLUP); // Imposto il PIN_BUTTON come Input con resistenza di PullUp interna
}
void loop() {
/* Rilevamento del fronte di salita del pulsante */
int buttonNow = !digitalRead(PIN_BUTTON); // Lettura stato attuale del pulsante
if (buttonOld==0 && buttonNow==1){ // Verifica del fronte di salita
// Fronte di salita
Serial.println("FRONTE DI SALITA");
dirRotation = !dirRotation; // Inversione flag di rotazione display
}
buttonOld = buttonNow; // Memorizzazione dello stato attuale nello stato precedente per il successivo ciclo del loop
/* Temporizzazione della rotazione step */
unsigned long millisNow = millis(); // Istante attuale
if( millisNow - millisLastEvent > STEP_MILLIS){ // Verifica del passaggio di STEP_MILLIS dall'ultimo evento
stepDisplay(); // Step del display
millisLastEvent = millisNow; // Memorizzazione istante attuale nella variabile globale dell'ultimo evento
}
delay(20); // Debounce
}
// StepDisplay: esecuzione di uno step nella rotazione del display
void stepDisplay(){
digitalWrite(pinDisplay[pinIndex], LOW); // Spengo il segmento attuale
if(dirRotation==1) // Verifica del senso di rotazione
pinIndex++; // Incremento l'indice globale
else
pinIndex--; // Decremento l'indice globale
pinIndex = (pinIndex + NUM_SEG) % NUM_SEG; // Verifico overflow/underflow dell'indice globale
digitalWrite(pinDisplay[pinIndex], HIGH); // Accendo il nuovo segmento
Serial.print("pinIndex: "); Serial.println(pinIndex);
}