problema progetto contatore

Salve a tutti ... stavo lavorando a un piccolo progetto che serve a "contare " le cose... il progetto consiste in quattro pulsanti che aumentano il numero da visualizzare di 1,10,100 o 1000 in base al pulsante premuto. Il problema è che quando ho messo un tasto che se premuto insieme a uno dei primi quattro per decrementare il numero in base al valore che aggiungeva il tasto è come se nn succede nnt .. ovvero il numero nn decrementa.. un piccolo aiuto ??

qui riporto il codice .. :

long numero=0;

void setup (){
  Serial.begin(9600);
  pinMode (14,INPUT);
   pinMode (15,INPUT);
    pinMode (16,INPUT);
     pinMode (17,INPUT);
      
      pinMode (18,INPUT);
}
void loop (){
  int bott_m=digitalRead(14);
   int bott_c=digitalRead(15);
    int bott_d=digitalRead(16);
     int bott_u=digitalRead(17);
     
      int bott_s=digitalRead(18);
  
  if(bott_u==LOW){
    numero=numero+1;
  } 
  if(bott_d==LOW){
    numero=numero+10;
  } 
  if(bott_c==LOW){
    numero=numero+100;
  } 
  if(bott_m==LOW){
    numero=numero+1000;
  } 
  
  
  if(bott_u==LOW and bott_s==LOW){
    numero=numero-1;
  } 
  if(bott_d==LOW and bott_s==LOW){
    numero=numero-10;
  } 
  if(bott_c==LOW and bott_s==LOW){
    numero=numero-100;
  } 
  if(bott_m==LOW and bott_s==LOW){
    numero=numero-1000;
  } 
  
  Serial.println (numero);
 delay (100);  
}

Grazie in anticipo :smiley:

Immagino che abbia collegato il pulsante ai pin e a GND visto che il controllo è su LOW. In quel caso ti manca la pull'up.

Vedi così:

long numero=0;
byte bott_m;
byte bott_c;
byte bott_d;
byte bott_u;
byte bott_s;

void setup (){
  Serial.begin(9600);
  pinMode (14,INPUT_PULLUP);
  pinMode (15,INPUT_PULLUP);
  pinMode (16,INPUT_PULLUP);
  pinMode (17,INPUT_PULLUP);
  pinMode (18,INPUT_PULLUP);
}

void loop (){
  readButton();
  if(bott_u==LOW) numero = incdec (numero, 1);
  if(bott_d==LOW) numero = incdec (numero, 10);
  if(bott_c==LOW) numero = incdec (numero, 100);
  if(bott_m==LOW) numero = incdec (numero, 1000);

  while (bott_s==LOW){
    readButton();
    if(bott_u==LOW) numero = incdec (numero, -1);
    if(bott_d==LOW) numero = incdec (numero, -10);
    if(bott_c==LOW) numero = incdec (numero, -100);
    if(bott_m==LOW) numero = incdec (numero, -1000);
  } 

} // End Loop

void readButton (void) {
  bott_m = digitalRead(14);
  bott_c = digitalRead(15);
  bott_d = digitalRead(16);
  bott_u = digitalRead(17);
  bott_s = digitalRead(18);
  delay(15);
}

long incdec (long num, long add){
  num += add;
  Serial.println (num);
  return num;
}

Legge i pulsanti e incrementa se ne hai premuto qualcuno.
Se è premuto la S allora entra nel while dove continua a leggere i pulsante e decrementa.
Se rilasci S allora esce dal while e ricomincia.

Prova a sostituire and con & nel tuo sketch

long numero=0;

void setup (){
  Serial.begin(9600);
  pinMode (14,INPUT);
   pinMode (15,INPUT);
    pinMode (16,INPUT);
     pinMode (17,INPUT);
      
      pinMode (18,INPUT);
}
void loop (){
  int bott_m=digitalRead(14);
   int bott_c=digitalRead(15);
    int bott_d=digitalRead(16);
     int bott_u=digitalRead(17);
     
      int bott_s=digitalRead(18);
  
  if(bott_u==LOW){
    numero=numero+1;
  } 
  if(bott_d==LOW){
    numero=numero+10;
  } 
  if(bott_c==LOW){
    numero=numero+100;
  } 
  if(bott_m==LOW){
    numero=numero+1000;
  } 
  
  
  if(bott_u==LOW & bott_s==LOW){
    numero=numero-1;
  } 
  if(bott_d==LOW & bott_s==LOW){
    numero=numero-10;
  } 
  if(bott_c==LOW & bott_s==LOW){
    numero=numero-100;
  } 
  if(bott_m==LOW & bott_s==LOW){
    numero=numero-1000;
  } 
  
  Serial.println (numero);
 delay (100);  
}

oibboz:
Prova a sostituire and con & nel tuo sketch

Non serve a niente.
Il singolo & si usa per le operazioni a singolo bit.
Lui aveva un problema di logica dello sketch e, forse, un problema nella parte hardware dovuta alla non attivazione delle pull'up interne.
Se vuoi approfondire il bitwise leggi qui:

Grazie PaoloP .. ora funziona ;D