Può capitare che per dare in entrata un ingresso digitale e andare così a comandare una uscita del nostro Arduino, potremmo avere sotto mano solamente pulsanti. Come facciamo, dando in ingresso un impulso di valore alto (HIGH), a mantenere un valore costante in uscita? In questo post capirete come farlo, andremo a creare un programma che soddisfi le nostre esigenze. Vediamo come fare.
Iniziamo con le dichiarazioni delle variabili:
const int btPin = __; (numero pin non specificato)
pin dedicato all'input del pulsante
const int Pin = __; (numero pin non specificato)
pin dedicato all'output che andrà a comandare il relè per accendere/spegnere il punto luce
int btSt = 0;
variabile che corrisponde allo stato in tempo reale del pulsante, le attribuisco valore zero
int lastBtnSt = LOW;
variabile che corrisponde all'ultimo valore dello stato del pulsante, lo pongo a valore basso (low)
int State = LOW;
variabile che corrisponde al valore dello stato dell'uscita, la pongo a valore basso (low)
Dichiarazione di programma che gira solamente una volta, qui si definiscono i vari ingressi e uscite:
void setup() {
pinMode(Pin, OUTPUT); dichiaro la variabile come segnale di comando (output)
pinMode(btPin, INPUT); dichiaro la variabile come segnale d'ingresso (input)
}
Programma che verrà ripetuto in continuazione dopo aver eseguito la parte di setup:
btSt = digitalRead(btPin);
if (btSt != lastBtnSt && btSt == HIGH){
State = !State;
if (State == HIGH){
digitalWrite(Pin, HIGH);
}
else{
digitalWrite(Pin, LOW);
}
}
lastBtnSt = btSt;
delay(50);
quando vado a premere il pulsante la scheda Arduino rileva il valore in ingresso, che al momento della pressione è HIGH, ed attribuisce tale valore alla variabile corrispondente allo stato del pulsante (btSt varrà così HIGH) a questo punto il programma arriva al primo "if"; se lo stato del pulsante è diverso dall'ultimo stato (LOW, definito nella dichiarazione delle variabili) e se tale valore (btSt) è alto (HIGH) fai cambiare il valore dello stato dell'uscita nel suo opposto (se LOW cambialo in HIGH, se HIGH cambia in LOW). La prima istruzione del primo "if" è terminata il programma passerà quindi al secondo "if". Se lo stato dell'uscita è HIGH (cosa che sarà perchè nella dichiarazione delle variabili lo abbiamo posto a LOW valore cambiato nel suo opposto dovuto all'istruzione dopo il primo "if") dai in uscita un valore alto. Il programma termina ponendo il valore dell'ultimo stato del pulsante uguale all'attuale stato, cioè LOW (stato dopo la sua premuta). Così abbiamo visto come il programma da in uscita un valore HIGH costante anche se il pulsante non è più premuto (dovuto al fatto che lo stato del pulsante è uguale al suo ultimo stato, LOW, quindi la condizione del primo "if" non è rispettata e il programma non continuerà). Per ritornare a dare in uscita un valore basso (LOW) il programma vede che le condizioni del primo blocco sono rispettate e passa all'istruzione seguente. Dato che abbiamo in uscita un valore alto lo stato dell'uscita passa da HIGH, valore attribuito alla variabile in seguito alla prima pressione, ad uno stato basso. Si arriva alla seconda condizione ("if"). La seconda condizione non sarà rispettata (State = LOW) quindi il programma andrà ad eseguire le istruzioni alternative (istruzioni comprese nell'"else"), dando così in uscita un stato basso in modo costante. Il programma attribuisce alla variabile dell'ultimo stato del pulsante (LastBtnSt) il valore attuale del pulsante, il programma è pronto ad essere ripetuto.
Il ritardo della ripetizione del programma è inserito per evitare l'effetto bounce (rimbalzo).