Pages: [1] 2 3   Go Down
Author Topic: [Risolto] Multiplex 3 Display 7-Seg  (Read 3362 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti ragazzi mi chiamo Gianluca.
Sto rispolverando le mie poche conoscenze elettroniche e sto imparando a usare arduino e questo è il primo progetto che sto cercando do portare a termine che è fondamentale per tutti gli altri  smiley.
Ho realizzato un alimentatore con tensione regolabile 1.2V 27V e volevo integrare un voltmetro tramite Atmega328 in Stand alone con 3 display 7Seg a Catodo Comune.
Inizialmente l'idea era di pilotare i display con 3 integrati 4511decoder/latch/driver bcd - 7 Seg di facile realizzazione ed avrei già finito.
Però, curiosando in giro per il forum e su google, ho sentito parlare del multiplexing.
Siccome sono una "volpe" mi ci sono cimentato e dopo una settimana(lavoro permettendo) non riesco a venirne fuori e sono costretto a chiedervi una mano.

Domanda di curiosità
1- Bisogna comandare i singoli segmenti in sequenza o si possono comandare anche i display(singola cifra) in sequenza? Vantaggi e Svantaggi tra le due opzioni?

io al momento sto comandando le singole cifre
Veniamo al vero problema......

I display mi visualizzano (o almeno dovrebbero) decine unità e decimali

Descrizione Circuito:
I tre display hanno i 7 pin uguali in comune.
Il secondo display ha il segmento del punto comandato con un pin a parte x il momento dopo lo collegherò a 5V.
Ad ogni segmento una resistenza da 680Ohm per limitare la corrente assorbita per segmento a 5mA in modo da non superare i 40mA dei pin di arduino(evitandomi il Transistor npn sul catodo....devo ancora sistemare la documentazione che mi sono procurato per capire come funziona e per calcolare la resistenza di base per l'utilizzo on/off).

Descrizione programma:
Legge la tensione da 0-5volt(ottenuti con partitore di tensione) e la converte da 0 a 30volt,
estrae decine unita e decimali e dopo cerca di visualizzarle sui tre display   smiley-cry
Il problema e che impostando Fq (in teoria la velocità del ciclo dei tre display) ad un valore minore di quello dello sketch (Fq =130) non visualizza più nulla.Ora....seguendo un ragionamento logico se io alzo(abbasso Fq) la velocità di aggiornamento dovrei vedere i tre display sempre accesi fissi e non spenti giusto?
Qualcuno con molta più esperienza di me saprebbe spiegarmi dove sbaglio?

Se non sono stato abbastanza chiaro ditemelo pure.
Visto che lo sketch è abbastanza "grezzo" sono ben accetti consigli su come migliorare la struttura, l'ordine,
o se ci sono funzioni che devo ancora imparare per snellire lo sketch.
Tralasciate i vari Serial.print mi servivano per il debug.
La parte dello sketch che "non funziona" inizia da
//---------------
//---------------
MULTIPLEXING
« Last Edit: November 27, 2012, 03:09:56 pm by ZG84 » Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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>=Fq*2 && tempo-x<=Fq*3){                             //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>=Fq*3 && tempo-x<=Fq*4){          //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
 

 



« Last Edit: November 24, 2012, 05:38:51 pm by ZG84 » Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-roll
Ciao ZG84,

intanto, per risponderti, bisognerebbe capire se almeno sei riuscito ad accendere un display, poi uno schizzo dello schema non farebbe male.
Se inserici le descrizioni delle funzioni delle variabili, si comprende meglio lo sketch e le sue funzioni.

Comunque, se sulla seriale hai un feedbak dei dati letti corretti, sei già a buon punto.

I display che usi, dovrebbero essere a catodo comune. Ricorda che per vederli accesi, devi inserire dei piccoli ritardi che mantengano attive le uscite per almeno 50-100ms per display che dovresti aver inserito nello sketch, ed infine, ad ogni segmento inseire una resistenza non inferiore a 220ohm, perchè potresti bruciare i pin del 328.

Io comincerei a far accendere il display dei decimi, legato ad una variabile che và da 0 a 9 senza driver di mezzo come il 4511. (questo potrebbe tornarti utile, quando hai bisogno di pin liberi, in quanto è un decoder BCD da 4 a 7 segmenti il chè vuol dire che se lo dovessi usare, potresti risparmiare 3 pin)

Capito questo, passerei alla visualizzazione completa delle tre cifre e di conseguenza alla visualizzazione della variabile letta. smiley-wink
Logged

Un saluto a tutta la comunità.
Giuseppe G.

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie dell'attenzione giuseppe adesso tolgo un po di Serial.print per renderlo più leggibile e cerco di aggiungere commenti per renderlo di facile comprensione.
col programma sono vicino alla meta (penso)...la lettura della tensione e corretta un po imprecisa verso 1.2Volt  e 27Volt ma da quello che ho letto in giro meglio di cosi senza componenti esterni non si riesce.
ci vorrà un po ma sistemo il post dello sketch.
Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ti vuoi evitare il transistor per ogni cifra e vuoi usare il mutiplexing, puoi dare uno sguardo al mio progetto "Micrologio".
Trovi schema e sketch di un piccolo orologio standalone basato su 328 che comanda un display led a 4 cifre a 7 segmenti in multiplexing con le sole resistenze sugli anodi, senza driver o altri chip esterni.
Logged


Napoli
Offline Offline
Full Member
***
Karma: 3
Posts: 182
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, dai un'occhiata qui, c'è anche un mio intervento e del materiale relativo ad un tester per batterie che stavo realizzando.

Ciao.
Logged

Arduino 2009

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ecco lo schema


* multi_bb.jpg (426.25 KB, 1464x1023 - viewed 50 times.)
Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 518
Posts: 12321
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

680 ohm di r di limitazione mi sembra davvero eccessiva. Considera che se lavori in multiplexing il tempo di erogazione è così basso che puoi permetterti di diminuirle proprio tanto, e comunque già in condizioni normali non dovresti superare i 330ohm
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Giuseppe
-Creato al volo lo schema e reso spero leggibile lo sketch.
-Si i display sono a catodo comune l'ho scritto ma non l'ho riportato sulla "descrizione dello schema".
-Se non sbaglio, impostando secondo sketch, Fq=130 dovrebbero restare accese 130ms Decine 130ms Unità e 130 ms decimali o almeno quella era l'intenzione.
-le cifre le vedo in sequenza e la lettura è giusta ma se abbasso il valore Fq resta tutto spento e mi sfugge 
 se il problema stia nel Software o nell'Hardware o in tutti e due(Sbagliando si impara ma solo se si capisce
 cosa si ha sbagliato).
-per quanto riguarda il driver 4511 essendo 4 pin ingresso * 3 Display utilizzerei 12pin ed un sacco di punti 
 di stagnatura,21 resistenze e dovrei aggiungere una schedina in verticale perchè spazio in orrizontale....finito smiley-sweat ...attualmente col tentativo di multiplexing uso :7 pin per i segmenti + 3  per i catodi dei display + 1 temporaneo per la visualizzazione del punto che sposterò una volta integrato sull'alimentatore a +5V

@leo72
Domani provo a darci un'occhiata perchè adesso non toglierei un ragno dal buco e questo il link?giusto?
http://www.leonardomiliani.com/?p=487

@Freddy65
...ci do senz'altro un'occhiata domani mattina ma...il formato .pde... con quale programma lo apro?Eagle?
ad ogni modo domani lo scarico e vedo se si apre.

@Michele Menitti
ok se la stanchezza non mi inganna usando una resistenza da 330 otterrei un consumo di 10mA per segmento che sarebbe poi il consumo consigliato minimo sul datasheet (allegato) a funzionamento costante .i datasheet li leggo ad occhio non ne ho mai letto uno prima del mese scorso.
Io ho LG5011AS che non c'è ma presumo si rosso Ultraluminoso...puoi farci le operazioni laser agli occhi  smiley-grin con i 10mA per segmento.
con soli 4 segmenti accessi a funzionamento costante ci vorrebbe già il transistor....pero mi stai dicendo che pilotando in multiplexing potrei farlo (avevo notato anch'io sulla base delle prove che ho fatto che tra funzionamento costante e multiplexing c'è un'abbassamento della luminosità e quindi della corrente che passa).

Ora, secondo il programma che ho fatto e che non funziona come dovrebbe smiley-lol, io piloto una cifra alla volta ovvero nella condizione peggiore, la visualizzazione del numero otto, ho:
sempre parlando del funzionamento costante
nel mio caso con resistenza da 680 con un assorbimento I= 7segmenti*5mA=35mA
nel caso abbassasi la resistenza a 330 avrei  I= 7seg*10ma=70mA
Io non ho tutte le conoscenze per poterlo affermare ma per quanto poco resti attivo il segmento mi sa che è un po alta come corrente.
Tanto per chiarire non voglio contraddirti ma voglio solo capire.
Sempre per curiosità come mai non dovrei scendere al di sotto dei 10mA(ovvero non dovrei superare i 330ohm)?cosa potrebbe succedere?
Mi sembrava di avere letto su un tuo precedente post in un altra discussione e se non ricordo male, che ci fosse la possibilità di togliere del tutto le resistenze?

Bene signori per il momento grazie a tutti per l'aiuto vi aggiornerò sulle novità.
se domani non mi vedete vuol dire che sto porcheggiando nel tentativo di capire smiley

Grazie a tutti
Buona serata e a presto

* 390037 Display a led 7 segmenti - CC.pdf (88.19 KB - downloaded 8 times.)
Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 518
Posts: 12321
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

rispondo solo per la mia parte smiley-sweat
effettivamente mi servivano altre informazioni, come il modello di display ed il tipo di multiplexing, prima di sparare, quindi ti dò perfettamente ragione a contraddirmi. Io mi sono basato su due esperienze recenti:
- ho usato dei display in configurazione normale col 4511, ho visto che con 330 ohm si ha il massimo delle prestazioni senza accecarsi, ho dovuto considerare il fatto che lo strumento può lavorare anche in pieno giorno e nel mio piccolo lab per fortuna entra la luce del sole; chiaro che se fossi stato in uno scantinato con le candele avrei potuto usare delle R da 1kohm e mettere comunque gli occhiali da sole smiley
- ho sperimentato il multiplexing di Leo, a 3,3V, con un display costruito appositamente per il mux, nella configurazione che alimenta un display per volta, e sono arrivato alla determinazione che servono R da 22 ohm, ma giusto come protezione, in realtà ho alimentato il display senza le R per alcune ore; gli strumenti non son così veloci come il multiplexer e quindi le misure in corrente non sono molto affidabili, ma non ho mai intravisto valori maggiori di 3mA, quindi alla fine 22 ohm sono un valore di protezione del micro (in caso di corto di qualche segmento) e non di limitazione di corrente nell'uso normale, visto che ne passa molto meno.
Nel tuo caso si parla di 5V, le correnti in gioco aumentano, quindi potresti trovarti in condizioni simili alle mie, nel qual caso anche 330 ohm sarebbero troppi perché comunque passerebbe una corrente inferiore.
Dovresti provare a fare qualche misura con un buon multimetro (magari sul segmento che è più presente nelle 10 cifre del display) e vedere che ne esce; alla fine devi ottenere una luminosità idonea all'ambiente operativo del tuo circuito, se te ne serve tanta non trascurare la possibilità di aggiungere quattro transisor sui catodi, perché quelli che sono a rischio reale sono quei quattro pin.
Scusa per l'inutilità del mio intervento smiley
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

130 ms è TROPPO come tempo di accensione.
L'occhio umano vede cambiamenti d'immagine che siano inferiori a 30 Hz.
30 Hz sono 40 ms, tu stai usando un tempo che è 3 volte superiore, ottenendo una frequenza di 7/8 Hz. Non va bene.
Sicuramente hai uno sfarfallìo nella visualizzazione.

Inoltre sei afflitto dal problema dell'erogazione di corrente da un singolo pin di cui stavi discutendo con Michele, ossia avere una corrente talmente bassa da poter usare resistenze molto limitate. Devi andare a ragionare su frequenze di aggiornamento ancora più elevate: nel mio Micrologio io uso addirittura accensioni di qualche centinaio di microsecondi. In questo modo il consumo di 4 cifre non passa appunto i 3 mA.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ecco lo schema

lo schema è  incompleto  (se no vedi la cifra 1 piu luminosa della cifra otto )  ci vuole   un transitore sul comune di ogni cifra,
le resistenze su i segmenti non ci vogliono  o le metti molto basse (100 homs)  piu che altro facilitare il disegno dello stampato,  (il multiplex gia di suo fa passare pochissima corrente )  le resistente ci vanno solo se le cifre vengono accese senza multiplex

adopera   un display simile a questo che ha gia tutto colegato all'interno
facilita molto il tutto perche tieni il punto decilmale sempre a metà  _1.25 volt    12.58 volt

http://www.ebay.it/itm/0850-Display-7-Segmenti-4-cifre-alto-2-5cm-formato-grande-colore-BLU-/200842024882?pt=Componenti_elettronici_attivi&hash=item2ec31e17b2

come lettura sul pin analogico metti un partitore 6:1  es resistenze  1000-6000 homs

(ovviamente la tensione di ingresso non puo superare i 29,9 volt)


per leggere metti questo   (adoperato A5 come ingreso)

int k = map(analogRead(A5), 0, 1023, 0, 3000)/10*10;      
  

ti ritrovi k che e un numero intero  che visualizza   sia i volt  che i che i decimi
  es:  12,5 volt    k=  1250
es 1,2 volt        K=120

se dalla riga
 int k = map(analogRead(A5), 0, 1023, 0, 3000)/10*10;  
 togli /10*10  visualizzi anche i centesimi di volt

il punto decimale centrale   delle quattro cifre lo tieni senpre acceso con una resistenza adeguata

se i volt in ingresso   sono
es 13,50  K = 1350  e sul displai leggi   13.50  perche il punto è sempre acceso,
se lo zero a destra non lo vuoi puoi fare a meno di collegarlo e resta sempre spento (se metti il display a 4 cifre
se adoperi cifre singole  non lo metti nemmeno
« Last Edit: November 25, 2012, 05:48:44 am by gingardu » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

  case 7:
  sette();
  break;
  case 8:
  otto();
  break;
  case 9:
  nove();
  break;}
}
if(tempo-x>=Fq*3 && tempo-x<=Fq*4){          //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
 

 






questo sketc ha molte cose da sistemare ad iniziare dagli int che possono essere sostituiti da byte

mi sembra persino errato il modo di dichiarare i pin  
Code:
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  


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);
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Porca xxxx  smiley-grin smiley-grin smiley-grin
Risolto...al 99%
ho ancora un effetto ghost accetasi consigli intanto;
mi prenderei a picconate sugli stinchi se avessi il piccone smiley-grin smiley-grin
adesso vi spiego meglio e gentilmente mi spiegherete il perchè smiley
perso una settimana per una cavolata.......
Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

andando per ordine....il programma funziona...devo risolvere un biccolo bug sull'effetto ghost

@Menitti
secondo la mia modestissima opinione non ritengo che ci siano interventi inutili.
siamo qui per discuterne ovvio che ognuno ha la sua opinione (ed a volte ci sono delle sviste smiley ) e discutendone si cerca di arrivare a una soluzione smiley anzi se non avessi letto la tua guida sulla programmazione stand alone sarei ancora un bel po indietro smiley

@leo72
Hai perfettamente ragione ma la mia intenzione era partire con una sequenza di refresh di 1 sec e poi scendere man mano senza fare il conto che....ammetto la mia ignoranza mi sfugge la formula....mi sfugge anche.... "30 Hz sono 40 ms" e "ottenendo una frequenza di 7/8 Hz".
Per funzionare senza sfarfallii ho dovuto mettere Fq=2ms ma ho ottenuto l'effetto ghost che presumo sia dovuto appunto alla resistenza troppo alta o sbaglio??

special tanks @gingardu

senza questa formula          int k = map(analogRead(A5), 0, 1023, 0, 3000)/10*10;
non ne sarei mai venuto fuori.
sinceramente non mi convinceva....io avevo e sto usando(modificata per renderla di facile confronto)                      float k = (analogRead(A5)*(5.0/1023.0))*6   
mi sembra più precisa.
Un ringraziamento speciale perchè appunto non essendo convinto della formula l'ho inserita nel programmino con un bel serial print per fare un confronto.
vado a vedere nel serial monitor e sinceramente c'erano troppi "print" che avevo utilizzato per il debug del voltmetro per estrarre decine unita decimali dalla tensione e che creavano molta confusione.
allora ho ben pensato faccio pulizia,
inserisco le due formule,
serial print e posto la differenza sul forum.
cancello tutti i serial print tranne i due per le due formule carico il programma e vedo che i display scorrono più velocemente....
a questo punto mi sono illuminato....ho iniziato a ridurre la Fq (Frequenza d'aggiornamento) fino a togliere lo sfarfallio smiley
adesso soddisfatto al 99% devo eliminare l'effetto ghost.
Avevo pensato anch'io di usare i byte ma avrei avuto troppo da studiare.
Purtroppo per il tempo che ho a disposizione studio l'elettronica e le funzioni man mano che mi servono  smiley-sad
mi piacerebbe avere più tempo per dedicarmici ma non ne ho...tieni conto che nel pomeriggio mi devo organizzare per domani.....uff

Detto questo.....
ocuppano cosi tanta ram i serial print??????
comunque se riesco a togliere l'effetto ghost, che presumo sia dato dal fatto di resistenze troppo alte, ed una volta liberata la scrivania dall'attuale progetto do un'occhiata anche al micrologio di leo (sembra essere molto interessante visto che è citato più o meno ovunque) per arricchire le mie conoscenze ed anche al programma di freddy65.

Morale della storia togliendo i Serial.print che sul post li avevo già tolti per motivi di leggibilità ma non dal programma in quanto pensavo non influissero così tanto e portando la
Frequenza di refresh a 2 ms ottengo un buon risultato,,,ottimo se tolgo l'effetto ghost.
adesso provo a mettere mano sulle resistenze.

Grazie a tutti ragazzi
« Last Edit: November 25, 2012, 08:07:35 am by ZG84 » Logged

Solo due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi.

Albert Einstein

Pages: [1] 2 3   Go Up
Jump to: