Problema Contatore punteggio con 8 display

Ciao a tutti, potete aiutarmi a capire come realizzare un contatore punti, ma anche semplicemente come stampare su moduletto a 8 display a sette segmenti gestito dal max7219, un valore numerico, esempio creivere un numero statico. Il modulo display è il seguente:
link

Ho avuto difficoltà a capire dagli esempi che ho trovato in rete, potete gentilmente farmi un codice esempio per stampare un numero o scritta? naturalmente se è una cosa semplice. La struttura può del punteggio ed altro ci penso io :wink:
sarebbe bello avere un contatore che addiziona +10 ogni 25ms, almeno da capire come si comporta
Grazie comunque

Allora, facendo diverse ricerche, ho capito che stampare un numero come 1340 è molto semplice, basta assegnare l' indirizzo e scrivere su ogni rispettivo display, il rispettivo numero es:
display 0 scrivi numero "0"
display 1 scrivi numero "4"
display 2 scrivi numero "3"
display 3 scrivi numero "1"

le cose sembrano molto complesse se devo invece creare un cronometro oppure un contaimpulsi, sapete se c'è qualcosa di simile sul web, io non ho trovato niente di simile purtroppo.
Grazie

edstarink:
le cose sembrano molto complesse se devo invece creare un cronometro oppure un contaimpulsi, sapete se c'è qualcosa di simile sul web, io non ho trovato niente di simile purtroppo.

A me sembra piuttosto semplice ...
... ti crei una funzione a cui passi il numero da visualizzare, questa lo scompone nelle cifre che hai a disposizione (se hai 4 display, lo scomponi in 4 cifre) e scrive le quattro cifre sui 4 display.

In questo modo, ogni volta che vuoi aggiornare il display, basta che passi il valore alla funzione e quella aggiorna il tutto.

Guglielmo

Ciao Giuliano, grazie del tuo prezioso aiuto, lo so che per te è facile :smiley: ma non lo è per me purtroppo.
Sono abituato al classico display 16x2, li le cose sono molto più semplici. Sto provando a capire dagli esempi trovati in rete, ma ancora niente :sob:

Ci provo anche se ammetto di non aver dimestichezza con tale display e libreria...
Se sai scrivere le varie cifre prese singolarmente come da tuo post e seguendo il consiglio di Guglielmo fai una funzione con parametro int o byte in base alle esigenze, all'interno della funzione usi la funzione itoa che ti trasforma il numero in array di char, un semplicissimo for e invii i singoli caratteri ai singoli display

non vorrei sbagliare...dovrebbe esistere già una libreria che gestisce più matrici...mi sembra si chiamo "parola".

fabpolli:
Ci provo anche se ammetto di non aver dimestichezza con tale display e libreria...
Se sai scrivere le varie cifre prese singolarmente come da tuo post e seguendo il consiglio di Guglielmo fai una funzione con parametro int o byte in base alle esigenze, all'interno della funzione usi la funzione itoa che ti trasforma il numero in array di char, un semplicissimo for e invii i singoli caratteri ai singoli display

No, purtroppo non riesco :confused:
Sono molto basico...parecchio basico e ammetto che da solo per fare questa semplice, per voi, struttura, mi porterebbe via troppo tempo, e sicuramente senza ottenere successo. Era un progettino che volevo caricare nel mio canale, un Pinball fai da te con un semplice display che segnava il punteggio, ma mi sa che devo mettere il display 16x2 o 20x4 dove mi trovo meglio. Non ho mai avutio esperienza con i display a 7 segmenti, tranne per qualche progettino con integrati cmos.
Pensavo bastasse una variabile che viene stampata su display, come faccio sempre, ma con questo mpduletto pare non sia cosi'.
Se qualcuno di voi volesse aiutarmi, ben venga, lo metterò nei crediti del video con link al proprio sito web oppure email o quello che volete voi. Considerate che questi miei progettini arrivano a toccare milione di views.
Intanto mi arrangio da solo con il tempo che trovo e grazie per il vostro tempo

Se vuoi fare un pinball i sette segmenti sono quasi un obbligo morale :slight_smile:
Ti butto qua un pezzo di codice che sto scrivendo senza provare e senza avere il display quindi è "così com'è":

