Basi · 9 min di lettura

Programmazione a blocchi Arduino: far lampeggiare un LED

Programmazione a blocchi Arduino per principianti: collega un LED con resistenza da 220 Ω, la riga C++ di ogni blocco, cosa cambia con 100 ms e poi un semaforo.

Con la programmazione a blocchi di Arduino, il primo programma è quasi sempre lo stesso: far lampeggiare un LED. In questo articolo lo facciamo dall'inizio alla fine. Colleghiamo un LED al pin 9 con una resistenza da 220 Ω, leggiamo uno per uno i blocchi del progetto LED lampeggiante di BlueGrays e vediamo, affiancati, in quale riga del codice C++ caricato sulla scheda si trasforma ogni blocco. Proverai anche a cambiare un solo numero, il 100 del blocco "attendi 100 ms", per regolare la velocità del lampeggio.

Questo articolo è la parte 2 della serie Dai blocchi al codice. In cos'è la programmazione a blocchi abbiamo spiegato cosa sono i blocchi e come diventano codice vero. Nella prossima parte aggiungiamo un pulsante e vediamo il blocco "se" e l'if/else.

Non ci fermiamo a un solo LED. Faremo crescere la stessa logica passo dopo passo fino a programmi che accendono due LED a turno, si comportano come un semaforo e lampeggiano come le luci della polizia. Poi vedrai la stessa idea sull'ESP32 e sul Raspberry Pi Pico con MicroPython. In fondo trovi una tabella con gli errori che quasi tutti i principianti fanno almeno una volta. Tutti i progetti di questo articolo sono gratuiti in BlueGrays, blocchi e codice compresi, e puoi vedere tutti i progetti con blocchi divisi per piattaforma nella pagina programmazione a blocchi.

Cosa ti serve?

MaterialeQuantitàNota
Arduino Uno (o Nano)1Si collega al computer via USB
LED da 5 mm (il rosso è il più semplice)1Gamba lunga +, gamba corta -
Resistenza da 220 Ω1Bande: rosso, rosso, marrone
Breadboard1Niente saldature
Cavi jumper maschio-maschio2Per D9 e GND
Computer con Arduino IDE1Per caricare il codice sulla scheda

Il circuito: collegare il LED al pin 9

Un LED ha due gambe e il verso conta. La gamba lunga è l'anodo (+), quella corta il catodo (-); dal lato del catodo il corpo in plastica ha un lato piatto. La corrente scorre solo dall'anodo al catodo, quindi se lo inserisci al contrario non succede niente. Collega il pin 9 di Arduino a un capo della resistenza da 220 Ω e l'altro capo alla gamba lunga del LED. La gamba corta va a GND. La resistenza limita la corrente: togli dai 5 V i circa 2 V del LED rosso, sulla resistenza restano 3 V, e 3 V / 220 Ω fanno circa 14 mA. È una corrente comoda per il LED e sicura per il pin di Arduino. Puoi verificare il valore per il colore del tuo LED con il calcolatore di resistenza per LED. Come funziona un LED è spiegato in cos'è un LED, e come sono collegate all'interno le file della breadboard in cos'è una breadboard.

CollegamentoArduino Uno (LED lampeggiante)ESP32 (LED lampeggiante con ESP32)Raspberry Pi Pico (LED esterno)
Gamba lunga del LED (anodo, +)D9 tramite 220 ΩGPIO 5 tramite 220 ΩGP14 tramite 220 Ω
Gamba corta del LED (catodo, -)GNDGNDGND
Pin nei blocchi e nel codice95LED_PIN = 14
Attesa nel progetto100 ms500 ms0,5 secondi
Tensione del pin5 V3,3 V3,3 V
Non collegare mai un LED direttamente a un pin senza resistenza. Senza di essa nulla limita la corrente: il LED si accende troppo forte, si scalda e può rompersi presto, e anche il pin di Arduino può danneggiarsi. Se hai messo il LED al contrario, niente paura: semplicemente non si accende, basta girarlo. Trovi la posizione dei pin della tua scheda nello strumento Pinout.

Il tuo primo programma a blocchi: LED lampeggiante

Con il circuito pronto, passiamo al programma. Apri il progetto LED lampeggiante in BlueGrays e attiva Mostra a blocchi nella sezione del codice: vedrai i blocchi qui sotto. In tutto sono sette blocchi, divisi in due grandi gruppi: in alto setup (una volta), sotto ripeti per sempre. I blocchi compaiono nella lingua dell'app: in italiano si legge "scrivi ALTO sul pin", in inglese "write HIGH to pin".

Blocchi del progetto LED lampeggiante: imposta pin 9 come USCITA nel setup, poi scrivi ALTO, attendi 100 ms, scrivi BASSO, attendi 100 ms dentro ripeti per sempre
Blocchi di LED lampeggiante (progetto 1): il pin 9 diventa un'uscita una sola volta, poi i quattro blocchi di ripeti per sempre girano all'infinito.

I blocchi del gruppo setup (una volta) vengono eseguiti una sola volta, quando la scheda si accende o premi reset. Qui c'è un solo blocco: "imposta pin 9 come USCITA". I pin digitali di Arduino possono essere ingressi o uscite. Dato che pilotiamo un LED, diciamo alla scheda "da questo pin farò uscire corrente". Il gruppo ripeti per sempre parte quando il setup è finito e viene eseguito dall'alto in basso ancora e ancora finché la scheda resta accesa. I suoi quattro blocchi accendono il LED, aspettano 100 millisecondi, lo spengono e aspettano altri 100 millisecondi. Dopo l'ultimo blocco il programma torna all'inizio e il LED si riaccende. Quello che chiamiamo lampeggio non è altro che questi quattro passi ripetuti cinque volte al secondo.

Blocco → riga C++: in cosa si trasforma ogni blocco?

BloccoRiga C++Cosa fa
setup (una volta)void setup() { ... }Esegue il contenuto una volta all'avvio
imposta pin 9 come USCITApinMode(9,OUTPUT);Rende il pin 9 un'uscita
ripeti per semprevoid loop() { ... }Ripete il contenuto all'infinito
scrivi ALTO sul pin 9digitalWrite(9,HIGH);Porta il pin a 5 V, il LED si accende
attendi 100 msdelay(100);Ferma il programma per 0,1 s
scrivi BASSO sul pin 9digitalWrite(9,LOW);Porta il pin a 0 V, il LED si spegne
attendi 100 msdelay(100);Resta spento per 0,1 s
C++ (Arduino IDE)
1// Led Yakma (proje 1): D9'daki LED 100 ms yanar, 100 ms söner
2// LED Blink (project 1): the LED on D9 is on for 100 ms, off for 100 ms
3void setup() {
4  pinMode(9,OUTPUT);     // LED pini çıkış / LED pin as output
5}
6
7void loop() {
8  digitalWrite(9,HIGH);  // LED'i yak / turn the LED on
9  delay(100);            // 100 ms bekle (1000 ms = 1 s) / wait 100 ms (1000 ms = 1 s)
10  digitalWrite(9,LOW);   // LED'i söndür / turn the LED off
11  delay(100);            // 100 ms bekle / wait 100 ms
12}
13

Mettendo la tabella accanto al codice vedi cosa fanno i blocchi al posto tuo. La forma dei gruppi setup e ripeti per sempre corrisponde alle parentesi graffe delle funzioni void setup() e void loop(): il gruppo in cui si trova un blocco decide dentro quali graffe viene scritta la sua riga. Con i blocchi non devi pensare al punto e virgola alla fine di ogni istruzione, a maiuscole e minuscole (pinMode, digitalWrite) né alle parentesi. Ma quando inizi a modificare tu stesso il codice nell'Arduino IDE diventano importanti; basta un punto e virgola dimenticato per avere un errore di compilazione. È proprio questo il vantaggio dei blocchi: prima fissi la logica del programma, poi impari come quella stessa logica si scrive in codice.

Cosa succede se cambi "attendi 100 ms"?

Il tempo di attesa è in millisecondi (ms) e 1000 ms sono un secondo. I due blocchi di attesa del progetto sono a 100 ms, quindi il LED resta acceso 0,1 secondi e spento 0,1 secondi. Un ciclo completo dura 200 ms: il LED lampeggia cinque volte al secondo. Se aumenti il numero in entrambi i blocchi il LED rallenta, se lo diminuisci accelera. Sotto una certa soglia l'occhio non distingue più i lampeggi e il LED sembra sempre acceso. La tabella mostra cosa vedrai cambiando le due attese:

