Nell'ultimo articolo abbiamo toccato con mano la prima elettronica esterna mediante dei componenti elettrici di OUTPUT.
In questo episodio invece vedremo il nostro primo componente di INPUT, cioè un pulsante che utilizzeremo per controllare un LED.
I PULSANTI
I pulsanti sono componenti elettrici che consentono di controllare il flusso della corrente all'interno di un circuito.
Come potete notare dall'immagine, i pulsanti si compongono di due coppie di piedini che hanno un comportamento diverso a seconda che il pulsante sia premuto o meno.
In particolare:
Se il pulsante non è premuto le due coppie di piedini sono scollegate tra loro.
Se il pulsante è premuto, allora tutti e quattro i piedini saranno in comunicazione.
A seguito è riportato lo schema di collegamento con Arduino:
Il collegamento al GND deve passare necessariamente per un resistore, in questo caso da 1 kΩ (=1000 ohm), per evitare che Arduino possa rilevare "false letture". Se non ci fosse il resistore, infatti, l'eventuale corrente residua presente nei cavi non avrebbe modo di scaricarsi, alterando i valori di lettura sul pin.
HARDWARE
Il nostro obiettivo è quello di usare il pulsante per controllare un LED. Occorrente:
- 6 jumper
- 1 diodo LED
- 1 resistore da 220 Ω
- 1 pulsante
- 1 resistore da 1 kΩ
Ecco i collegamenti:
Il resistore collegato al pulsante è da 1 kΩ.
Il resistore collegato al LED è da 220 Ω.
SOFTWARE
Dopo aver preparato il nostro semplice circuito, possiamo dedicarci alle righe di codice: scriviamo un programma che faccia lampeggiare il LED solo quando il bottone è premuto.
Il blocco di codice relativo al funzionamento del LED è lo stesso che abbiamo usato nell'episodio precedente.
Sicuramente avrete notato che ci sono due novità:
- La funzione digitalRead( ).
- Il costrutto if... else.
digitalRead( )
La funzione digitalRead( ) legge lo stato di un pin di input e restituisce:
-
HIGH se c'è tensione (quindi passa corrente).
- LOW se non c'è tensione (quindi non passa corrente).
La lettura infatti, come suggerisce il nome della funzione, è di tipo digitale**, cioè riconosce esclusivamente un valore che può essere 0 (LOW) oppure 1 (HIGH). Adesso capite meglio il motivo per cui è necessario utilizzare un resistore per evitare "false letture".
**Esiste anche la lettura "analogica" che vedremo negli episodi a seguire.
Il costrutto if... else
Il costrutto if... else esiste praticamente in tutti i linguaggi di programmazione e, come tutte le strutture di controllo, consente di controllare, appunto, il flusso di esecuzione del nostro programma.
In particolare l'istruzione "if" esegue un blocco di codice (indicato tra parentesi graffe) solo se si verifica una specifica condizione (indicata tra parentesi tonde); in caso contrario invece sarà eseguito il blocco preceduto dall'istruzione "else". La sintassi quindi è la seguente:
if (condizione) {
codice 1...
}
else {
codice 2...
}
Funzionamento:
1) Si valuta la condizione.
2) Se la condizione è vera, allora viene eseguito il "codice 1".
3) Se la condizione è falsa, allora viene eseguito il "codice 2".
Attenzione! L'istruzione else non è necessaria, quindi non siete obbligati a specificare le azioni da eseguire nel caso la condizione non sia verificata: semplicemente il programma riprenderà l'esecuzione sequenziale... (cioè eseguirà le istruzioni che trova immediatamente dopo)
Nel caso del nostro programma:
if(digitalRead(buttonPin)==HIGH) {
digitalWrite(pinLed, HIGH);
delay(tempo);
digitalWrite(pinLed, LOW);
delay(tempo);
}
Il LED lampeggerà solo se la funzione digitalRead( ) rileverà la presenza di tensione sul pin numero 9 (variabile buttonPin).
Attenzione!
Nella condizione abbiamo utilizzato il doppio uguale == per indicare che stiamo facendo un controllo, e non un assegnazione. Se scrivessimo
if(digitalRead(buttonPin)=HIGH)
otterremmo sicuramente un errore in fase di compilazione: in tal caso infatti staremmo tentando di assegnare un valore HIGH alla funzione digitalRead( ), ma questa operazione non ha alcun significato!