[Risolto] Problema : incremento/decremento variabile globale tramite pulsanti

Problema apparentemente semplice, ma mi sto perdendo in un bicchiere d’acqua:
Ho due pulsanti sulla breadboard, e una variabile globale nello sketch, in base al pulsante che premo la variabile deve incrementarsi/decrementarsi di 1…
NOTA: nello sketch ho messo che il valore della variabile non deve essere inferiore a 0, e maggiore di 3…

PROBLEMA: Guardando i valori che vengono stampati sulla seriale noto che se premo il pulsante che aumenta la variabile , lui funziona, ma non mi caga quell’altro del decremento…

Vi metto lo sketch:

const int BUTTON_FORZA = 2;
const int BUTTON_FOR = 7;


int val;
int VALUE;
int forza = 0;



int forza_su(int f) {
    f=f+1;
    Serial.println(f);
    return f;
      }

int forza_giu(int f) {
    f=f-1;
    Serial.println(f);
    return f;
     }
     
 
void setup() {  
  
pinMode(BUTTON_FORZA, INPUT);    
pinMode(BUTTON_FOR, INPUT);


Serial.begin(9600); 

}  
  
void loop() {
  
VALUE=digitalRead(BUTTON_FORZA);
val=digitalRead(BUTTON_FOR);

if(VALUE==HIGH && forza<'3') {
forza=forza_su(forza);
delay(500);
}
if(val==HIGH &&  forza>'0'){
forza=forza_giu(forza);
delay(500);
}
}

Il controllo di superamento valore consentito scrivilo in ogni funzione, poi se chiami più volte una funzione non importa in quanto il valore limite verra gestito dalla funzione chiamata che esegue anche il decremento/incremento.

Visto che “forza” è globale perchè non scrivere direttamente:

const int8_t CmaxForza = 4;  
const int8_t CminForza = 0;  

int8_t incrementaForza()
{
      if (forza < CmaxForza)
            forza++;
      else
            return -1;
     
      return 0;
}

int8_t decrementaForza()
{
     if (forza > CminForza)
         forza--;
     else
            return -1;
     
     return 0;
}

Ciao.

Per quale motivo hai messo gli apici?
Hai scritto:

if(VALUE==HIGH && forza<'3')

invece di:

if(VALUE==HIGH && forza<3)

la stessa cosa quando fai il confronto con 0 più in basso nel codice

paulus1969:
Per quale motivo hai messo gli apici?
Hai scritto:

if(VALUE==HIGH && forza<'3')

invece di:

if(VALUE==HIGH && forza<3)

la stessa cosa quando fai il confronto con 0 più in basso nel codice

Ecco appunto perché ?

@paulus1969
Non mi sono accorto dell’errore che ha commesso perchè mi ha colpito la logica che considero errata.

Ciao.

Ok, adesso provo a correggere lo sketch con le vostre dritte; poi vi aggiorno! intanto vi ringrazio…

Allora, ho aggiornato lo sketch, ma purtroppo il monitor seriale mi stampa cose senza senso:
SKETCH:

const int8_t CmaxForza = 3;  
const int8_t CminForza = 0;  
int forza=0;

const int B_INC = 3;
const int B_DEC = 2;

int inc,dec;

int8_t incrementaForza()
{
  delay(200);
      if (forza < CmaxForza){
            forza++;
            }
      else
            return -1;
     
      return 0;
}

int8_t decrementaForza()
{ delay(200);
     if (forza > CminForza){
         forza--;
         }
     else
            return -1;
     
     return 0;
}



void setup(){
  
pinMode(B_INC,INPUT);
pinMode(B_DEC,INPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);

}

void loop(){

  inc=digitalRead(B_INC);
  delay(20);
  dec=digitalRead(B_DEC);
  delay(20);
  
  if(inc){
        incrementaForza(); 
        Serial.println(forza);
  }   
 
  else if(dec){
    decrementaForza();
    Serial.println(forza);
    
 }
 
 }

HO ALLEGATO l’immagine del monitor seriale

Immagine.png

Forse ho capito dove sbaglio ; sulla bredboard ho semplicemente due pulsanti collegati all'arduino e all'alimentazione; il problema è che la massa di ogni pulsante l'ho collegata ad UNA sola resistenza da 10K , quindi è probabile che nella digitalRead() ogni tanto venga sbagliata la lettura dello stato logico dei pulsanti.. Dopo provo a mettere una resistenza PER OGNI pulsante, e vedo se cambia qualcosa

Come immaginavo: ho messo una resistenza per ogni pulsante ( 20K ) , e adesso funziona correttamente!