Blocchi di attesaUn ciclo completoLampeggi al secondoCosa vedi
10 ms + 10 ms20 ms50Sembra acceso fisso, un po' più debole
100 ms + 100 ms (valore del progetto)200 ms5Lampeggio veloce e netto
250 ms + 250 ms500 ms2Lampeggio facile da seguire
500 ms + 500 ms1 s1Una volta al secondo, ritmo calmo
1000 ms + 1000 ms2 s0,51 secondo acceso, 1 secondo spento
100 ms + 900 ms1 s1Lampo breve, lungo buio
I due blocchi di attesa non devono per forza essere uguali. Metti il primo a 100 e il secondo a 900 e il LED farà un breve lampo ogni secondo, come la spia "sto funzionando" di tanti dispositivi. Nel codice sono delay(100); e delay(900);. Cambiare un numero e ricaricare è l'esercizio più rapido per capire il legame tra blocchi e codice.

Far crescere il programma: due LED, semaforo, lampeggiante della polizia

Se sai far lampeggiare un LED, per gestirne diversi non ti serve niente di nuovo: ripeti gli stessi tre blocchi con altri pin. Nel progetto Due LED lampeggianti alternati nel setup diventano uscite due pin: 8 e 9. Dentro ripeti per sempre ci sono "scrivi ALTO sul pin 8" e "scrivi BASSO sul pin 9", poi "attendi 200 ms". Dopo si scrive il contrario e si aspettano di nuovo 200 ms. Il trucco è che i due blocchi di scrittura vengono eseguiti uno dopo l'altro senza attesa in mezzo, quindi i due LED sembrano scambiarsi nello stesso istante. Il blocco di attesa decide quanto dura ogni stato.

Il progetto Semaforo porta la stessa idea a tre LED: rosso su D2, giallo su D3, verde su D4. Il gruppo ripeti per sempre ha quattro fasi e tutte seguono lo stesso schema: un blocco scrivi ALTO o BASSO per ciascuno dei tre LED, poi un blocco di attesa. I blocchi di scrittura decidono quale LED resta acceso, quello di attesa per quanto tempo. Più blocchi non lo rendono più difficile, solo più lungo. Una versione con pulsante pedonale, più vicina a un incrocio reale, è nell'articolo semaforo con Arduino.

Blocchi del progetto Semaforo: pin 2, 3 e 4 come uscita, blocchi scrivi ALTO e BASSO in quattro fasi, attese di 2000 ms e 300 ms
Blocchi del Semaforo (progetto 3): ogni fase ha tre blocchi di scrittura e un blocco di attesa.
FaseRosso (D2)Giallo (D3)Verde (D4)Attesa
1ALTOBASSOBASSO2000 ms (2 s)
2BASSOALTOBASSO300 ms
3BASSOBASSOALTO2000 ms (2 s)
4BASSOALTOBASSO300 ms
C++ (Arduino IDE)
1// Trafik Lambası (proje 3) / Traffic Light (project 3)
2void setup() {
3  pinMode(2,OUTPUT);    // Kırmızı / Red
4  pinMode(3,OUTPUT);    // Sarı / Yellow
5  pinMode(4,OUTPUT);    // Yeşil / Green
6}
7
8void loop() {
9  // Kırmızı yanar, 2 s bekle / Red on, wait 2 s
10  digitalWrite(2,HIGH);
11  digitalWrite(3,LOW);
12  digitalWrite(4,LOW);
13  delay(2000);
14  // Sarı yanar, 0,3 s bekle / Yellow on, wait 0.3 s
15  digitalWrite(2,LOW);
16  digitalWrite(3,HIGH);
17  digitalWrite(4,LOW);
18  delay(300);
19  // Yeşil yanar, 2 s bekle / Green on, wait 2 s
20  digitalWrite(2,LOW);
21  digitalWrite(3,LOW);
22  digitalWrite(4,HIGH);
23  delay(2000);
24  // Sarı yanar, sonra başa (kırmızıya) dön / Yellow on, then back to red
25  digitalWrite(2,LOW);
26  digitalWrite(3,HIGH);
27  digitalWrite(4,LOW);
28  delay(300);
29}
30

