Go Down

Topic: Contapezzi con display 7 segment (Read 2343 times) previous topic - next topic

Datman

#45
Apr 21, 2019, 06:19 pm Last Edit: Apr 21, 2019, 06:20 pm by Datman
Perché non usi solo l'ATmega328p? Io ho fatto un timer per la magnetoterapia di Nuova Elettronica con solo quello e due display:

Code: [Select]
  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
*/
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

Code: [Select]
// 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;
}
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

Code: [Select]
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;
  }
}
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

#48
Apr 21, 2019, 06:26 pm Last Edit: Apr 21, 2019, 06:29 pm by Datman
L'essenziale che ti serve è questo:
Code: [Select]
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;
  }
}
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

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 ..

Datman

#50
Apr 23, 2019, 11:22 am Last Edit: Apr 23, 2019, 11:25 am by Datman
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);
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

#51
Apr 23, 2019, 12:23 pm Last Edit: Apr 24, 2019, 02:14 am by Datman
Code: [Select]
//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);}
}
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Flavi71

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

Fury_man

#53
Apr 26, 2019, 05:04 pm Last Edit: Apr 26, 2019, 05:06 pm by Fury_man
Grazie mille Datman appena posso lo provo e ti faccio sapere :) 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 :)

Fury_man

#54
May 05, 2019, 10:19 am Last Edit: May 05, 2019, 10:59 am by Fury_man
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
 
Code: [Select]

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

Datman

Nel setup poni la variabile=250.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Fury_man

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?

Fury_man


Datman

#58
May 17, 2019, 09:47 am Last Edit: May 20, 2019, 09:35 am by Datman
Ciao
Sono stato un po' indaffarato.

Semplicemente, devi fargli visualizzare 250 o, genericamente, il valore di contatore in lc.setDigit. :-)

Code: [Select]
lc.setDigit(0,2,2,false);
lc.setDigit(0,1,5,false);
lc.setDigit(0,0,0,false);

oppure, genericamente:

lc.setDigit(0,2,contatore/100,false);
lc.setDigit(0,1,(contatore/10)%10,false);
lc.setDigit(0,0,contatore-10*int(contatore/10),false);


Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Fury_man

Ciao Datman ho provato il circuito e il tutto funziona benissimo, vorrei sostituire il pulsante con un sensore ir dove l'emettitore ir led è sempre attivo mentre il ricevitore ir è collegato al piedino del vecchio interruttore, facendo cio' ho notato che non funziona la mia domanda è devo aggiungere qualche stringa nel codice facendogli leggere l'irled come un semplice pulsante? questo è il codice, ti ringrazio mille!
Code: [Select]

 //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 = 250;   // 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);
  lc.setDigit(0,2,2,false);
  lc.setDigit(0,1,5,false);
  lc.setDigit(0,0,0,false);
 

  // 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(30);
 
  // 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 = 250);
       lc.clearDisplay(0);
       lc.setDigit(0,2,2,false);
       lc.setDigit(0,1,5,false);
       lc.setDigit(0,0,0,false);
    }
}

[code]

Go Up