void updateDisplay(int numToWrite)
{
   char outBuf[8];
   itoa(numToWrite, outBuf, 10);  //Converte il numero in char array in base 10
   byte nLen = strlen(outBuf);
   for(byte idx=0; idx<nLen; idx++)
   {
      //Qui devi metterci del tuo perché non conosco la libreria
      //libreria.scrivi(numero_display, carattere_da_scrivere)
      libreria.scrivi(idx, outBuf[idx]);
   }
}

Quando devi scrivere sul display la richiami, manca la funzone che lo pulisce prima di scrivere il nuovo valore perché non conosco la libreria ma un cler o qualcosa del genere dovresti trovarlo ed inserirlo appena prima del for.
La variabile nLen è superflua, inserita a solo scopo di rendere il codcie più leggibile.
Prova ad integrare il codice e guarda se funziona (magari con qualche piccolo aggiustamento)

fabpolli:
Se vuoi fare un pinball i sette segmenti sono quasi un obbligo morale :slight_smile:
Ti butto qua un pezzo di codice che sto scrivendo senza provare e senza avere il display quindi è "così com'è":

Quando devi scrivere sul display la richiami, manca la funzone che lo pulisce prima di scrivere il nuovo valore perché non conosco la libreria ma un cler o qualcosa del genere dovresti trovarlo ed inserirlo appena prima del for.
La variabile nLen è superflua, inserita a solo scopo di rendere il codcie più leggibile.
Prova ad integrare il codice e guarda se funziona (magari con qualche piccolo aggiustamento)

Ti ringrazio moltissimo per il codice.

Infatti, era un progetto di tantissimi anni fa, ma niente a che vedere con quello che realizzerò. Il vecchio progetto era qualcosa di fantastico, monitor 21" 18 solenoidi, 4 rampe, 3 binari e due modalitàò di gioco ma soprattutto, Hardware e Software da me progettato, ma sul mio canale non posso fare un video per un progetto come quello, richiede una serie :slight_smile: mi limito a qualcosa di simpatico, con qualche solenoide, luci ecc, ma purtroppo, non comprendo il codice che mi hai postato.
In pratica ho 5 ingressi, dove ad ogni ingresso corrisponde un punteggio, es: 50, 500, 1000 ecc e ogni volta che porto il positivo o gnd al relativo ingresso, addiziona il valore assegnato al punteggio. quattro uscite dedicate ai led per lo stato palline e un solenoide per la messa in campo della pallina. a me serve solo gestire il punteggio, al resto ci penso io. Se vuoi farla tu quella parte, mi farai felicissimo, in altro modo, ti ringrazio ugualmente e farò delle prove con lo sketch che mi hai scritto, ma prevedo... :o :o :slight_smile:
Dai, grazie ancora

Allora, credo di aver capito la logica, un po da "Guglielmo" che sbaglio sempre il suo nome :stuck_out_tongue: e da fabpolli.
In realtà è semplicissimo, per chi ha domestichezza con il C, per me, che provengo da un' altro linguaggio, risulta problematico...E pensare che ho fatto migliaia di volte questa cosa con Multimedia fusion :frowning:

Vediamo se ho capito:
Alla funzione porto il valore del punteggio, esempio una int score;
poi, dentro a quella funzione, la funzione stessa scompone quel numero, esempio 15300 in un' array in modo da avere 1, 5, 3, 0, 0, 0, 0, 0 (avrò anche i valori delle altre celle restanti, 8 in totale)
In questo caso, con un ciclo for, leggo una ad una la cella del' array, e porto i singoli valori, nei singoli display.
La logica è semplice, ma ho ancora alcune lacune su come scrivere questa funzione.

edstarink:
Vediamo se ho capito:
Alla funzione porto il valore del punteggio, esempio una int score;
poi, dentro a quella funzione, la funzione stessa scompone quel numero, esempio 15300 in un' array in modo da avere 1, 5, 3, 0, 0, 0, 0, 0 (avrò anche i valori delle altre celle restanti, 8 in totale)
In questo caso, con un ciclo for, leggo una ad una la cella del' array, e porto i singoli valori, nei singoli display.
La logica è semplice, ma ho ancora alcune lacune su come scrivere questa funzione.

