Purtroppo qualcosa non va... è tutto il pomeriggio che provo ma non so veramente cosa non vada. Potete aiutarmi?!
// Inizializzazione
// definisco il pin associato al pulsante di START
const int buttonStart = 7;
// definisco i pin del DIP switch
const int SW1 = 14;
const int SW2 = 15;
const int SW3 = 16;
const int SW4 = 17;
const int SW5 = 18;
const int SW6 = 19;
// definisco i pin dei segmenti del Display LED
const int A = 12; // pin che controllano i segmenti delle cifre
const int B = 8;
const int C = 4;
const int D = 2;
const int E = 1;
const int F = 11;
const int G = 5;
const int DP = 3;
const int DIG1 = 13; // pin che controllano le singole cifre
const int DIG2 = 10;
const int DIG3 = 9;
const int DIG4 = 6;
// definisco il tipo dei pin
void setup(){
pinMode(buttonStart, INPUT_PULLUP);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
pinMode(SW4, INPUT);
pinMode(SW5, INPUT);
pinMode(SW6, INPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(DIG1, OUTPUT);
pinMode(DIG2, OUTPUT);
pinMode(DIG3, OUTPUT);
pinMode(DIG4, OUTPUT);
}
int buttonState = 0; // definisco una variabile per controllare lo stato del pulsante di START
void loop(){
buttonState = digitalRead(buttonStart); // legge lo stato del pulsante di START
if (buttonState == LOW){
// operazione che legge i bit del DIP switch e crea il seed
byte seed; // variabile che otterò e manderò a randomSeed() per generare la one time password
byte seedArray [8]={SW1,SW2,SW3,SW4,SW5,SW6,0,0}; // variabile array in cui associo i pin del DIP switch
seed = 0; // setto tutti i bit a 0
for (int i = 0; i<8; i++){ // leggo lo stato di ogni pin del Dip switch e se è HIGH setto a 1 il bit del seed di quella data posizione
if (digitalRead(seedArray [i]) == HIGH){
bitSet(seed, i);
// TEST: visualizzo allo shermo del pc i bit del seed e quest'ultimo in forma decimale
Serial.begin(9600);
Serial.print(seedArray [i], BIN);
Serial.print(seed, DEC);
Serial.print("\t");
}
}
// generazione dellala one time password
int otp; // variabile in cui verrà salvata la one time password
randomSeed(seed); // inizializzo la funzione random che genererà la one time password
otp = random(10000); // dato che ho un display a 4 cifre potrò visualizzare solo un numero tra 0 e 9999
// TEST: visualizzo allo schermo del pc la one time password
Serial.begin(9600);
Serial.print(otp);
showDigits(otp);
delay (5000); // visualizzo la one time password per 5 secondi, prima di spegenere il Display LED
digitalWrite(DIG1, LOW);
digitalWrite(DIG2, LOW);
digitalWrite(DIG3, LOW);
digitalWrite(DIG4, LOW);
delay (1);
}
}
// definisco la funzione per visualizzare un numero da 0 a 9 in base alla cifra ricevuta
void showDigit (int digit){
digitalWrite(A, HIGH); // spengo tutti i LED della cifra (nel caso ad anodo comune si pongono i pin HIGH)
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
digitalWrite(DP, HIGH);
switch (digit) {
case 0: //per ogni numero accenderò i relativi LED (nel caso ad anodo comune si pongono i pin LOW)
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
break;
case 1:
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 2:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(G, LOW);
break;
case 3:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(G, LOW);
break;
case 4:
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 5:
digitalWrite(A, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 6:
digitalWrite(A, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 7:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 8:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 9:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
default:
break;
}
}
// funzione per visualizzare le 4 cifre su Display LED
void showDigits (int digits){
showDigit (digits/1000); // mi restituisce solo la prima cifra (partendo da sinistra)
digitalWrite(DIG1, HIGH); // accende solo la prima cifra (nel caso ad anodo comune si pone il pin HIGH)
digitalWrite(DIG2, LOW);
digitalWrite(DIG3, LOW);
digitalWrite(DIG4, LOW);
delay (1); // ritardo di 1 ms prima di passare alla cifra successiva
digits = digits%1000; // mi restituisce solo la seconda cifra (partendo da sinistra)
digitalWrite(DIG1, LOW);
showDigit(digits/100);
digitalWrite(DIG2, HIGH);
delay (1);
digits = digits%100; // mi restituisce solo la terza cifra (partendo da sinistra)
digitalWrite(DIG2, LOW);
showDigit(digits/10);
digitalWrite(DIG3, HIGH);
delay (1);
digits = digits%10; // mi restituisce solo la quarta cifra (partendo da sinistra)
digitalWrite(DIG3, LOW);
showDigit(digits);
digitalWrite(DIG4, HIGH);
delay (1); // grazie ad ogni piccolo ritardo sì ha l'effetto che le cifre si accendano tutte contemporaneamente
}