
A distanza di qualche mese riprendo le mie brevi lezioni sull’uso dell’Arduino Sensor Kit, mi dispiace non stato celere nel produrre altre lezioni, ma gli impegni lavorativi mi hanno parecchio coinvolto.
Come già avevo avuto modo di segnalare nelle precedenti lezioni, per la realizzazione di queste guide prendo come riferimento l’indice presente sul sito Arduino e su quella traccia realizzo lezioni un po’ più approfondite che mi permettono poi di strutturare una lezione di laboratorio di circa due ore di attività.
Giusto per non far “arrabbiare” nessuno — mi riferisco a chi potrebbe critica le modalità con cui vengono presentati alcuni argomenti di elettronica — ricordo che queste lezioni sono dedicate a chi non ha mai affrontato lo studio dell’elettronica (neofiti o studenti della secondaria di primo grado e studenti dei primi due anni della scuola superiore), pertanto alcuni concetti richiedono chiarimenti e inevitabili semplificazioni, che consentiranno di riprendere gli stessi argomenti con maggiore facilità quando le competenze teoriche saranno più solide.
Gli obiettivi di questa terza lezione sono:
- comprendere come funziona un pulsante a livello elettrico e meccanico.
- sviluppare sketch via via più complessi:
- accensione di un LED alla pressione del pulsante;
- Indicazione dello stato del LED sulla SerialMonitor;
- cicli di blink avviati da pulsante;
- cicli di blink avviati da pulsante e segnalazione del numero di cicli.
Per lo svolgimento di questa esercitazione abbiamo necessità solamente dell’Arduino Sensor Kit ed utilizzeremo:
Il pulsante:

Il LED:

Un po’ di teoria
Contatto meccanico e rimbalzo
Quando premiamo il pulsante, le lamine metalliche rimbalzano per qualche millisecondo: il segnale oscilla tra HIGH e LOW prima di stabilizzarsi. Se non lo gestiamo otteniamo letture multiple indesiderate.
Pull-up e pull-down
Nel caso in cui si utilizzano pulsanti esterni a quelli presenti sull’Arduino Sensor Kit tenere in conto quanto segue, perché sarà utile quando svilupperete in autonomia successivi circuiti senza questo kit, di seguito una breve precisazione.
Nel caso desiderate invece collegare un pulsante esterno, fate riferimento alle mie (ormai vecchie slide) di cui vi allego alcune pagine (le slide le trovate su questo sito nella sezione Arduino, oppure direttamente: Alfabeto di Arduino – lezione 2):



Perché non usare un filo diretto senza resistenza?
Se collegassi il pin direttamente a VCC e il pulsante a GND, quando premuto avreste un cortocircuito 5 V → GND, con decine di mA (o più) che potrebbero danneggiare pulsante e scheda Arduino.
Nel nostro caso però stiamo utilizzando l’Arduino Sensor Kit e la resistenza di Pull-Down è già presente sulla scheda in cui è presente il pulsante, quindi per ora non bisogna preoccuparsi di effettuare altri collegamenti.
Continuiamo tranquillamente e realizziamo i collegamenti che vedete nell’immagine che segue in cui il Led è collegato al D6 e il pulsante al D4:

