Contapezzi con display 7 segment

Ahm no, non ho messo la resistenza tra iset e positivo.. di quanto gliela devo mettere? E a cosa serve la
Resistenza su quel pin?

Fury_man:
comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12.

scusa ma ho fatto talmente tante prove/modifiche a quel circuito che non ricordo più quale è quello definitivo ::slight_smile: domani controllo poi ti dico.

Flaviano

Fammi sapere perché davvero non so come farlo funzionare :confused:

Fury_man:
Questo è il circuito, scusate per il disegno pessimo, comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12. Non riesco proprio a capire dove sbaglio... ah i pulsanti non li ho disegnati ma sono stati collegati al piedino D2 e D3.

devi usare moduli già assemblati se cerchi di far funzionare i max 7219 con fili volanti il più delle volte non funzionano :confused: anche se tutto sembra collegato correttamente

uso quei moduli con i led inseriti (non saldati) e se voglio mettere moduli led più grandi o di colore diverso è fattibile,

Ciao Elrospo avevo gia pensato di acquistare un modulo come hai detto tu, solo che a me servirebbe pilotare solo 1 display a 3cifre e per il progetto che vorrei fare sono molto ristretto con gli spazi

Fury_man:
Fammi sapere perché davvero non so come farlo funzionare :confused:

Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2 (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK = D9
LOAD-CS = D10
DIN = D12

Con questo codice DEVE funzionare:

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn 
 pin 9 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


void setup(){
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
  
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
      
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
     
    // Delay a little bit to avoid bouncing
    delay(50);
  
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
}

Fammi sapere.
Flaviano

Flavi71:
Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2 (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK = D9
LOAD-CS = D10
DIN = D12

Con questo codice DEVE funzionare:

 //State change detection (edge detection)

//We always have to include the library
#include "LedControl.h"

/*
Now we need a LedControl to work with.
pin 12 is connected to the DataIn
pin 9 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:

  • buttonpin attached to pin 2 from +5V
  • buttonreset attached to pin 4 from +5V
  • 10 kilohm resistor attached to pin 2&4 from ground
    */
    // this constant won't change:
    #define buttonPin 2 // the pin that the pushbutton is attached to
    #define buttonReset 4 // the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;  // counter for the number of button presses
int buttonState = 0;        // current state of the button
int lastButtonState = 0;    // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;

void setup(){
  /*
  The MAX72XX is in power-saving mode on startup,
  we have to do a wakeup call
  /
  lc.shutdown(0,false);
  /
Set the brightness to a medium values /
  lc.setIntensity(0,8);
  /
and clear the display */
  lc.clearDisplay(0);

// initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
   
    // Delay a little bit to avoid bouncing
    delay(50);
 
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

// if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
      lc.clearDisplay(0);
    }
}



Fammi sapere.
Flaviano

Ciao Flavi71 scusami per il ritardo, allora ho aggiunto una resistenza al pin ISET del max7219 ogni volta che premo il pulsante comincia a contare solo che lo stato iniziale del display è spento come premo si accende.. come faccio a farlo stare acceso al primo stato? ho notato anche che conta dall'ultima cifra.. mi spiego meglio: invece di contare 001, 002.. mi conta 100,200 e cosi via come risolvo?
GRAZIE per il tempo che mi stai dando :slight_smile:
Fammi sapere
FuryMan

Risolto per quanto riguarda il conteggio sfalsato ho invertito i pin del dig1 e del dig3 cosi' parte dal primo a contare.. non riesco a risolvere il problema del display spento all'inizio :confused:

Perché non usi solo l'ATmega328p? Io ho fatto un timer per la magnetoterapia di Nuova Elettronica con solo quello e due display:

  ATMEGA 328P - 1MHz
        Pin
I/O0  PD0  2: KA
I/O1  PD1  3: KB
I/O2  PD2  4: KC
I/O3  PD3  5: KD
I/O4  PD4  6: KE
I/O5  PD5 11: KF
I/O6  PD6 12: KG
I/O7  PD7 13: Kdp 
I/O8  PB0 14: Uscita fCk.
I/O9  PB1 15: Anodo comune: *Alto(diretto):A2*; Basso(via PNP):A1
I/O10 PB2 16: Anodo comune: *Alto(diretto):A1*; Basso(via PNP):A2
I/O11 PB3 17: MOSI -
I/O12 PB4 18: MISO -
I/O13 PB5 19:  SCK -
XTAL1 PB6  9: ---
XTAL2 PB7 10: ---
A0  PC0 23: Potenziometro per l'impostazione del tempo.
A1  PC1 24: BUZZER PASSIVO
A2  PC2 25: OUT al transistor NPN pilota del relè.
A3  PC3 26:
A4  PC4 27:
A5  PC5 28: 
         1: Reset
     7, 20: Vcc
     8, 22: GND
        21: ARef
*/
// Il tempo parte all'accensione (avvio=0) o dopo l'impostazione della durata (avvio=1)?
#define avvio 1

#include <EEPROM.h>
unsigned int durata;
unsigned int durata0;
byte DS1; // Dip Switch 1: può valere 0 o 1.
byte DS2; // Dip Switch 2: può valere 0 o 1.
byte adesso; // millis() in minuti
byte minRimanenti=0;
byte minRimanentiP=250; // Valore precedente di minRimanenti.
byte z=0;
byte n=0;
byte d=0; // decine di minuti
byte u=0; // unità di minuti
byte dpon=0; // 1: dp acceso (pin basso per anodo comune).
unsigned long millis0=0; // Valore di millis()per il conteggio del tempo dall'impostazione della durata.
unsigned long t=0; // Valore di millis() per il tempo a disposizione per l'impostazione della durata.
unsigned long t1=0; // Valore di millis() per il rilevamento della richiesta di pausa.
byte b=0; // Contatore dei Bip di avviso della pausa.
byte c=0; // Contatore dei Bip di avviso dello spegnimento anticipato.
unsigned long t2=0; // Valore di millis() per il rilevamento della richiesta di spegnimento.
byte potAZero=0;
byte potA60=0;
byte endSetup=0;

void displ();
void mpx();

void setup()
{
// durata=600000*(((PINB&((1<<PB4)|(1<<PB3)))>>3)+1); // Con dip switch verso +V.
// Legge i due dip switch su PB4 (peso 16) e PB3 (peso 8) e divide per 8, ottenendo valori tra 0 e 3;
// somma 1, ottenendo valori tra 1 e 4, poi moltiplica per 10, ottenendo 10...40 minuti.
// Moltiplicando per 60.000 ottiene i millisecondi.
pinMode(0,OUTPUT); // KA
pinMode(1,OUTPUT); // KB
pinMode(2,OUTPUT); // KC
pinMode(3,OUTPUT); // KD
pinMode(4,OUTPUT); // KE
pinMode(5,OUTPUT); // KF
pinMode(6,OUTPUT); // KG
pinMode(7,OUTPUT); // Kdp
pinMode(8,OUTPUT); // fCk out (abilitata con AVR Burn-O-Mat).
pinMode(9,OUTPUT);  // Anodo comune: Basso:A1; Alto:A2.
pinMode(10,OUTPUT); // Anodo comune: Basso:A2; Alto:A1.
pinMode(A0,INPUT);  // Potenziometro per l'impostazione del tempo.
pinMode(A1,OUTPUT); // Buzzer
pinMode(A2,OUTPUT); // OUT
// pinMode(A3,OUTPUT); // Periodo 2000ms (non serve più, perché ho attivato l'uscita fCk sull'8).

digitalWrite(A2, HIGH); // Eccita il relè.


OSCCAL=161; // Era 162 e la frequenza di clock era 1,004MHz;
            // Con 161, la frequenza di clock è circa 998,5kHz.
/*
Serial.begin(9600);
Serial.print("OSCCAL=");
Serial.print(OSCCAL,DEC);
Serial.end();
*/

delay(100);
t=millis();
millis0=millis();

if(EEPROM.read(0)==255) // Se c'è scritto 255, vuol dire che non è stata mai scritta oppure è stata 
  {                     // "azzerata" a 255, perciò prosegue con l'impostazione della durata.
  while(millis()-t<4000)
    {
    analogRead(A0); durata=1+analogRead(A0)/17.2;
    d = int(durata/10); // DECINE DI MINUTI
    u = durata%10;      // UNITA' DI MINUTI
    mpx(); // Visualizza d e u.
    if(durata!=durata0) {durata0=durata; t=millis();}
    }
  tone(A1,880,60); // E' finito il tempo per l'impostazione della durata.
  }
else // Se non c'è scritto 255, significa che l'apparecchio è stato messo in pausa e il valore rappresenta i minuti residui.
  {
  durata=EEPROM.read(0);
  EEPROM.update(0,255); // "Azzera" il contenuto della cella a 255.
  d = int(durata/10); // DECINE DI MINUTI
  u = durata%10;      // UNITA' DI MINUTI
  tone(A1,880,200); // Poiché ha caricato il tempo residuo in memoria, emette 3 toni: LA4-LA5-LA4.
  delay(250);
  tone(A1,440,200);
  delay(250);
  tone(A1,880,250);
  mpx(); // Visualizza d e u.
  }
  
if(analogRead(A0)<15) potAZero=1;
if(analogRead(A0)>1010) potA60=1;
 
#if avvio==1           // Se avvio=1, 
  millis0=millis();    // la durata parte dopo l'impostazione della durata,
#endif                 // altrimenti millis0 vale già 0 e la durata parte dall'accensione.
  endSetup=1;
}
void loop()
{
adesso=int((millis()-millis0)/60000);

// Calcola e visualizza i minuti rimanenti (a ogni passaggio commuta Display 1 / Display 2):
minRimanenti=durata-adesso;
d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.
if(analogRead(A0)>15) potAZero=0;
if(analogRead(A0)<1010) potA60=0;
   
  // Controlla se il tempo è scaduto:
if(adesso>=durata)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  PORTD=0b00001110;     // Stop:  Visualizza " F."
  digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
  while(1==1);
  }

  // RICHIESTA DI PAUSA?
if(potAZero==0) // Se il potenziometro non sta a 0 dall'accensione
  {
  if(analogRead(A0)>15) t1=millis(); // Se il potenziometro non è al minimo, aggiorna costantemente t1.
  else                               // Se viene messo al massimo, non aggiorna più t1.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
    PORTD=0b00001100;     // Visualizza " P."
    while(analogRead(A0)<=15 && millis()-t1<3200)
      {
      if(b==0) {tone(A1,1760,100); b=1;} // Se il potenziometro sta al minimo e b è ancora 1, fa un primo Bip e incrementa b a 1.
      if(b==1 && (millis()-t1)>=1000) {tone(A1,1760,100); b=2;} // Dopo 1 secondo fa un altro Bip e incrementa b.
      if(b==2 && (millis()-t1)>=2000) {tone(A1,1760,100); b=3;} // Dopo 1 secondo fa un altro Bip e incrementa b.  
      if(millis()-t1>3000) // Se per 3 secondi il potenziometro sta al minimo, va in pausa.
        {
        EEPROM.update(0,minRimanenti);  // Salva il tempo residuo.
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    b=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera b.  
    }
  }

  // RICHIESTA DI SPEGNIMENTO?
if(potA60==0) // Se il potenziometro non sta a 60 dall'accensione
  {
  if(analogRead(A0)<1010) t2=millis(); // Se il potenziometro non è al massimo, aggiorna costantemente t2.
  else                                 // Se viene messo al massimo, non aggiorna più t2.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
 // PORTD=0b00001001;     // Visualizza " H."
    PORTD=0b00010010;     // Visualizza " S."
    while(analogRead(A0)>=1010 && millis()-t2<3200)
      {
      if(c==0) {tone(A1,880,100); c=1;} // Se il potenziometro sta al massimo e c è ancora 1, fa un primo Bip e incrementa c a 1.
      if(c==1 && (millis()-t2)>=1000) {tone(A1,880,100); c=2;} // Dopo 1 secondo fa un altro Bip e incrementa c.
      if(c==2 && (millis()-t2)>=2000) {tone(A1,880,100); c=3;} // Dopo 1 secondo fa un altro Bip e incrementa c.    
      if(millis()-t2>3000) // Se per 3 secondi il potenziometro sta al massimo, spegne tutto.
        {
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    c=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera c.  
    }  
  } 
  
} // END loop

// --------------------------------------------------

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}

void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}