Nel progetto Lampeggiante della polizia a LED compaiono due nuovi tipi di blocco. Il primo è il gruppo variabili globali (all’inizio) con il blocco "dichiara intero (int) delayTime = 60". È la riga int delayTime = 60; del codice e dà un nome al tempo di lampeggio. Poiché i blocchi di attesa usano delayTime invece di un numero, per cambiare la velocità modifichi solo il 60 e non quattro blocchi diversi. Il secondo è il blocco verde "ripeti 3 volte": esegue tre volte i quattro blocchi che contiene e in C++ diventa il ciclo for(int i=0;i<3;i++).

Blocchi del progetto Lampeggiante della polizia a LED: variabile delayTime, pin 2 e 3 come uscita, due blocchi ripeti 3 volte
Blocchi del Lampeggiante della polizia a LED (progetto 4): il LED rosso (D2) lampeggia tre volte, poi il LED blu (D3) altre tre.

Facciamo i conti: a ogni lampo il LED rosso resta acceso 60 ms e spento 60 ms, quindi un lampo dura 120 ms. Tre lampi fanno 360 ms, e lo stesso vale per il LED blu. Un ciclo completo dura circa 0,7 secondi. Con delayTime a 30 lampeggia due volte più veloce, con 120 più lento. Variabili e cicli sono l'argomento della parte 4 della serie; li vediamo in dettaglio in "ripeti per sempre", blocchi di conteggio e array. Il progetto LED in sequenza, che fa scorrere la luce lungo una fila di LED, è il passo successivo sulla stessa strada.

La stessa idea su ESP32 e Raspberry Pi Pico

Sull'ESP32 i blocchi sono quasi identici a quelli di Arduino, perché anche l'ESP32 si programma in C++ con l'Arduino IDE. Nel progetto LED lampeggiante con ESP32 il LED è sul GPIO 5 e i blocchi di attesa sono da 500 ms. Anche le righe di codice sono le stesse: pinMode(5, OUTPUT); digitalWrite(5, HIGH); delay(500);. Le uniche differenze sono il numero del pin, i 3,3 V forniti dai pin dell'ESP32 e la scelta di una scheda ESP32 nell'Arduino IDE. Tutto quello che impari sull'Uno si trasferisce direttamente sull'ESP32.

Nei progetti per Raspberry Pi Pico i blocchi diventano codice MicroPython e i nomi dei blocchi cambiano un po'. Nel progetto LED esterno con il Pico il LED è su GP14. Il blocco "pin led : GP LED_PIN, USCITA" corrisponde a led = Pin(LED_PIN, Pin.OUT), "accendi (on) il pin led" a led.on(), "attendi 0.5 secondi" a time.sleep(0.5) e ripeti per sempre al ciclo while True:. Attenzione: in MicroPython l'attesa è in secondi, non in millisecondi; il delay(500) di Arduino qui diventa time.sleep(0.5). Se vuoi provare senza nessun cavo, il progetto LED integrato del Pico accende il LED su GP25 direttamente sulla scheda; sul Pico W al LED integrato si accede con il nome "LED" invece di GP25.

MicroPython
1# Pico harici LED (proje 8163), seri port satırları çıkarıldı
2# Pico external LED (project 8163), serial print lines removed
3from machine import Pin
4import time
5
6LED_PIN = 14                    # GP14, herhangi bir boş GPIO / any free GPIO
7led = Pin(LED_PIN, Pin.OUT)     # pini çıkış yap / set the pin as output
8
9while True:                     # sürekli tekrarla / loop forever
10    led.on()                    # LED'i yak / turn the LED on
11    time.sleep(0.5)             # 0,5 saniye bekle / wait 0.5 s
12    led.off()                   # LED'i söndür / turn the LED off
13    time.sleep(0.5)
14

Errori comuni e come risolverli

