aiuto sketch, errori e malfunzionamenti su display 7 seg * 4 digit

allora, sotto c’e’ il codice, spiego lo schema del circuito

4 display 7 segmanti con gnd in comune

tutti collegati in parallelo (i segmenti) con una resistenza da 1k per segmento (fa poca luce ma basta)

ogni display viene acceso singolarmente mandando a massa il gnd del display indicato

su analogread 0 leggo una tensione che converto in 0 / 9999 e vorrei visualizzare il numero ottenuto

tutto funzionava con 2 digit, ho allargato a 4 digit e non funziona piu’ bene, ci son caratteri senza senso o accesi parzialmente

mi controllate il codice? io ormai non ci capisco + nulla, mi sembra giusto ma e’ instabile nella visualizzazione, serve una correzzione professionale :slight_smile:

/*

 digit 1          digit 2          digit 3         digit 4
 1=LOW            1=HIGH           1=HIGH          1=HIGH
 2=HIGH           2=LOW            2=HIGH          2=HIGH
 3=HIGH           3=HIGH           3=LOW           3=HIGH
 4=HIGH           4=HIGH           4=HIGH          4=LOW
   

           Pin 10
          _______
         |       |
Pin 11   |       | Pin 9
         |_______|
         |   12  |
Pin 8    |       | Pin 6
         |_______|
           Pin 7    # punto pin 5

*/
int i=0;
unsigned int digit1;
unsigned int digit2;
unsigned int digit3;
unsigned int digit4;
unsigned int numero;

void setup()   {                

pinMode(1, OUTPUT);    //gnd display 1
pinMode(2, OUTPUT);    //gnd display 2
pinMode(3, OUTPUT);    //gnd display 3
pinMode(4, OUTPUT);    //gnd display 4

pinMode(5, OUTPUT);    //led punto decimale
pinMode(6, OUTPUT);    //led segmento
pinMode(7, OUTPUT);    //led segmento
pinMode(8, OUTPUT);    //led segmento
pinMode(9, OUTPUT);    //led segmento
pinMode(10, OUTPUT);   //led segmento
pinMode(11, OUTPUT);   //led segmento
pinMode(12, OUTPUT);   //led segmento

}

void loop()                     
{
  unsigned int numero = analogRead(0);     //leggo analog read pot da 10k tra gnd e +5v
  numero = map(numero, 0, 1023, 0, 9999);  //cosi' ho un numero tra 0 e 9999
      
//gnd dei display sono 1, 2, 3, e 4
//   1 LOW = primo numero
//   2 LOW = secondo numero
//   3 LOW = terzo numero
//   4 LOW = quardto numero

//qui c'e' casino, deve darmi le cifre, sembra giusto...

digit1 = (numero/1000);   //deve essere la cifra delle migliaia       

digit2 = ((numero - (digit1 * 1000))/100);   //deve essere la cifra delle centinaia
                             
digit3 = (((numero - (digit1 * 1000)) - (digit2 * 100))/10);  //deve essere le decine

digit4 = (((numero - (digit1 * 1000)) - (digit2 * 100)) - (digit3 * 10));  //deve essere le unita'


   //numero 1 acceso
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
letterfunction(digit1);

   //numero 2 acceso
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
letterfunction(digit2);

   //numero 3 acceso
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
letterfunction(digit3); 

   //numero 4 acceso
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
letterfunction(digit4); 

}


