Incremento e decremento sul display sette segmenti.

Salve a tutti
Mi sono cimentato nella realizzazione di un display ,al momento uno, a sette segmenti.
il mio scopo è quello tramite due pulsantini di incrementare e decrementare il numero sul display tipo come fà il volume dello stereo.
Ad incrementare non ho problemi..... premendo il bottone in successione ho i numeri da 0 a 9 facendo un contatore sulla pressione del pulsantino.
Il problema si pone quando collego il secondo pulsantino per far decrescere il contatore da 9 a0.... non so dove sbaglio!!

Posto il codice se gentilemnte qualche anima pia mi può dare una dritta e farmi un pò di luce in questa selva oscura ne sarei grato :frowning:

Ah.. dimenticavo il display a 7 segmenti l' ho collegato con i 7 ingressi digitali non ho usato il multiplexer... e nel codice il decremento l' ho fatto solo da 9 a 8 per vedere se funzionama ma mi esce subito il nove non incrementando nemmeno all' inizio!!

#define BUTTON 11   
#define BATTON 12  
// Variabili  
int ContatorePulsantePremuto = 0;                      
int StatoPulsante = 0;                                
int StatoPulsantePrecedente = 0;                     

int ContatorePulsantePremuto2 = 0;                      
int StatoPulsante2 = 0;                                
int StatoPulsantePrecedente2 = 0;                     

int G=2;
int F=3;
int A=4;
int B=5;
int DP=6;
int C=7;
int D=8;
int E=9;
int led=10;  

void setup() {  
  
  pinMode(BUTTON, INPUT);
  pinMode (BATTON,INPUT);  

  Serial.begin(9600);
 pinMode(G, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(DP, OUTPUT);
      
}  


  
void loop() {  
  StatoPulsante = digitalRead(BUTTON);               
  
  if (StatoPulsante != StatoPulsantePrecedente) {   
                                                       
      ContatorePulsantePremuto++; 
     if (ContatorePulsantePremuto == 1) { 
  digitalWrite(G, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, HIGH);
}
      
      if (ContatorePulsantePremuto == 2) {                   
   digitalWrite(G, LOW);
  digitalWrite(F, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);                                
      } 
       if (ContatorePulsantePremuto == 3) {                     
       digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(DP, LOW); 
     
      }   
      if (ContatorePulsantePremuto == 4) {                     
  digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW); 
      }   
      if (ContatorePulsantePremuto == 5) {                     
        digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
      }  
   
  if (ContatorePulsantePremuto == 6) {   
 
 digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}
 

if (ContatorePulsantePremuto == 7) {   
 
digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}



if (ContatorePulsantePremuto == 8) {  
 digitalWrite(G, LOW);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}
if (ContatorePulsantePremuto == 9) {  
digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}

 if (ContatorePulsantePremuto == 10) {  
 digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A,HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}
 
}   
StatoPulsante2 = digitalRead(BATTON);                
  
  if (StatoPulsante2 != StatoPulsantePrecedente2) {     
    if (StatoPulsante2 == HIGH) {                    
                                                    
      ContatorePulsantePremuto2--; 
     if (ContatorePulsantePremuto2 == 1) { 
  
  
   digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}
  
 
   
}  
}
}

Il contatore dev'essere sempre lo stesso, cioè ContatorePulsantePremuto.
Se premi BUTTON lo incrementi (ContatorePulsantePremuto++), se premi BATTON (sicuro???) lo decrementi (ContatorePulsantePremuto--).

E poi, al posto di tutti quei if, usa lo Switch Case: http://arduino.cc/en/Reference/SwitchCase

switch (ContatorePulsantePremuto) {
  case 1:
      digitalWrite(G, LOW);
      digitalWrite(F, HIGH);
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(D, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(DP, HIGH);
      break;
  case 2:
    // tutti i tuoi output
    break;
  case 3: 
    // tutti i tuoi output
    break;
}

BATTON è il secondo pulsante che deve decrementare... ho creato un contatore per il decremento batton, e uno per l' inremento button ma niente..... =(
proverò con il tuo codice... quindi devo mettere sempre lo stesso contatore e rifare il loop con loswitch case???

e stato pulsante2 ?? w statopulsanteprecedente2?? li devo eliminare o li lascio??
proverò e ti farò sapere :relaxed:
grazie

Devi utilizzare un solo contatore! Non due !!
Se premi BUTTON fai contatore++, se premi BATTON fai contatore--

Lo switch case lo usi perchè più comodo e più facile lettura.
Vanno bene anche i 10 if che hai fatto tu.

Ps.

Brado:
BATTON (sicuro???)

Mi fa pensare ad altro, più che ad una variabile ... :stuck_out_tongue:

grazie mi stai dando una grossa mano ma non ci riesco....
potresti farmi un esempio sul mio codice??

Intanto cambia il tuo codice perché diventa problematico metterci le mani.
L'accensione dei segmenti deputala ad una funzione che richiamerai passando come parametro il numero da visualizzare.
In questo modo, puoi fare incremento e decremento in modo molto più semplice.

Esempio:

void loop() {
  if (digitalRead(PULSANTE_INC)) {
    contatore++;
    if (contatore > 9) { //riparti da zero
      contatore = 0;
    }
  }
  if (digitalRead(PULSANDE_DEC)) {
    contatore--;
    if (contatore < 0) { //torni a nove
      contatore = 9;
    }
  }
  visualizzaNumero(contatore);
}

void visualizzaNumero(int contatore) {
  //tutti gli if per l'accensione dei singoli display
  //volendo potresti anche sostituirlo con un unico switch..case
}

PS:
è un codice di base, non ho tenuto conto del debounce dei pulsanti

PS2:
vedo che il suggerimento dello switch..case ti è già stato dato