int Vp; // Vp= Tensione letta su pin analogico A0
float T; // T = Dichiarata in anticipo spiego dopo serve per i calcoli
int vs; //Vs = stessa cosa di T
int DT; // DT = Decine Tensione
int UT; // UT = Unita' Tensione
int dT; // dT = Decimali Tensione
//Dichiarazione Varabili per led 7 segmenti
int A=3; // A corrisponde al segmento a collegato al pin 3
int B=4; // B corrisponde al segmento b collegato al pin 4
int C=5; // ecc ecc
int D=6;
int E=7;
int F=8;
int G=9;
int DP=10; //questo è il pin che mi abiliterà il punto sul secondo display che sul
//progetto definitivo colleghero direttamente ai + 5V
int DD=11; //DD= Catodo 1°Display => DD acronimo di Display Decine
int DU=12; //DU= Catodo 2°Display => DU || Display Unità
int Dd=13; //Dd= Catodo 3°Display => Dd || Display Decimali
long x=0; // x= mi servirà dopo + in basso per cercare di far funzionare il
multiplexing
void setup () {
pinMode(A,OUTPUT); //Definisco i pin dove sono collegati
pinMode(B,OUTPUT); //i sette pin dei sette segmenti come uscite
pinMode(C,OUTPUT);
pinMode(D,OUTPUT);
pinMode(E,OUTPUT);
pinMode(F,OUTPUT);
pinMode(G,OUTPUT);
pinMode(DP,OUTPUT); //questo è il led che fa il punto del secondo display
pinMode(DD,OUTPUT); //questi ultimi 3 sono i catodi
pinMode(DU,OUTPUT);
pinMode(Dd,OUTPUT);
}
void zero () { //da "void zero" a "void nove" sono le funzioni che
digitalWrite(A, HIGH); // richiamerò nel void loop
digitalWrite(B, HIGH); // in queste funzioni stabilisco quali pin
digitalWrite(C, HIGH); //devono essere a 5V e a GND per
digitalWrite(D, HIGH); //visualizzare correttamente la cifra sul display
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
}
void uno () {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void due () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void tre () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void quattro () {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void cinque () {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void six () {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void sette () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void otto () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void nove () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void loop () { //Da qui inizia il programma lettura Tensione
// Conversione da 0-5 a 0-30
Vp=analogRead(A0); // legge la tensione da 0 a 5 su A0
T =(Vp*(5.0/1023.0))*6; // Tensione convertita e *6 in modo da dare un
//risultato da 0 a 30 Volt
DT = T/10.0; //Formula per ricavare Decine ovvero la cifra che verrà
visualizzata sul 1° display
if ( DT==0){ //Formula per ricavare le Unita che verrano visualizzate sul
UT = (T-DT)/1.0; //2° display
}
if ( DT==1){
UT = (T-DT)-9/1.0;
}
if ( DT==2){
UT = (T-DT)-18/1.0;
}
//Formula per ricavare i Decimale da visualizzare sul 3 display
vs=T; //Trucchetto per avere da un numero decimale "float T=tensione
//su a0" un numero int vs da sotrarre in modo da ricavarmi i
dT = (T-vs)/0.1; // Decimali da visualizzare sul display
//--------------
//--------------
//MULTIPLEXING
unsigned long tempo=millis(); //tempo e uguale a millis
long Fq=130; //Fq è La frequenza di aggiornamento
//x è il tempo aggiornato a fine ciclo in
//modo da avere sempre valide le funzioni if anche se millis
//continua il conteggio.
if(tempo-x<Fq){ //fino a che millis non raggiunge il valore impostato in Fq
digitalWrite(DD,LOW); //metto 0v il catodo Display Decine
digitalWrite(DU,HIGH); //metto a 5v catodo Display Unita nn essendoci diff.di pot.
// il led non si accende
digitalWrite(Dd,HIGH); //stessa cosa su Display Decimali
switch (DT){ //Switch confronta il numero decimale ricavato con le
formule sopra e i case mi richiamano le funzioni "void zero
ecc.." dove sono definiti gli stati logici dei pin
corrispondenti ai segmenti per la
visualizzazione delle cifre su display
i case arrivano fino a tre per le decine
perchè massimo(molto teorici poco pratici) ho 30 volt.
case 0:
zero();
break;
case 1:
uno();
break;
case 2:
due();
break;
case 3:
tre();
break;}
}
if(tempo-x>Fq && tempo-x<Fq*2){ //uguale a sopra solo che onde evitare bug
// il famoso punto del secondo display
digitalWrite(DP,HIGH); //esegue la funzione quando ha finito di
//visualizzare le decine sempre per il tempo
//impostato in Fq
digitalWrite(DD,HIGH);
digitalWrite(DU,LOW);
digitalWrite(Dd,HIGH);
switch (UT){
case 0:
zero();
break;
case 1:
uno();
break;
case 2:
due();
break;
case 3:
tre();
break;
case 4:
quattro();
break;
case 5:
cinque();
break;
case 6:
six();
break;
case 7:
sette();
break;
case 8:
otto();
break;
case 9:
nove();
break;}
}
if(tempo-x>=Fq2 && tempo-x<=Fq3){ //stessa funzione per i decimali
digitalWrite(DD,HIGH);
digitalWrite(DU,HIGH);
digitalWrite(Dd,LOW);
switch (dT){
case 0:
zero();
break;
case 1:
uno();
break;
case 2:
due();
break;
case 3:
tre();
break;
case 4:
quattro();
break;
case 5:
cinque();
break;
case 6:
six();
break;
case 7:
sette();
break;
case 8:
otto();
break;
case 9:
nove();
break;}
}
if(tempo-x>=Fq3 && tempo-x<=Fq4){ //reimposta la variabile x ponendola uguale
x=tempo;} //al conteggio millis attuale in modo da rendere
// ancora valide le condizioni negli if al ripetersi
} //del ciclo