void letterfunction(unsigned char var){
if (var==1){
digitalWrite(9,HIGH);  //qui scrivo 1 sul display
digitalWrite(6,HIGH); 
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==2){
digitalWrite(10,HIGH);  //qui scrivo 2 sul display
digitalWrite(9,HIGH); 
digitalWrite(12,HIGH);
digitalWrite(8,HIGH); 
digitalWrite(7,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==3){
digitalWrite(10,HIGH);
digitalWrite(9,HIGH); 
digitalWrite(12,HIGH);
digitalWrite(6,HIGH); 
digitalWrite(7,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==4){
digitalWrite(11,HIGH);
digitalWrite(9,HIGH); 
digitalWrite(12,HIGH);
digitalWrite(6,HIGH); 
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==5){
digitalWrite(10,HIGH);
digitalWrite(11,HIGH); 
digitalWrite(12,HIGH);
digitalWrite(6,HIGH); 
digitalWrite(7,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==6){
digitalWrite(10,HIGH);
digitalWrite(11,HIGH); 
digitalWrite(12,HIGH);
digitalWrite(8,HIGH); 
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}

if (var==7){
digitalWrite(10,HIGH);
digitalWrite(9,HIGH); 
digitalWrite(6,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==8){
digitalWrite(10,HIGH);
digitalWrite(11,HIGH); 
digitalWrite(9,HIGH);
digitalWrite(12,HIGH); 
digitalWrite(8,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH); 
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==9){
digitalWrite(10,HIGH);
digitalWrite(11,HIGH); 
digitalWrite(9,HIGH);
digitalWrite(12,HIGH); 
digitalWrite(6,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}

if (var==0){
digitalWrite(10,HIGH);
digitalWrite(11,HIGH); 
digitalWrite(9,HIGH);
digitalWrite(8,HIGH); 
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
delay(5);
for(i=1;i<12;i++){
digitalWrite(i,LOW); 
}
}
}
}

senza diventare pazzo non c’era una libreria per decoder a 4bit serie CDxxxx ?

sicuramente c'e', ma io ho fatto tutto con arduino, 4 display e 8 resistenze, sempre per imparare come si fa...

sto cercando di capirci qualcosa :wink:
allora letter function è una funzione :slight_smile:
ma non capisco a cosa serva messa a piè di un certo comando ....
continuo a controllare :slight_smile:

no , letterfunction e' come scrivere abc, era di uno sketck diverso, in quello sketch ho modificato finche' mi funzionava (alla bell'e meglio...)

A parte che a vedere il codice così uno ci capisce il giusto XD
Hai provato con un bellissimo Serial.prinln() a spedirti digit1-4 sul terminale per vedere se i conti son fatti bene? :wink:

ho messo il serial print e i conti son fatti giusti e quando funziona, il numero che ho in seriale e' quello che leggo sul display 7seg*4

ma spesso il display visualizza led accesi a caso, il problema credo stia tutto nei tempi, visto che ci son 7 uscite per i segmenti e 4 buttano a massa per accendere il display corretto.

Non so ma non è che i caratteri senza senso che vedi sono dati dal veloce cambio di numero visualizzato sul display che, per la persistenza della visione, ti appaiono incomprensibili?

Mi spiego. Se i calcoli son giusti, per esclusione il problema deve risiedere nell'altra parte del programma, ossia nella visualizzazione degli stessi.
A me pare di aver interpretato lo sketch come un ciclo infinito di letture e visualizzazioni senza tempi di attesa fra una visualizzazione e la successiva (vedi ciclo loop).
Inoltre vedo che la visualizzazione di un numero è composto da 2 fasi: nella prima vengono accesi i segmenti necessari alla composizione del numero e subito dopo (delay(5), un'inezia), vengono messi a massa tutti i segmenti. Non capisco questa cosa: è corretto oppure no?
Che senso ha fare digitalWrite(12, HIGH) e poi dopo 5 ms fare digitalWrite(12, LOW)? Non lo accendi e spengi immediatamente?

si leo, funziona esattamente come hai detto, e' un ciclo infinito e molto veloce.

ora -prima di smontate tutto- provo con 3 display, con 2 andava perfettamente, con 4 va malissimo, forse 3 display e' il limite per come il codice per come deve visualizzare

lo si puo' sempre riciclare per fare un mini voltmetro xx,x

Appunto... non dovresti aumentare il delay(5) per far persistere la visualizzazione della cifra?

leo, ormai son quasi certo che quello sketch funzioni solo con 2 display, forse 3, mai 4…

magari se fatto su pcb invece di breadboard con fili volanti funziona bene…

domanda tecnica, se mando un uscita LOW HIGH in loop senza un delay questa a che frequenza lo fa? xche’ e’ quello che faccio nello sketch per mandare a massa i gnd dei display

Dipende dalla pesantezza del codice e quindi dal consumo di cicli del tuo sketch.
Non so quanto tutto il codice influisca, dovresti misurarlo con un oscilloscopio per avere un valore corretto.