Ci sei quasi, iin realtà se alla funzione arriva l'int 15300 la itoa lo trasformerà in un array così:
1,5,3,0,0,\0
L'ultimo char dell'array (lo \0) è il carattere terminatore delle stringhe C quindi se tu hai la necessità di stamparlo su 8 caratteri, credo che la rappresentazione corretta sia 0,0,0,1,5,3,0,0 essendo un punteggio, hai due possibilità:

  • usi la strlen che di dice quanto è lunga una stringa e con un primo for stampi sui primi N display (a sinistra intendo) tanti caratteri zero quanti ti serve per visualizzare correttamente il punteggio, in pratica 8-lunghezza_stringa e poi con un altro for stampi nei restanti display le varie posizione dell'array di char restituito dalla funzione itoa (qui hai intuito bene)
  • manipoli l'array di char in modo da avere gli zeri all'inizio e con un solo for stampi dal display più a sinistra a quello più a destra i vari caratteri del vettore, e per questo puoi copiare questo codice

Il codice del secondo punto è un ottima alternativa all'utilizzo delle funzioni di manipolazione delle stringhe strncpy e strncat che copiano e concatenano stringhe

Grazie infinite per l' aiuto, ma per il mio livello, è troppo complesso, non per quanto riguarda la logica, ho fatto quelle conversione moltissime volte, ma usando un linguaggio molto diverso dal C e che non ha niente a che vedere con altri simili.
Mi chiedo perchè non esista una libreria che possa fare questo, senza necessariamente fare tutto questa conversione :o
Nei display 16x2 esempio, tutto questo non serve, forse perchè sono a matrice di punti oppure perchè piu utilizzati? se devo mettere un punteggio, stampo semplicemente il valore di una variabile nella posizione che voglio, mentre su questo moduletto, devo trattare singolarmente i display perchè da 0 a 9 il problema non esiste, ma se il numero diventa a due cifre, il numero non passa al secondo display, ma devi dirglielo tu attraverso un ciclo for oppure istruzione per istruzione.
prendi il primo carattere e stampalo nel primo display, prendi il secondo carattere e stampalo nel secondo dispaly e cosi via...
Io purtroppo non riesco, te lo dico apertamente e non voglio farti perdere più tempo perchè ci arrivo solo a logica, ma mia mancano le basi per scriverlo in C. Vedrò di usare un' altro display, anche se quello per me sarebbe stato il massimo :slight_smile: OPPURE, realizzare un contapunti rotativo stile ruota della fortuna, tanto per rimanere in tema "fai da te" :slight_smile:
Grazie infinite per il tuo tempo, ma sono troppo inesperto :confused:

Guarda, il tempo che dedico al forum lo decido in autonomia e lo faccio con piacere quindi non c'è problema :slight_smile:

Detto questo se invece di gettare la spugna prendi il codice della funzione che ho messo in precedenza, all'interno di questa ci metti anche il codice del topic che ho linkato e lo provi forse ti va anche alla prima, altrimenti metti qua il programma che lo sistemiamo assieme, poi sta a te sapere se vuoi far uscire il video a razzo o se investire alcuni giorni e avere l'effetto che desideri (e che io auspico in quanto pinball e 7 segmenti sono inscindibili nella mia testa)

fabpolli:
Guarda, il tempo che dedico al forum lo decido in autonomia e lo faccio con piacere quindi non c'è problema :slight_smile:

Detto questo se invece di gettare la spugna prendi il codice della funzione che ho messo in precedenza, all'interno di questa ci metti anche il codice del topic che ho linkato e lo provi forse ti va anche alla prima, altrimenti metti qua il programma che lo sistemiamo assieme, poi sta a te sapere se vuoi far uscire il video a razzo o se investire alcuni giorni e avere l'effetto che desideri (e che io auspico in quanto pinball e 7 segmenti sono inscindibili nella mia testa)

