Contatore punti 8 display 7 segmenti, codice realizzato, ma con problema

Ciao Guglielmo, ho visto che hai chiuso il vecchio post, quindi, ne ho aperto un' altro con un codice che sono riuscito a generare ma ho questo problema, spero mi aiutate almeno a capire :slight_smile:

Ho messo una variabile "countnumber" che, qualsiasi valore assegno ad inizio programma, me la stampa sui display con spenti quelli a sinistra che non hanno un valore da stampare, esempio sotto:
00000123
123 (Viene mostrato in questo modo)

A questo punto, manca la parte che va a contare e l' ho fatta attraverso un' ingresso che, quando a livello alto, addiziona +1500 al contatore (countnuber=countnumber+1500;)
Ho aggiunto anche un delay come debouncer da pochi milliecondi

Il problema è che, quando porto a livello alto, il contatore non addiziona +1500, ma molto, molto di più, come se ci fosse un moltiplicatore e non lo fa istantaneamente, ma i numeri scorrono come se ci fosse un tempo di qualche secondo, una sorta di cronometro quindi. Ho provato a cambiare valore con +1 invece di +1500 per vedere il valore totale, e con un valore iniziale di 1200, trovo letto 1285

Tengo a precisare che do solo un' impulso velocissimo, ma il contatore continua a contare anche dopo il rilascio per un tempo totale di qualche secondo.

IL DELAY NON CAMBIA LA FREQUENZA DI CONTEGGIO, MA IL NUMERO DA CONTEGGIARE
PIU E' BASSO IL DELAY E PIU ALTO è IL PUNTEGGIO TOTALIZZATO ATTRAVERSO UN SOLO IMPULSO

se invece rimuovo il delay, il contatore con l' impulso arriva a totalizzare 1918, sempre nel lasso di tempo di qualche secondo.

è come se le operazioni rallentino il codice, ma nello sketch non esistono delay, a parte quello che ho messo io e non capisco perchè non viene visualizzato istantaneamente

Spero di essermi spiegato bene, in caso contrario, ditemi cosa non è chiaro
Grazie

#define Max7219DIN 12  // Pin 7 connected to DIN (DataIN)
#define Max7219CLK 13  // Pin 6 connected to CLK
#define Max7219CS 10   // Pin 5 connected to CS


const int buttonPin = 2;     // the number of the pushbutton pin
#include "LedControl.h"  // LedControl Library created by Eberhard Fahle at http://playground.arduino.cc/Main/LedControl

LedControl lc = LedControl(Max7219DIN, Max7219CLK, Max7219CS, 1); // Last number represent the number of Max7219 Modules connected

long int countnumber = 1200 ; // VARIABILE CONTATORE
int buttonState = 0; 

// Variables to store individual numbers
int  firstnum = 0;
int  secondnum = 0;
int  thirdnum = 0;
int  fournum = 0;
int  fivenum = 0;
int  sixnum = 0;
int  sevennum = 0;
int  eightnum = 0;

void setup() {
  lc.shutdown(0, false); // Wake up the display
  lc.setIntensity(0, 7); // Set Brightness 0-15
  lc.clearDisplay(0);  // Clear display
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

}

