Go Down

Topic: [Risolto] Problema : incremento/decremento variabile globale tramite pulsanti (Read 6243 times) previous topic - next topic

zio90

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:

Code: [Select]



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);
}
}




Maurotec

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:
Code: [Select]

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.

paulus1969

Per quale motivo hai messo gli apici?
Hai scritto:

Code: [Select]

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


invece di:

Code: [Select]

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


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

Maurotec


Per quale motivo hai messo gli apici?
Hai scritto:

Code: [Select]

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


invece di:

Code: [Select]

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.

zio90

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

zio90

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

Code: [Select]



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

zio90

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

zio90

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

Go Up