L'essenziale che ti serve è questo:

d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.

// Tu, invece, calcolerai centinaia, decine e unità. Nel multiplexer, poi, userai per z i valori 1, 2 e 3, scrivendo alla fine, al posto di z=1-z:
z+=1; if(z==4) z=1;

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}


void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}

Grazie Datman sembra molto interessante ma vorrei portare a termine un progetto alla volta, aspetto la risposta di Flavi71 per quanto riguarda il display spento all’inizio e non capisco come mai ..

E' semplice: nel setup() viene eseguito:
lc.clearDisplay(0);
perciò il display rimane senza alcuna scritta. Se preferisci, subito dopo il clear fagli scrivere "0". Probabilmente devi scrivere così:
lc.setDigit(0,0,0,false);

//State change detection (edge detection)
//Libreria per il controllo del display:
#include "LedControl.h"

/*
Connessioni:
I/O 12: DataIn
I/O  9: CLK
I/O 10: LOAD
*/

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

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/

// Costanti (valori che non cambieranno):
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variabili:
int contatore = 0;       // Contatore delle pressioni del tasto
int buttonState = 0;     // Stato del pulsante
int lastButtonState = 0; // Stato precedente del pulsante
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;

void setup()
{
// The MAX72XX is in power-saving mode on startup: we have to do a wakeup call
lc.shutdown(0,false); 

// Imposta la luminosità a un valore medio, cancella il display e visualizza 0:
lc.setIntensity(0,8);
lc.clearDisplay(0); lc.setDigit(0,0,0,false);

// Impostazione degli ingressi (in realtà all'accensione gli I/O vengono impostati
// come ingressi, perciò è necessario impostare solo le uscite, ma può essere utile lasciarlo scritto):
pinMode(buttonPin, INPUT);
pinMode(buttonReset, INPUT);
}