Esempio 1: accendiamo e spegniamo il LED alla pressione del pulsante
4 | const int buttonPin = 4; |
8 | pinMode(ledPin, OUTPUT); |
9 | pinMode(buttonPin, INPUT); |
13 | int stato = digitalRead(buttonPin); |
14 | digitalWrite(ledPin, stato); |
Se vi state chiedendo che fine ha fatto la resistenza serie del LED e la resistenza di PULL-UP indicata nello schema precedente, da usare se desiderate usare componenti esterni, vi dico che queste sono integrate all’interno dei singoli elementi presenti sull’Arduino Sensor Kit.
Esempio 2: accendiamo e spegniamo il LED alla pressione del pulsante e segnaliamo lo stato sulla serial monitor
5 | const int buttonPin = 4; |
10 | pinMode(ledPin, OUTPUT); |
11 | pinMode(buttonPin, INPUT); |
15 | int stato = digitalRead(buttonPin); |
16 | digitalWrite(ledPin, stato); |
17 | Serial.print( "LED = " ); |
18 | Serial.println(stato); |
Serial.begin(9600);
Inizializza la porta seriale e stabilisce la velocità di trasmissione a 9600 baud: è il “canale” con cui il microcontrollore può dialogare con il Serial Monitor (o con un altro dispositivo) inviando e ricevendo dati.
Serial.print() / Serial.println();
Spediscono sulla seriale il testo o il valore passato: Serial.print() continua sulla stessa riga, mentre Serial.println() aggiunge a fine messaggio il carattere di “a capo” (CR+LF), così ogni chiamata successiva compare su una nuova riga nel Serial Monitor.
Esercizio 3: sequenza blink (5 cicli) avviata mediante la pressione di un pulsante
All’interno dello sketch che segue utilizzeremo un’istruzione if. Riprendo quanto già spiegato nelle mie lezioni che trovate su questo sito.
L’istruzione if è composta da un blocco “condizione” che verifica se una deterniata condizione logica si verifica. Se la “condizione” risulta “Vera“, viene eseguita un blocco “istruzioni“, se la “condizione” risulta “Falsa“, non viene eseguito il blocco “istruzioni” e l’esecuzione del programma prosegue oltre l’istruzione if.

In altro modo, se la condizione di controllo, costituita ad esempio dal superamento di un valore analogico rispetto ad un valore dato, risulta vera, verrà eseguito il codice incluso tra le parentesi graffe che seguono il controllo, altrimenti se la condizione di controllo risulta falsa, non vengono eseguite le istruzioni dell’if e l’esecuzione del programma continua con la porzione di codice che segue.

1 | if (someVariable ?? value) |
(con ?? indichiamo l’operatore logico usato dalla condizione di controllo e può essere: =, =, ==, !=)
L’esempio sopra confronta la variabile someVariable con il valore contenuto in value che può essere una variabile o una costante. Se il confronto o la condizione all’interno delle parentesi tonde risulta vera, verrà eseguita la porzione di codice inclusa tra le parentesi graffe, doSomething, altrimenti se la condizione risulta falsa viene saltata la porzione tra parentesi graffe e l’esecuzione prosegue dopo l’ultima parentesi graffa.
Nota: fate attenzione che se accidentalmente usate ‘=’, ad esempio if(x=10), tecnicamente è un’operazione valida, l’operazione assegna alla variabile x il valore 10 che è un’operazione sempre vera, quindi lo sketch si comporterà diversamente da come avevamo progettato. Invece se usiamo “==” (doppio uguale) in if(x==10) viene verificato se la variabile x è uguale al numero 10.
Pensate a “=” come ad un’operazione di assegnamento e “==” come ad una operazione di confronto (“è uguale a”).
Realizziamo ora l’esercizio 3:
12 | const int buttonPin = 4; |
16 | pinMode(ledPin, OUTPUT); |
17 | pinMode(buttonPin, INPUT); |
21 | if (digitalRead(buttonPin) == HIGH) { |
25 | for ( int contatore = 0; contatore < 5; ++contatore) { |
26 | digitalWrite(ledPin, HIGH); |
28 | digitalWrite(ledPin, LOW); |
Esercizio 4: sequenza blink (5 cicli) avviata mediante la pressione di un pulsante e segnalazione sulla SerialMonitor del numero di volte (cicli) in cui viene avviata la sequenza di blink.
In questo caso utilizziamo una variabile globale chiamata “ciclo” che segnala sulla SerialMonitor il numero di cicli da 5 blink del LED.
13 | const int buttonPin = 4; |
21 | pinMode(ledPin, OUTPUT); |
22 | pinMode(buttonPin, INPUT); |
26 | if (digitalRead(buttonPin) == HIGH) { |
32 | Serial.print( "Ciclo = " ); |
33 | Serial.println(ciclo); |
34 | for ( int contatore = 0; contatore<5; ++contatore) { |
35 | digitalWrite(ledPin, HIGH); |
37 | digitalWrite(ledPin, LOW); |
Salve,
nel codice compare
contatore &amp;lt; 5;
non mi è chiara la condizione di confronto.
Puoi gentilmente chiarirmela?
Grazie!
Ciao Giuseppe,
scusami è un errore del plug-in il codice che vedi rappresenta in html il carattere “<", ora ho sistemato. Fammi sapere se tutto ok. Saluti.