void loop() {


buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) 
  countnumber=countnumber+1;
  delay(0);

  {
 
    //  Display number on Display depending on number of digits remaining
    if (countnumber > 9999999) {
      firstnum = ((countnumber / 10000000) % 10);
      secondnum = countnumber / 1000000 % 10;
      thirdnum = countnumber / 100000 % 10;
      fournum = countnumber / 10000 % 10;
      fivenum = countnumber / 1000 % 10;
      sixnum = countnumber / 100 % 10;
      sevennum = countnumber / 10 % 10;
      eightnum = countnumber % 10;

      lc.setDigit(0, 7, firstnum, false);
      lc.setDigit(0, 6, secondnum, false);
      lc.setDigit(0, 5, thirdnum, false);
      lc.setDigit(0, 4, fournum, false);
      lc.setDigit(0, 3, fivenum, false);
      lc.setDigit(0, 2, sixnum, false);
      lc.setDigit(0, 1, sevennum, false);
      lc.setDigit(0, 0, eightnum, false);
    }
    else {
      if (countnumber > 999999) {
        //      firstnum = ((countnumber/10000000)%10);
        secondnum = countnumber / 1000000 % 10;
        thirdnum = countnumber / 100000 % 10;
        fournum = countnumber / 10000 % 10;
        fivenum = countnumber / 1000 % 10;
        sixnum = countnumber / 100 % 10;
        sevennum = countnumber / 10 % 10;
        eightnum = countnumber % 10;

        lc.setChar(0, 7, ' ', false);
        lc.setDigit(0, 6, secondnum, false);
        lc.setDigit(0, 5, thirdnum, false);
        lc.setDigit(0, 4, fournum, false);
        lc.setDigit(0, 3, fivenum, false);
        lc.setDigit(0, 2, sixnum, false);
        lc.setDigit(0, 1, sevennum, false);
        lc.setDigit(0, 0, eightnum, false);
      }
      else {
        if (countnumber > 99999) {
          //          firstnum = ((countnumber/10000000)%10);
          //          secondnum = countnumber/1000000%10;
          thirdnum = countnumber / 100000 % 10;
          fournum = countnumber / 10000 % 10;
          fivenum = countnumber / 1000 % 10;
          sixnum = countnumber / 100 % 10;
          sevennum = countnumber / 10 % 10;
          eightnum = countnumber % 10;

          lc.setChar(0, 7, ' ', false);
          lc.setChar(0, 6, ' ', false);
          lc.setDigit(0, 5, thirdnum, false);
          lc.setDigit(0, 4, fournum, false);
          lc.setDigit(0, 3, fivenum, false);
          lc.setDigit(0, 2, sixnum, false);
          lc.setDigit(0, 1, sevennum, false);
          lc.setDigit(0, 0, eightnum, false);
        }
        else {
          if (countnumber > 9999) {
            //             firstnum = ((countnumber/10000000)%10);
            //             secondnum = countnumber/1000000%10;
            //             thirdnum = countnumber/100000%10;
            fournum = countnumber / 10000 % 10;
            fivenum = countnumber / 1000 % 10;
            sixnum = countnumber / 100 % 10;
            sevennum = countnumber / 10 % 10;
            eightnum = countnumber % 10;

            lc.setChar(0, 7, ' ', false);
            lc.setChar(0, 6, ' ', false);
            lc.setChar(0, 5, ' ', false);
            lc.setDigit(0, 4, fournum, false);
            lc.setDigit(0, 3, fivenum, false);
            lc.setDigit(0, 2, sixnum, false);
            lc.setDigit(0, 1, sevennum, false);
            lc.setDigit(0, 0, eightnum, false);
          }
          else {
            if (countnumber > 999) {
              //              firstnum = ((countnumber/10000000)%10);
              //              secondnum = countnumber/1000000%10;
              //              thirdnum = countnumber/100000%10;
              //              fournum = countnumber/10000%10;
              fivenum = countnumber / 1000 % 10;
              sixnum = countnumber / 100 % 10;
              sevennum = countnumber / 10 % 10;
              eightnum = countnumber % 10;

              lc.setChar(0, 7, ' ', false);
              lc.setChar(0, 6, ' ', false);
              lc.setChar(0, 5, ' ', false);
              lc.setChar(0, 4, ' ', false);
              lc.setDigit(0, 3, fivenum, false);
              lc.setDigit(0, 2, sixnum, false);
              lc.setDigit(0, 1, sevennum, false);
              lc.setDigit(0, 0, eightnum, false);
            }
            else {
              //              firstnum = ((countnumber/10000000)%10);
              //              secondnum = countnumber/1000000%10;
              //              thirdnum = countnumber/100000%10;
              //              fournum = countnumber/10000%10;
              //              fivenum = countnumber/1000%10;
              sixnum = countnumber / 100 % 10;
              sevennum = countnumber / 10 % 10;
              eightnum = countnumber % 10;

              lc.setChar(0, 7, ' ', false);
              lc.setChar(0, 6, ' ', false);
              lc.setChar(0, 5, ' ', false);
              lc.setChar(0, 4, ' ', false);
              lc.setChar(0, 3, ' ', false);
              lc.setDigit(0, 2, sixnum, false);
              lc.setDigit(0, 1, sevennum, false);
              lc.setDigit(0, 0, eightnum, false);
            }

          }
        }
      }
    }
  }
}

Domanda: hai messo una resistenza di pulldown?
Hai fatto un lavoro gigantesco e inutile.
Mai sentito parlare di array e di cicli?
Temo che tu abbia un forte debito tecnico
A tuo favore hai una grande determinazione

Standardoil:
Domanda: hai messo una resistenza di pulldown?
Hai fatto un lavoro gigantesco e inutile.
Mai sentito parlare di array e di cicli?
Temo che tu abbia un forte debito tecnico
A tuo favore hai una grande determinazione

Certamente, una resistenza da 10k
Si, ne ho sentito parlare, ma per il momento lo leggo meglio cosi, poi lo riduco :wink:
sono d' accordo su tutte e due le ultime cose :grinning:
Ormai ho abbandonato il progetto di usare quel display, forse, ma quando vedo il modulo del display ed arduino sulla scrivania, è più forte di me, devo finire quella cosa anche se ormai non mi servirà più e poi per il tempo che ho investito e quello che ho fatto perdere a voi.

edstarink:
Si, ne ho sentito parlare, ma per il momento lo leggo meglio cosi, poi lo riduco :wink:

E questo è un errore, se leggi meglio un programma scritto male....
Comunque gira il pulsante, mandalo al meno
Usa input_pullup invece che input
E nega la condizione
Per essere molto chiari (ma molto tanto) ciò che descrivi è impossibile
È evidente che hai commesso un errore.
Essendo il programma corretto, pur se scadente, l'errore può essere solo nel cablaggio...

Lo so, capisco il mio limite purtroppo.
Ho fatto una cosa abominevole e mi vergogno a dirlo :-[ :-[
Comunque adesso funziona, errori dovuti al fatto che ho ripreso Arduino da diversi mesi e alcune cose si dimenticano purtroppo, considerato anche che sono al livello base. Cercherò di tenermi il più aggiornato possibile.
Mancava la resistenza di pull up, l' avevo connessa nel modo sbagliato.
Mi aiuteresti a capire come mettere il codice nel modo più fruibile? lo faccio io, non voglio che me lo fai tu, ti chiedo solo se puoi aiutarmi a capire dove sbaglio.

Sì, volentieri
Stasera da casa

guarda, solo pochi spunti: ti lascio dentro delle domande, utili per imparare
primo , e qui non mi stancherò mai
l'uso di una variabile per contenere lo stato di un pulsante usato una volta sola è un obbrobrio, da emendare assolutamente
fai così:

if(digitalread(buttonpin)){
++contatore
}

interessante sarebbe capire perchè funziona la if
e anche l'uso dell'operatore di autoincremento
metti le parentesi graffa anche quando il branch è di una riga sola
altro spunto:
non mettere nella loop tutto lo amba aradam
tieni nella loop solo i concetti, e demanda il lavoro sporco a delle funzioni che creerai appositamente

loop(){

   if.....

   visualizza(contatore)

}

e tutto il lavoro sposrco te lo fa la visualizza

e sua volta la visualizza

void visualizza(unsigned long int contatore){
   // non creare 8 variabili che usi una sola volta
   // in un ciclo fai una sola volta
   for (byte i=0; i<8;i++){
      lc.setDigit(0, i, contatore%10, false);
      contatore=contatore/10;
      // perchè uso direttamente contatore?
   }
}

ma così non sopprime gli zeri superflui
si tratta di tenere memoria se abbiamo già raggiunto una cifra
e se no, sopprimere lo zero
e qui vedi un po' se ci riesci da solo
sono solo 2 o tre righe in più
alla fine vedrai che il codice finale sarà una manciata di rige e facilissimo da seguire
ah, non ho approfondito, ma forse scrive da destra a sinistra, invece che da sinistra a destra, basta invertire....

Cavolo... :o :o
Scusami ma non ho capito molto.
Allora, per il discorso ingressi, ho riscritto il codice perchè alla pressione del pulsante, invia una volta sola il comando altrimenti se mantengo premuto addiziona in continuo. Ho usato una variabile di appoggio che, quando il pulsante è a livello alto, esegue il codice dentro l' if una sola volta usando una flag che si resetta quando ritorna in condizione LOW. Funziona e questo per me è un risultato anche se i modi per scriverlo sono tanti ma soprattutto, piu corti.

Per la seconda parte del codice che hai scritto, credo di aver capito, ma ho ancora diverse lacune con le funzioni. Perdonami ma non ho mai studiato programmazione e quel poco che so, è stato appreso per realizzare alcuni oggetti, ma ho capito cosa volevi intendere. Tutto quel codice dentro il loop non serve, basta creare alcune funzioni che racchuidono parte del parte del codice.

La terza parte invece è molto chiara, hai fatto un ciclo FOR per effettuare, con una sola operazione, otto istruzioni che io ho creato singolarmente e qua ci siamo.

Nel' insieme ho ancora problemi, forse per te è chiaro, ma io faccio ancora fatica.

edstarink:
Ciao Guglielmo,

I

è come se le operazioni rallentino il codice, ma nello sketch non esistono delay, a parte quello che ho messo io e non capisco perchè non viene visualizzato istantaneamente

Spero di essermi spiegato bene, in caso contrario, ditemi cosa non è chiaro
Grazie

#define Max7219DIN 12  // Pin 7 connected to DIN (DataIN)

#define Max7219CLK 13  // Pin 6 connected to CLK
#define Max7219CS 10   // Pin 5 connected to CS

const int buttonPin = 2;     // the number of the pushbutton pin
#include "LedControl.h"  // LedControl Library created by Eberhard Fahle at Arduino Playground - HomePage

LedControl lc = LedControl(Max7219DIN, Max7219CLK, Max7219CS, 1); // Last number represent the number of Max7219 Modules connected

long int countnumber = 1200 ; // VARIABILE CONTATORE
int buttonState = 0;

// Variables to store individual numbers
int  firstnum = 0;
int  secondnum = 0;
int  thirdnum = 0;
int  fournum = 0;
int  fivenum = 0;
int  sixnum = 0;
int  sevennum = 0;
int  eightnum = 0;

void setup() {
 lc.shutdown(0, false); // Wake up the display
 lc.setIntensity(0, 7); // Set Brightness 0-15
 lc.clearDisplay(0);  // Clear display
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT);

}

void loop() {

buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 countnumber=countnumber+1;
 delay(0);

{

//  Display number on Display depending on number of digits remaining
   if (countnumber > 9999999) {
     firstnum = ((countnumber / 10000000) % 10);
     secondnum = countnumber / 1000000 % 10;
     thirdnum = countnumber / 100000 % 10;
     fournum = countnumber / 10000 % 10;
     fivenum = countnumber / 1000 % 10;
     sixnum = countnumber / 100 % 10;
     sevennum = countnumber / 10 % 10;
     eightnum = countnumber % 10;

lc.setDigit(0, 7, firstnum, false);
     lc.setDigit(0, 6, secondnum, false);
     lc.setDigit(0, 5, thirdnum, false);
     lc.setDigit(0, 4, fournum, false);
     lc.setDigit(0, 3, fivenum, false);
     lc.setDigit(0, 2, sixnum, false);
     lc.setDigit(0, 1, sevennum, false);
     lc.setDigit(0, 0, eightnum, false);
   }
   else {
     if (countnumber > 999999) {
       //      firstnum = ((countnumber/10000000)%10);
       secondnum = countnumber / 1000000 % 10;
       thirdnum = countnumber / 100000 % 10;
       fournum = countnumber / 10000 % 10;
       fivenum = countnumber / 1000 % 10;
       sixnum = countnumber / 100 % 10;
       sevennum = countnumber / 10 % 10;
       eightnum = countnumber % 10;

lc.setChar(0, 7, ' ', false);
       lc.setDigit(0, 6, secondnum, false);
       lc.setDigit(0, 5, thirdnum, false);
       lc.setDigit(0, 4, fournum, false);
       lc.setDigit(0, 3, fivenum, false);
       lc.setDigit(0, 2, sixnum, false);
       lc.setDigit(0, 1, sevennum, false);
       lc.setDigit(0, 0, eightnum, false);
     }
     else {
       if (countnumber > 99999) {
         //          firstnum = ((countnumber/10000000)%10);
         //          secondnum = countnumber/1000000%10;
         thirdnum = countnumber / 100000 % 10;
         fournum = countnumber / 10000 % 10;
         fivenum = countnumber / 1000 % 10;
         sixnum = countnumber / 100 % 10;
         sevennum = countnumber / 10 % 10;
         eightnum = countnumber % 10;

lc.setChar(0, 7, ' ', false);
         lc.setChar(0, 6, ' ', false);
         lc.setDigit(0, 5, thirdnum, false);
         lc.setDigit(0, 4, fournum, false);
         lc.setDigit(0, 3, fivenum, false);
         lc.setDigit(0, 2, sixnum, false);
         lc.setDigit(0, 1, sevennum, false);
         lc.setDigit(0, 0, eightnum, false);
       }
       else {
         if (countnumber > 9999) {
           //             firstnum = ((countnumber/10000000)%10);
           //             secondnum = countnumber/1000000%10;
           //             thirdnum = countnumber/100000%10;
           fournum = countnumber / 10000 % 10;
           fivenum = countnumber / 1000 % 10;
           sixnum = countnumber / 100 % 10;
           sevennum = countnumber / 10 % 10;
           eightnum = countnumber % 10;

lc.setChar(0, 7, ' ', false);
           lc.setChar(0, 6, ' ', false);
           lc.setChar(0, 5, ' ', false);
           lc.setDigit(0, 4, fournum, false);
           lc.setDigit(0, 3, fivenum, false);
           lc.setDigit(0, 2, sixnum, false);
           lc.setDigit(0, 1, sevennum, false);
           lc.setDigit(0, 0, eightnum, false);
         }
         else {
           if (countnumber > 999) {
             //              firstnum = ((countnumber/10000000)%10);
             //              secondnum = countnumber/1000000%10;
             //              thirdnum = countnumber/100000%10;
             //              fournum = countnumber/10000%10;
             fivenum = countnumber / 1000 % 10;
             sixnum = countnumber / 100 % 10;
             sevennum = countnumber / 10 % 10;
             eightnum = countnumber % 10;

lc.setChar(0, 7, ' ', false);
             lc.setChar(0, 6, ' ', false);
             lc.setChar(0, 5, ' ', false);
             lc.setChar(0, 4, ' ', false);
             lc.setDigit(0, 3, fivenum, false);
             lc.setDigit(0, 2, sixnum, false);
             lc.setDigit(0, 1, sevennum, false);
             lc.setDigit(0, 0, eightnum, false);
           }
           else {
             //              firstnum = ((countnumber/10000000)%10);
             //              secondnum = countnumber/1000000%10;
             //              thirdnum = countnumber/100000%10;
             //              fournum = countnumber/10000%10;
             //              fivenum = countnumber/1000%10;
             sixnum = countnumber / 100 % 10;
             sevennum = countnumber / 10 % 10;
             eightnum = countnumber % 10;

lc.setChar(0, 7, ' ', false);
             lc.setChar(0, 6, ' ', false);
             lc.setChar(0, 5, ' ', false);
             lc.setChar(0, 4, ' ', false);
             lc.setChar(0, 3, ' ', false);
             lc.setDigit(0, 2, sixnum, false);
             lc.setDigit(0, 1, sevennum, false);
             lc.setDigit(0, 0, eightnum, false);
           }

}
       }
     }
   }
 }
}

secondo me sei sulla strada giusta :slight_smile:
solo queste poche righe sono da modificare

buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
countnumber=countnumber+1;
delay(0);

più che modificare non le devi mai più usare,
poi che significa
delay(0); :o
ricordarsi sempre che anche un "chip" come arduino ha una velocità enorme rispetto a movimenti della mano che preme un pulsante.

di solito premere una volta un pulsante significa interrompere e chiudere il contatto decine di volte,
e il micro le "nota tutte" :confused:

un sistema che non costa nulla e appena il micro rileva
if (buttonState == HIGH) porta un flag o "qualcosa" a 1
poi un
delay (300); ci sta tutto per dare il tempo di togliere la mano dal pulsante

poi

if (flag o "qualcosa" == 1) countnumber=countnumber+1, flag o "qualcosa" = 0 ;

da provare al volo al posto di quelle righe;

int k =0; va aggiunto nel setup o prima

if (buttonState) delay (300), k=1;
if (k == 1) countnumber=countnumber+1, k = 0 ;

Ciao, conosco molto bene gli anti rimbalzo, li studiai su nuova elettronica tanti anni fa quando giocai con il 4017. Ho già fatto le istruzioni per inviare un solo impulso quando sono a livello alto, utilizzando una flag e un delay, quello che hai visto nel codice, era un' esempio, il delay "0" era una dimenticanza.
Grazie comunque

edstarink:
Ciao, conosco molto bene gli anti rimbalzo, li studiai su nuova elettronica tanti anni fa quando giocai con il 4017. Ho già fatto le istruzioni per inviare un solo impulso quando sono a livello alto, utilizzando una flag e un delay, quello che hai visto nel codice, era un' esempio, il delay "0" era una dimenticanza.
Grazie comunque

ok ma almeno la parte "incremento" hai risolto?

ok ma almeno la parte "incremento" hai risolto?

Si, il codice adesso è perfetto, ogni ingresso, se portato a livello alto, incrementa del valore assegnato senza doppi conteggi o altro, è solo che il codice è scritto male e deve essere accorciato, tutto qua :smiley:
Ci sto provando ad accorciarlo.