ErroreSintomoSoluzione
LED inserito al contrarioIl LED non si accende maiGamba lunga verso il pin tramite la resistenza, gamba corta a GND; gira il LED
Nessuna resistenzaLED troppo luminoso, si scalda, può rompersi prestoMetti una resistenza da 220 Ω in serie al LED
Pin del blocco diverso dal circuitoIl caricamento riesce ma il LED resta spentoIl 9 del blocco e il D9 cablato devono coincidere; cambia il filo o il numero
Secondo blocco di attesa dimenticatoIl LED sembra sempre accesoAnche dopo il blocco scrivi BASSO ci vuole un blocco di attesa (delay)
Attesa troppo breve (es. 5 ms)Il LED sembra fisso e un po' deboleProva almeno 50–100 ms
Entrambe le gambe del LED nella stessa fila della breadboardIl LED non si accende maiMetti le gambe in file diverse; i fori della stessa fila sono collegati all'interno
Scheda o porta sbagliateL'Arduino IDE dà un errore di caricamentoScegli la scheda e la porta giuste dal menu Strumenti

Passo passo nell'app: dai blocchi alla scheda

  1. In BlueGrays, apri il progetto LED lampeggiante, che ha il badge dei blocchi nell'elenco dei progetti. Con il filtro puoi anche mostrare solo i progetti con blocchi.
  2. Seguendo lo schema, monta sulla breadboard il LED, la resistenza da 220 Ω e due cavi.
  3. Nella sezione del codice attiva Mostra a blocchi. Al posto del codice compaiono i blocchi; toccando l'immagine si apre a schermo intero.
  4. Passa alla scheda Capire i blocchi. Il programma viene spiegato passo dopo passo e in ogni passo vedi solo i suoi blocchi e cosa fanno.
  5. Disattiva l'interruttore per tornare al codice vero, copialo e incollalo nell'Arduino IDE. I blocchi non vengono caricati direttamente sulla scheda; sulla scheda va sempre questo codice.
  6. Nell'Arduino IDE scegli Arduino Uno come scheda e la porta giusta, poi premi Carica. Se non hai ancora l'IDE, l'articolo installare Arduino IDE ti guida passo passo.
  7. Quando il LED lampeggia, cambia le due righe delay(100) in delay(1000), ricarica e guarda la differenza con i tuoi occhi.

In questo articolo il LED ha sempre lampeggiato con lo stesso ritmo; il programma non ascoltava nulla dal mondo esterno. Il passo successivo è far prendere decisioni alla scheda: la parte 3 della serie, il pulsante e il blocco "se", mostra un programma che accende il LED quando premi un pulsante e come quel blocco diventa un if/else in C++.

Nell'app BlueGrays puoi guardare LED lampeggiante, Due LED lampeggianti alternati, Semaforo, Lampeggiante della polizia a LED e i progetti LED per ESP32 e Pico con schema e codice, passare alla versione a blocchi dello stesso programma con Mostra a blocchi e leggere cosa fa ogni passo con Capire i blocchi.

Domande frequenti

Cos'è la programmazione a blocchi con Arduino?

È un modo di mostrare un programma Arduino con blocchi che si incastrano come pezzi di un puzzle invece che con testo scritto. Ogni blocco, come "scrivi ALTO sul pin 9" o "attendi 100 ms", corrisponde a una riga del codice C++ caricato sulla scheda. Senza punti e virgola né parentesi, chi inizia si concentra prima sulla logica del programma.

Come si fa lampeggiare un LED con i blocchi?

Nel gruppo setup metti "imposta pin 9 come USCITA" e in ripeti per sempre, in ordine, "scrivi ALTO sul pin 9", "attendi 100 ms", "scrivi BASSO sul pin 9" e "attendi 100 ms". Nel circuito il LED va a D9 tramite una resistenza da 220 Ω. Questi blocchi diventano le righe pinMode, digitalWrite e delay.

Perché il mio LED resta acceso invece di lampeggiare?

Il motivo più comune è che manca il blocco di attesa dopo scrivi BASSO. In quel caso il LED resta spento solo per microsecondi e l'occhio non se ne accorge. Anche con attese molto brevi (per esempio 5 ms) il LED sembra acceso fisso; prova con 100 ms o più.

Che resistenza serve per un LED su Arduino?

