Ciclo IF non esegue codice

salve a tutti

rieccomi qui, con un nuovo quesito...
ieri mentre c ercavo di scrivere una funzione ad hoc per i tasti del mio progetto mi sono imbattuto in un problemino
ho scritto

int tasto ;
int x ;

void setup() {
 Serial.begin(115200);
   
   pinMode(A0, INPUT);
}

void loop() {

   Serial.println(analogRead(A0));  
   analogRead(A0);
  
      if (A0 == 280){
                  x++;
                 Serial.println("tasto+");
                 }
      if  (A0 == 144)  {
                  x--;
                   Serial.println("tasto-");
                 }
                    
                 Serial.println(x); 
                 delay(1000);
}

quando premo il relativo tasto vedo da seriale il valore giusto ma non capisco perche non esegua il codice tra {}
qualcuno vede qualche errore che mi sfugge ?

per due differenti problemi

primo tu fa DUE letture del pin A0, stampi la prima ma usi la SECONDA (anzi, useresti, poi vediamo perchè), e non è detto che sia uguale alla prima
tu devi leggere una volta sola, salvare il valore letto e usarlo per le stampe e per i test, solo così avrai la certezza di usare solo un valore, che per "coincidenza" sarà quello che hai letto nella seriale

il secondo problema è più "stipido" e se fai come ti ho appena scritto lo metti a posto senza accorgertene
comunque te lo dico lo stesso
if (A0==.....
A0 è il piedino, non la LETTURA fatta sul piedino

Standardoil:
per due differenti problemi

primo tu fa DUE letture del pin A0, stampi la prima ma usi la SECONDA (anzi, useresti, poi vediamo perchè), e non è detto che sia uguale alla prima
tu devi leggere una volta sola, salvare il valore letto e usarlo per le stampe e per i test, solo così avrai la certezza di usare solo un valore, che per "coincidenza" sarà quello che hai letto nella seriale

il secondo problema è più "stipido" e se fai come ti ho appena scritto lo metti a posto senza accorgertene
comunque te lo dico lo stesso
if (A0==.....
A0 è il piedino, non la LETTURA fatta sul piedino

hai ragione...
in effetti

int tasto ;
int x ;

void setup() {
 Serial.begin(115200);
   
   pinMode(A0, INPUT);
}

void loop() {

 tastiera();
 
}

void tastiera() {
   [b]tasto = analogRead(A0);[/b]
  
  
  
      if (tasto == 280){
                  x++;
                 Serial.println("tasto+");
                 }
      if  (tasto == 144)  {
                  x--;
                   Serial.println("tasto-");
                 }
                    
                 Serial.println(tasto); 
                 Serial.println(x);
                 delay(1000);
  }

ha dato il risultato sperato...

Se usi i pin A0,A1,A2 ecc.., come pin analogici non c'è bisogno che usi pinMode() sui i pin.

I pin analogici possono essere usati come pin digitali usando il loro nome, appunto A0,A1..., solo se usi i pin analogici come pin digitali sei obbligato a fare un pinMode() su di essi.

mixmax122:
in effetti
....
ha dato il risultato sperato...

Allora sei fortunato. La lettura analogica è facile che oscilli di almeno un'unità in più o in meno, e quindi quei confronti risulterebbero falsi. Il modo corretto per leggere dei pulsanti tramite pin analogico è accettare un range di valori attorno a quello centrale, in questo caso ad esempio da 230 a 330 per il tasto +, e da 94 a 194 per il tasto - (ho fatto il centrale ±50).

PS: if non è un ciclo (non ripete nulla) ma una scelta/ramificazione. Cicli sono for, while, do while.

Claudio_FF:
Allora sei fortunato. La lettura analogica è facile che oscilli di almeno un’unità in più o in meno, e quindi quei confronti risulterebbero falsi. Il modo corretto per leggere dei pulsanti tramite pin analogico è accettare un range di valori attorno a quello centrale, in questo caso ad esempio da 230 a 330 per il tasto +, e da 94 a 194 per il tasto - (ho fatto il centrale ±50).

PS: if non è un ciclo (non ripete nulla) ma una scelta/ramificazione. Cicli sono for, while, do while.

beh in effetti… :slight_smile: :slight_smile: :slight_smile:
stavo semplificando, giusto per capire cosa non andasse.
poi ho scritto :

void tastiera() {
   statotasto = analogRead(A0);
     if (statotasto > 900)
                 {tasto = 0;}
    if ( (statotasto > 315)  && (statotasto < 320 ) )  
                 {tasto = 2;}
      if ( (statotasto > 170)  && (statotasto < 180 ) )  
                 {tasto = 1;} 
     if ( (statotasto > 70)  && (statotasto < 80 ) )  
                 {tasto = 3;}            
                 return tasto;    
                       
}