void loop()
{
// Legge il pulsante:
buttonState=digitalRead(buttonPin);

// Se prima era basso e adesso è alto, incrementa il contatore e visualizza sul display:
if(lastButtonState==LOW && buttonState==HIGH) 
  {    
  contatore++;
  tmp=contatore; unita=tmp%10;
  tmp=tmp/10;    decine=tmp%10;
                 centinaia=tmp/10;

  lc.setDigit(0,2,(byte)centinaia,false);
  lc.setDigit(0,1,(byte)decine,false);
  lc.setDigit(0,0,(byte)unita,false);
  delay(50); // Delay a little bit to avoid bouncing
  lastButtonState = buttonState; // save the current state as the last state, for next time through the loop
  }

if(digitalRead(buttonReset)==HIGH) // E' stato premuto il reset?
  {contatore=0; lc.clearDisplay(0); lc.setDigit(0,0,0,false);}
}

Fury_man:
Grazie Datman sembra molto interessante ma vorrei portare a termine un progetto alla volta, aspetto la risposta di Flavi71 per quanto riguarda il display spento all’inizio e non capisco come mai ..

Anche a me resta spento all' inizio, e a dir la verità non ci avevo fatto molto caso, perchè per me non è un problema, basta che si accenda quando inizio a contare. Comunque prova a fare come ti ha detto Datman, dovrebbe funzionare...io non ho provato.