Sui pin a 5 V di un Arduino Uno la scelta più comune è 220 Ω, che fa passare circa 14 mA in un LED rosso. Va bene anche 330 Ω, con il LED un po' meno luminoso. La resistenza limita la corrente su qualunque gamba del LED si trovi; l'importante è che sia in serie.

Posso caricare i blocchi direttamente su Arduino?

No. I blocchi di BlueGrays rendono il programma più facile da leggere e capire; sulla scheda va sempre il codice vero del progetto. Lo copi nell'Arduino IDE (in Thonny per il Pico) e lo carichi da lì.

Quanti secondi sono 1000 ms e come cambio la velocità del lampeggio?

1000 millisecondi sono 1 secondo. Un numero più grande nei blocchi di attesa rallenta il LED, uno più piccolo lo accelera: con 100 ms in entrambi i blocchi lampeggia 5 volte al secondo, con 500 ms una volta al secondo. Nei blocchi MicroPython del Pico il tempo si scrive in secondi, quindi 0.5 è mezzo secondo.

Vedi tutti i progetti
LED lampeggiante
#1Principiante

LED lampeggiante

Il primissimo ciao dell'elettronica: accendere e spegnere un solo LED. L'Arduino accende e spegne il LED a intervalli brevissimi, così la luce lampeggia veloce. Vedi nel modo più semplice come la sche

4.6(188)
1127
Due LED lampeggianti alternati
#2Principiante

Due LED lampeggianti alternati

Due LED lampeggiano veloci a turno: quando uno si accende l'altro si spegne, come se si passassero una palla. L'Arduino tiene accesa ogni luce per un quinto di secondo e poi passa all'altra. Dopo il s

4.6(105)
343
Semaforo
#3Principiante

Semaforo

Una copia in miniatura del semaforo che vedi ogni giorno per strada. Il rosso resta acceso due secondi, il giallo brilla per un attimo, il verde resta due secondi, poi si torna al rosso passando di nu

4.8(131)
397
Lampeggiante della polizia a LED
#4Principiante

Lampeggiante della polizia a LED

Proprio come le luci di un'auto della polizia: il LED rosso lampeggia tre volte velocissimo, poi tocca al blu per altre tre volte, e la sequenza si ripete senza sosta. Ti bastano due LED e due resiste

4.7(103)
258
LED in sequenza
#5Intermedio

LED in sequenza

Luci che si accendono una dopo l'altra, come se corressero. L'Arduino accende sei LED uno alla volta; ognuno brilla per un istante e si spegne, così la luce percorre la fila dall'inizio alla fine e po

4.6(85)
207
LED Lampeggiante con ESP32
#103Principiante

LED Lampeggiante con ESP32

Insegna l'uso di base delle uscite GPIO con l'ESP32. Otteniamo un effetto lampeggiante accendendo e spegnendo un LED dal pin digitale. Versione ESP32 del classico progetto blink su Arduino UNO; i comandi di base di blink nell'ambiente Arduino sono gli stessi, ma la disposizione dei pin e i livelli GPIO a 3,3 V dell'ESP32 sono diversi da quelli di Arduino UNO.

4.7(37)
99
Semaforo ESP32
#107Principiante

Semaforo ESP32

Simulazione di un vero semaforo con 3 LED rosso-giallo-verde. I tempi si avvicinano alla logica del traffico reale: rosso lungo, giallo corto, verde lungo. Classico esempio di controllo GPIO sequenziale.

4.4(21)
44
Accensione di un LED esterno con Raspberry Pi Pico (breadboard)
#148Principiante

Accensione di un LED esterno con Raspberry Pi Pico (breadboard)

Il passo successivo dopo il LED integrato di Pico: collegare un LED esterno alla breadboard e controllarlo tramite il pin GP14. Con questo progetto imparerai come utilizzare qualsiasi pin GPIO generico del Pico come uscita, la polarità del LED (stelo lungo = anodo/+, stelo corto = catodo/–) e perché è indispensabile un resistore di limitazione della corrente (220 Ω). Se non inserisci il resistore, l’LED riceverà una corrente eccessiva e potrebbe bruciarsi. Il circuito è molto semplice: Pico GP14

4.5(2)
7