Gestione display 7 segmenti

Salve a tutti, sono nuovo del mondo arduino e sto iniziando a muovere i primi passi, sono sicuro che ci divertiremo! XD

Veniamo al dunque, sto provando a fare qualche sketch per prova e volevo fare un sistema con un display a sette segmenti che contasse avanti o indietro alla pressione di due pulsanti.
Non ho a disposizione gli appositi integrati driver binario/sette segmenti, e comunque preferirei non utilizzarli perchè voglio provare a poter gestire i singoli segmenti personalmente per scrivere anche lettere.
Per ora l'unico modo che mi è venuto in mente è quello, alla pressione di un pulsante, aggiungere o sottrarre uno ad una variabile, controllare tale variabile tramite la funzione switch e poi inserire i vari casi, da 0 a 9, andando direttamente a mettere HIGH o LOW i pin collegati ai segmenti: metodo amatoriale all'ennesima potenza!

Mi chiedevo se esistesse un modo più raffinato, che mi consigliate?

quello che mi è venuto in mente ad esempio (la sparo) è facendo in modo di utilizzare un byte i cui bit siano collegati a 7 pin di arduino e con cui io possa dire semplicemente quali mandare in HIGH o LOW scrivendo il byte bit per bit (non so se mi sono spiegato, esempio con un display a catodo comune dicendo ad arduino 1,1,1,1,0,0,1,0, corrispondenti ad a,b,c,d,e,f,g,dot per far venire il 3)...si potrebbe fare o esistono sistemi migliori?!

La tua idea è quella giusta. Se apri il link della mia firma e sul mio sito cerchi il progetto Micrologio vedrai come si può pilotare un display a 7 segmenti e 4 cifre usando solo 1 chip, senza driver esterni.
L'articolo comprende sketch e schema.

Ciao,
questo display venduto da SparkFun (SparkFun 7-Segment Serial Display - Blue - COM-11442 - SparkFun Electronics) è comandabile tramite un collegamento seriale, SPI o I2C.
Ma non è per questo che lo sto indicando.
Se guardi la foto del retro noterai che è stato assemblato insieme a un ATmega328P, ovvero lo stesso microcontrollore (in diverso formato) che monta Arduino UNO. Ogni pin del micro è collegato ad un segmento ( o gruppi di segmenti), come vuoi fare tu. [nota anche la presenza delle resistenza]


La cosa interessante è che Sparkfun pubblica i codici sorgenti che permettono al display di funzionare.
Se la cosa ti può interessare, per approfondire l'argomento, ti consiglio di dargli uno sguardo.
Il codice è molto complesso ma con pazienza e metodo se ne viene a capo, scoprendo soluzioni interessanti.
Ecco il link --> Serial7SegmentDisplay/firmware/Serial 7-Segment Display/Serial_7_Segment_Display_Firmware at master · sparkfun/Serial7SegmentDisplay · GitHub

Buona lettura.

Grazie ragazzi!
Ho dato un occhiata al tuo progetto Leo...sono rimasto un po' spiazzato, sicuramente andare a capire i progetti di altri non è mai semplice, figuriamoci all'inizio, però penso di aver capito come fare su arduino quello che avevo in mente...e comunque continuerò a studiare il tuo ottimo lavoro dopo aver provato se ho capito come impostare il mio banalissimo contatore! XD

Il display SparkFun sembra interessante, ma direi di fare un passo alla volta, anche perchè per il momento di display ne sto usando uno solo...quell'attrezzo è decisamente troppo per me al momento!

Incredibilmente tutto funziona! XD
A spippolare con il 7 segmenti mi è venuto in mente un progettino interessante... inizio subito a chiedere lumi in un altro post dedicato
Grazie!!

Artal:
Incredibilmente tutto funziona! XD
A spippolare con il 7 segmenti mi è venuto in mente un progettino interessante... inizio subito a chiedere lumi in un altro post dedicato
Grazie!!

Come/cosa hai fatto? :wink:

Allora, vediamo un pò, dimmi anche se la soluzione è corretta!
L'idea che mi è venuta è quella di creare una sorta di sistema per il cambio sequenziale al volante di un go-kart, senza perderci troppo nei particolari generali il display 7 segmenti deve andare da 1 a 6 per le marce ed indicare "n" per la folle.
Per prima cosa ho impostato le varialbili così:

// numero dei pin di arduino collegati ai segmenti
const byte seg_A = 2;
const byte seg_B = 3;
const byte seg_C = 4;
const byte seg_D = 5;
const byte seg_E = 6;
const byte seg_F = 7;
const byte seg_G = 8; 

// array dei segmenti
const byte segments[7] = {
  seg_A, seg_B, seg_C, seg_D, seg_E, seg_F, seg_G,};

// array byte in uscita per ogni valore (l'ultimo valore non è mai utilizzato)
const byte numbers [7] = {                                       
  0b10101011, // n 
  0b11111001, // 1
  0b10100100, // 2
  0b10110000, // 3
  0b10011001, // 4
  0b10010010, // 5
  0b10000010, // 6
};

// variabile numero di marcia
byte gear = 0;

A questo punto c'è tutti il sistema che legge due pulsanti ed aumenta o diminuisce il valore di "gear" fino al masimo di 6 e minimo di 1, poi ho impostato un altro pusante che nel caso la marcia sia la 1 o la 2 inserisce la folle con una serie di if.
Ad ogni cambio di stato mando in esecuzione la funzione qui sotto per il cambio di scritta sul display:

void sevseg_write(){  
  for (byte i=0; i<7; i++){
    digitalWrite(segments[i], bitRead(numbers[gear], i));
  }
}

Che ne dici? Come funzionare funziona! :slight_smile:
Vorrei provare anche a metterlo in pratica ma non ci capisco molto su hardware e gestione software dei motori passo passo, se hai qualche fonte dove poter imparare qualcosa te ne sarei grato! XD

Sui motori non posso aiutarti, non li ho mai sperimentati. Ma sul forum trovi centinaia di post sull'uso dei passo passo