Sei molto gentile, ti ringrazio per la tua perseveranza sul fatto che io possa da solo mescolare i due sorgenti e tirare fuori il tutto, ma visto che ci credi tu, ci credo pure io e lo farò :slight_smile:
Anche il contapunti con servomotore e ruota era simpatico, ma preferisco alla lunga il punteggio con quei display che ti dirò, da piccolo ne avevo a migliaia perchè li staccavo dalle fotocopiatrici che trovavo dallo sfasciacarrozze, solo perchè mi affascinavano. Purtroppo accendevo i led con le resistenze per fare delle scritte statiche oppure con qualche integratino dedicato, ma senza ottenere niente di interessante.
Posso dire la mia soluzione? è una variante semplificata. Il punteggio è semplice da realizzare, si tratta di addizionare i valori di diverse variabili o costanti ad una variabile dedicata al punteggio totale e qua è tutto molto semplice.
ad ogni pulsante o ingresso, corrisponde un valore, esempio: 50, 150, 1000, 10.000 ecc

realizzare 8 istruzioni...aspetta, lasciamo il ciclo for per un momento :slight_smile: dove, ad ogni istruzione prende il primo valore della variabile "punteggio"e lo porta al primo display, ma come si fa? l' istruzione che prende il primo valore della variabile non la conosco, ma conosco gli array. usando un' array a 8 celle e metterci dentro tutto il punteggio. Lo so, sto facendo consufione, ma ci sono altre cose che non conosco, e che non so neanche spiegre :slight_smile: come per esempio, il display che non contiente numeri, deve stare spento e non stampare "0" perchè vedere un display che mostra 00000010 mostra confusione, come quella che ho in testa.
Mi metto in opera con i codici che mi hai postato e vediamolo insieme, io ho il moduletto quindi faccio da test :wink:

Ho provato a fare uno sketch, la mia difficoltà sta nel mettere su un' array i valori di una variabile che ho chiamato punteggio. L' ordine di visualizzazione lo faccio io manualmente, non è un problema perchè sono istruzioni singole, basta cambiare il numero dove far visualizzare tale numero a tale display.
Adesso vorrei appoggiarmi a quella variabile int punteggio, dove la userò per addizionare i punti, ma poi questa variabile deve essere scomposta dentro un' array per vedere il punteggio sul display a 7 segmenti, potete aiutarmi?

#include "LedControl.h"

LedControl lc = LedControl(12, 13, 10, 1);

unsigned long delaytime = 250;
int array[8] = {0, 0, 0, 0, 2, 6, 5, 1,};
int punteggio=3579; // devo mettere la variabile punteggio dentro un' array

void setup() {

  lc.shutdown(0, false);
  lc.setIntensity(0, 8);
  lc.clearDisplay(0);
}


void loop() {

    lc.setDigit(0, 7, array[0], false);
    lc.setDigit(0, 6, array[1], false);
    lc.setDigit(0, 5, array[2], false);
    lc.setDigit(0, 4, array[3], false);
    lc.setDigit(0, 3, array[4], false);
    lc.setDigit(0, 2, array[5], false);
    lc.setDigit(0, 1, array[6], false);
    lc.setDigit(0, 0, array[7], false);
    delay(delaytime);

//  lc.clearDisplay(0);
  delay(delaytime);
}

Il problema è che questo codice non fa uso delle funzioni che ti ho indicato (e praticamente scritto) nei post precedenti, integra tali accorgimenti e fondi con il tuo lc.setDigit.
Non saltare fuori con il discorso del tuo livello non sufficiente di preparazione con il C perché richiamare una funzione con un parametro è una cosa che difinirla basilare è quasi troppo

lo so, per questo ti dicevo che ho problemi in C
Purtroppo non ho mai fatto programmazione, ho solo studiato da qualche libro e imparato dai tutorial, ma il mio problema è che mi dedico allo studio saltuariamente; Ho un canale Youtube molto attivo che mi porta via tutto, e dico tutto il mio tempo libero tanto che, da appassionato di cinema, non riesco più a vedere un film. Il problema è che non faccio spesso uso di arduino nei miei progetti e quando ne propongo uno, perdo tutto quello che ho appreso per fare quello precedente. Lo ammetto, ho difficoltà con le funzioni nel senso che non capisco quando utilizzarle anche se riconosco la loro utilità ma c'è un meccanismo che non riesco a farmi entrare in testa. Tu mi hai fatto un codice, e poi mi hai inserito un link con un' altro codice, ma metterli insieme per te sarà semplicissimo e troverai assurdo che non lo sia anche per, ma ti assicuro che ho alcune lacune. Imparare il C a quarant' anni, con un lavoro e un dopolavoro non è facile, anche se ci sto provando. Aiutami tu, dammi dei link su qualche tutorial riguardo alle funzioni, cerco di farmele entrare in testa :slight_smile:

