Salve a tutti,
ho un problema con la programmaziona di un pulsante: in pratica quando premo un bottone e questo rimane premuto non devo svolgere niente fin quando il pulsante non viene rilasciato.
Ho scritto questa parte di codice e prima di provarlo volevo vedere se ci fosse qualcosa di sbagliato.
//codice
int val;
int button;
void setup(){
//codice
pinMode(9,INPUT);
}
void loop(){
val=digitalRead(9);
if(val==HIGH){
button=1;
}
else{
button=0;
}
if(button==1){
val=digitalRead(9);
}
else if(button==0){
//codice da eseguire
}
}
Hai correttamente intuito che ti serve una variabile per determinare se il pulsante è stato premuto ma il codice così come l'hai sctirro non fa quello che dichiari di voler ottenere, ti indico una possibile traccia a te trasformarla in codice:
Se il pulsante è premuto attivo il semaforo (nel tuo caso la variabile button) altrimenti controllo se il semaforo è attivo eseguo il codice e disattivo il semaforo altrimenti non faccio nulla.
Alcune proposte di miglioria per una "buona" programmazione:
Ottimizza sempre le variabili, in entrambe i casi hai definito variabili di tipo int, in questo caso è un inutile spreco di risorse (int occupa due byte) e è fuorviante, potevi definirle di tipo byte che appunto accupa un solo byte, ma ancora meglio essendo una un semaforo ed una la lettura di un pin che può valero solo HIGH e LOW (true e false) sarebbe meglio definirle booleane.
Inoltre la variabile val puoi farne a meno ottimizzando ancora di più il codice, ma se questo ti risultasse ostico puoi sfruttarla nella prossima stesura del codice e poi ottimizzare in seguito
Altra cosa per far si che il tutto funzioni come descritto devi dotare il pulsante di debounce hardware (che è comunque sempre preferibile), se tu volessi implementarlo software dovresti complicare il codice ma come detto se possibile è sempre meglio hardware (resistenza+condensatore nella versione più semplice possibile)