Flaviano

Grazie mille Datman appena posso lo provo e ti faccio sapere :slight_smile: grazie anche a te Flaviano, il mio sarebbe un progetto per il Softair (un gioco con delle repliche di armi chiamate AirSoftGun, nettamente diverso dal conosciutissimo Paintball) precisamente un contatore di pallini (BB) infatti al posto del pulsante andrò a posizionare un sensore tipo fotocellula composta da un emettitore IR e un ricevitore e spero che il Codice non vari perché a livello di programmazione sono negato ed è stato grazie a voi che ho potuto cominciare e portare quasi a termine il progetto :slight_smile:

Ho provato il Circuito di Datman il contatore da fermo mi da 0 poi incrementa solo di 1 e non si incrementa più, ho inserito la stringa lc.setDigit(0,0,0,false); nel vecchio sketch ed effettivamente parte da 0 e poi conta regolarmente.. una domanda se volessi far partire il conteggio da 250 e decrementando basta che scrivo contatore=250 e poi contatore -- ? perché vorrei sostituire il pulsante con un photoresistor e un irled in modo tale che quando il fascio viene interrotto lui mi decrementi di un unità alla volta. ho inserito altre due stringhe di codice per far comparire 000 all'inizio

void setup(){
    lc.shutdown(0,false);
    lc.setIntensity(0,8);
    lc.clearDisplay(0);

    lc.setDigit(0,0,0,false); //
    lc.setDigit(0,1,0,false); // Ho inserito 3 stringhe per far comparire 000 
    lc.setDigit(0,2,0,false); //
  

  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
  
}

come faccio fer farlo partire da 250 a video al posto di 000?
vi ringrazio infinitamente per l'aiuto che mi state dando, aspetto vostre risposte.

FuryMan

Nel setup poni la variabile=250.

Ciao Datman ho posto int contatore=250 ma mi da sempre come valore 000 poi quando premo il pulsante mi passa a 251 direttamente, come faccio a porla nel setup questa variabile?