Non ti sto dicendo che ti deve venire facile, ma solo che ti è stato fornito un pezzo di codice perfettamente funzionante (al netto di errori di scrittura) e che integrandolo così com'è quantomeno vedresti stampare i valori sullo schermo senza gli zeri iniziali e quindi allineato a sinistra anziché a destra semplicemente richiamando la funzione passandogli il numero che vuoi veder stampato, alla fine hai un programma che staticamente di stampa dei valori, ti basta mettere nel loop la chiamata alla funzione con un numero fisso e andare a mettere l'istruzione che già usi in questo momento nel loop denttro la funzione per stampare i vari valori, se non ti riuscisse fare un for nonc'è problema metti tutte le iscrtuzioni che usi ora dentro al loop nella funzione cambiando il nome dell'array in modo che sia uguale tra quello che usi per stampare i valori e quelli usato nella funzione atoi (quindi ti basa usare il solito nome).
Non è cattiveria credimi ma è solo rispetto del regolamento e non voler servire la pappa pronta, aiuto volentieri ma mi piace anche vedere un minimo di sforzo da parte di chi aiuto per tentare di arrivare alla soluzione migliorandosi, daltronde lo dici tu stesso che è un "passatempo" e sta a te decidere a cosa dedicarti, se dedichi tanto tempo al tuo canale evidentemente ti da soddisfazioni e/o rientri economici altrimenti non lo faresti. Vedere un film, aggiornare il canale youtube o apprendere nuove informazioni (informatiche, di cucina, ecc.) è una scelta, il tempo non è infinito e occorre direzionarlo dove meglio. Mia opinione, se devi fare un tutorial per questa cosa con Arduino devi avere un idea ben precisa da mostrare altrimenti perché un utente dovrebbe seguire il tuo piuttosto che uno dei circa 7800 che vengono fuori digitando Arduino pinball display?
Magari distinguersi potrebbe proprio essere la via di non usare questo genere di display ma qualcosa di mai visto associato al pinball ma alla fin fine tutto ciò che uno può pensare di fantasioso passa dalla scomposizione in singole cifre si un numero, tranne che la semplice visualizzazione su un display lcd che però snatura tutto il progetto o forse no magari vuoi approcciare all'utenza entry level e allora potrebbe andare più che bene

Ciao, sono d' accordo con tutto quello che hai scritto, non fa una virgola, se sapevo che era cosi complicato, intendo per me naturalmente, non mi sarei dilungato piu di tanto.
Hai ragione, il tempo non è infinito e solitamente lo dedichiamo a quello che piu ci gratifica, in questo caso io mi sono buttato sul mio canale Youtube che mi da molte soddisfazioni, ma anche forte stress e poche ore di sonno. Quello che io faccio per il mio canale, molti di voi lo fanno con la programmazione, studio, musica o altre passioni e fare bene piu cose insieme è molto difficile. Il flipper che costruisco, non è indirizzato ad Arduino anche perchè non è un tutorial sulla realizzazione di un contapunti con arduino, ma un video di intrettenimento sulla costruzione di un mini flipper in legno con parti elettromeccaniche e naturalmente, con Download gratuito del sorgente arduino per i folli che vorranno costruirlo sulla mia base.

Ritornando allo Sketch che mi hai scritto:

Ti butto qua un pezzo di codice che sto scrivendo senza provare e senza avere il display quindi è "così com'è":

