Codice programma che identifica le variazioni di stato di un pulsante

Ciao,

attraverso la pressione di un pulsante devo far ciclare la lettura di quattro funzioni (rpm, temp,voltage, data e ora). E in effetti, in tal senso è ok. Questo il codice:

 StatoPulsante = digitalRead(BUTTON);                        // legge il valore del BUTTON e lo conserva  
  
  if (StatoPulsante != StatoPulsantePrecedente) {             // compara lo stato del pulsante attuale con il precedente  
    if (StatoPulsante == HIGH) {                              // se lo stato è cambiato incrementa il contatore  
      // se lo stato corrente è alto, il pulsante è passato da off a on  
      ContatorePulsantePremuto++;  
      if (ContatorePulsantePremuto == 1) {                   // controlla se il pulsante è stato premuto una volta  
        Serial.println("rpm e ora");                                // stampa sulla console "rpm e ora" 
        
      }  
      if (ContatorePulsantePremuto == 2) {                   // controlla se il pulsante è stato premuto due volte  
        Serial.println("temperatura");                             // stampa sulla console "temperatura" 
        
      }   
      if (ContatorePulsantePremuto == 3) {                   // controlla se il pulsante è stato premuto tre volte  
        Serial.println("voltage");                             // stampa sulla console "voltage" 
        }
       
      if (ContatorePulsantePremuto == 4) {                   // controlla se il pulsante è stato premuto quattro volte  
        Serial.println("data e ora");                             // stampa sulla console "data e ora" 
        
      }  
    }

Avendo terminato il codice del partitore di tensione l'ho implementato in uno sketch "globale" con quello di cui sopra. In effetti ciclando, lo schermo mi stampa correttamente il valore di tensione di una batteria da 12V. Perfetto!

Io vorrei, e qui viene il complicato, per me, aggiungere una condizione else e and a questa parte:

if (ContatorePulsantePremuto == 3) {                   // controlla se il pulsante è stato premuto tre volte  
        Serial.println("voltage");                             // stampa sulla console "voltage" 
        }

cioè vorrei che se il dato letto fosse <= di 12.20V, sullo schermo venisse stampato oltre al valore di "voltage" un messaggio del tipo "LOW". Io ho pensato a questo codice con l'utilizzo dell'else e dell'and:

else (ContatorePulsantePremuto == 3 && voltage<=12.20)
Serial.println("voltage""LOW");

ma l'IDE mi da dei messaggi d'errore circa le precedenze di parentesi. Non riesco a capire dove sbaglio. Potete aiutarmi?

Grazie

Perché else? Else ("altrimenti") serve a fare qualcosa nel caso in cui la condizione specificata nell'if sia falsa. Tu invece devi fare azioni aggiuntive quando è vera, per cui ti basta includere un secondo if dentro al primo:

if (ContatorePulsantePremuto == 3) {
  Serial.println("voltage");
  if (voltage<=12.20)
        Serial.println("voltage""LOW");   
}

Oppure:

if (ContatorePulsantePremuto == 3) {                   // controlla se il pulsante è stato premuto tre volte  
if (voltage<=12.20){
Serial.println("voltage LOW");
} else {
Serial.println("voltage");  
}                           
}

Capito. Grazie 1000, provo e vi riporto l'esito.

Perfetto! Ho variato un pò il codice ed ho scritto questo:

if (ContatorePulsantePremuto == 3) {                   // controlla se il pulsante è stato premuto tre volte  
             Serial.print(voltage);                               // stampa sulla console "voltage" 
      if (voltage<=12.20){                                   // controlla se la batteria misura meno di 12.20V
             Serial.println(voltage "LOW");                       // stampa sulla console "voltage" + LOW
}                           
}

Il codice funziona bene, ma levatemi un dubbio:

essendo "voltage" una variabile e "LOW" una semplice parola il comando Serial.print va in errore vero? No perchè se provo a stampare due variabili diverse nei due if, va tutto bene, segno che il codice esegue il comado, poi se aggiungo il LOW fa un casino.

In tal caso andrebbe creata una stringa con il comando fprint. Vero? Non è che mi interessi molto, in quanto poi queste info andranno stampate su LCD ma almeno mi levo un dubbio.

Grazie come sempre.

Dato che la Serial.print() non torna a capo, mente lo fa la Serial.println() ... basta usarle nel modo opportuno ed il gioco è fatto ...

Esempio:
Serial.print("La temperatura è: ");
Serial.println(temperatura);

Guglielmo

P.S.: ... e no, non puoi mettere le due cose nella stessa Serial.println()

Grazie Guglielmo, per voi sicuramente sono bazzecole ma io sto godendo, mi sembra tutto una magia scientifica.

Grazie. Procedo con gli esperimenti e non vogliatemi male se spesso vi chiedo qualcosa.

Buon w-e a tutti!

Nota anche che, se anche funzionasse quello che hai scritto tu, ti scriverebbe la tensione due volte.

Infatti, ho ri-corretto ed ora il codice va bene.

Grazie