Da quanto ho intuito, potrebbe essere un codice funzionante ma potrebbe anche avere qualche errore visto che non lo hai provato e purtroppo, io oltre che a capirlo a grandi linee, non sarei in grado di capire l' errore, se presente.
itoa non so cosa sia o meglio, non ho mai avuto a che fare e capisci che probabilmente è un codice non per per principianti? come sono io?
Voi potete mazzularmi sul fatto che, se non ho le competenze per capire un codice come questo, di cominciare dalle cose piu semplici, oppure studiare, ma purtroppo non posso investire mesi di studio per un flipper di legno dove l' unica sua destinazione, è mirata per fare un video. Lo ammetto, cercavo qualcosa di pronto, ma non un codice intero, una parte che mi permetteva di capire come come gestire questo moduletto, ma mi dispiace, non sono riuscito a capirla e pensavo fosse molto piu semplice. La logica ha un limite, se non sai scrivere il codice non ottieni il risultato.
Mi dispiace solo di averti fatto perdere tutto questo tempo, ma non posso investire piu di tanto per un progetto che una volta costruito, andrà rismontato per il recupero dei materiali, sempre che non venga una cosa divertente da dedicare tempo con i figli.
Non mi fermo qua per rispetto al tempo che mi hai dato, ma lo riprenderò piu avanti cercando di capire il tuo codice e fare come hai detto tu per avere i numeri stampati nel verso giusto.
Grazie ancora e scusate se non sono un cima in C, ma sono fare bene tante altre cose :slight_smile:

edstarink:
Ciao, sono d' accordo con tutto quello che hai scritto, non fa una virgola, se sapevo che era cosi complicato, intendo per me naturalmente, non mi sarei dilungato piu di tanto.
Hai ragione, il tempo non è infinito e solitamente lo dedichiamo a quello che piu ci gratifica, in questo caso io mi sono buttato sul mio canale Youtube che mi da molte soddisfazioni, ma anche forte stress e poche ore di sonno. Quello che io faccio per il mio canale, molti di voi lo fanno con la programmazione, studio, musica o altre passioni e fare bene piu cose insieme è molto difficile. Il flipper che costruisco, non è indirizzato ad Arduino anche perchè non è un tutorial sulla realizzazione di un contapunti con arduino, ma un video di intrettenimento sulla costruzione di un mini flipper in legno con parti elettromeccaniche e naturalmente, con Download gratuito del sorgente arduino per i folli che vorranno costruirlo sulla mia base.

Ritornando allo Sketch che mi hai scritto:Da quanto ho intuito, potrebbe essere un codice funzionante ma potrebbe anche avere qualche errore visto che non lo hai provato e purtroppo, io oltre che a capirlo a grandi linee, non sarei in grado di capire l' errore, se presente.
itoa non so cosa sia o meglio, non ho mai avuto a che fare e capisci che probabilmente è un codice non per per principianti? come sono io?
Voi potete mazzularmi sul fatto che, se non ho le competenze per capire un codice come questo, di cominciare dalle cose piu semplici, oppure studiare, ma purtroppo non posso investire mesi di studio per un flipper di legno dove l' unica sua destinazione, è mirata per fare un video. Lo ammetto, cercavo qualcosa di pronto, ma non un codice intero, una parte che mi permetteva di capire come come gestire questo moduletto, ma mi dispiace, non sono riuscito a capirla e pensavo fosse molto piu semplice. La logica ha un limite, se non sai scrivere il codice non ottieni il risultato.
Mi dispiace solo di averti fatto perdere tutto questo tempo, ma non posso investire piu di tanto per un progetto che una volta costruito, andrà rismontato per il recupero dei materiali, sempre che non venga una cosa divertente da dedicare tempo con i figli.
Non mi fermo qua per rispetto al tempo che mi hai dato, ma lo riprenderò piu avanti cercando di capire il tuo codice e fare come hai detto tu per avere i numeri stampati nel verso giusto.
Grazie ancora e scusate se non sono un cima in C, ma sono fare bene tante altre cose :slight_smile:

secondo il mio modesto parere sei partito col "piede sbagliato"
il max 7219 è il dispositivo giusto per pilotare i 7 segmenti la sua libreria fa il minimo indispensabile,
ma ti devi costruire tu il sistema di visualizzazione,
devi partire da un semplice valore da visualizzare
poi magari migliorare il tutto spegnendo le cifre non significative fino ad arrivare a visualizzare i numeri col meno - d'avanti -1 -12 -123 -1235 -2345679
e una volta che ti sei fatto la tua parte di sketc funzionante la puoi usare in tutti i progetti che vuoi con poche o nessuna modifica :wink: