Basi · 11 min di lettura

Dai blocchi al codice Arduino: tabella C++ e MicroPython

Dai blocchi al codice Arduino: 34 blocchi con il loro codice C++ e MicroPython in una tabella, errori comuni, un metodo in 4 passi e un programma di esempio.

Il modo più rapido per passare dai blocchi al codice Arduino è tenere accanto a te una tabella di una pagina che mostra in quale riga di codice vero si trasforma ogni blocco. La risposta breve: i blocchi non sono un nuovo linguaggio, sono la forma visiva delle righe di Arduino C++. Il blocco «imposta pin 13 come USCITA» è la riga pinMode(13, OUTPUT);, il blocco «attendi 1000 ms» è delay(1000); e il blocco «se … fai» è un’istruzione if. La tabella qui sotto mette le etichette reali dei blocchi dell’app BlueGrays accanto al loro codice Arduino C++ e al codice MicroPython sul Raspberry Pi Pico.

Questa pagina non è una lezione, è una scheda di consultazione. Puoi stampare la tabella, tenerla vicino al banco e controllare quale riga corrisponde a quale blocco mentre guardi un progetto. Dopo la tabella trovi gli errori più comuni nel passaggio, un metodo in quattro passi per lasciarti alle spalle i blocchi e lo stesso programma scritto a blocchi, in C++ e in MicroPython. L’esempio si compila nell’Arduino IDE e gira sul Pico con Thonny.

Se vuoi imparare i blocchi passo dopo passo, c’è la serie Dai blocchi al codice: cos’è la programmazione a blocchi, accendere un LED a blocchi, il blocco se, cicli e variabili e leggere i sensori a blocchi e MicroPython. Questo articolo raccoglie tutte quelle lezioni in un’unica tabella.
Blocchi del progetto Impostazione della frequenza con cicalino: variabili globali, quattro pin dei pulsanti come INGRESSO nel setup, blocchi se dentro ripeti per sempre, blocchi costringi e suona
Blocchi del progetto Impostazione della frequenza con cicalino. Dichiara, imposta come INGRESSO, leggi pin, imposta, costringi, suona e ferma il suono della tabella compaiono tutti in questo unico programma.

Prima di leggere la tabella: quattro differenze tra i tre

Blocchi, C++ e MicroPython esprimono la stessa idea, ma le regole di scrittura cambiano. Queste quattro differenze sono quelle su cui inciamperai di più. La prima è la struttura: un programma Arduino C++ ha due parti chiamate setup() e loop(), che nei blocchi compaiono come «setup (una volta)» e «ripeti per sempre». MicroPython non ha un setup separato; il file viene eseguito una volta dall’alto in basso e la parte che si ripete va dentro un ciclo while True:. La seconda sono i tipi: in C++ ogni variabile ha un tipo scritto (int, float, bool), nei blocchi è l’opzione «dichiara intero (int)», in Python il tipo non si scrive affatto.

La terza differenza sono gli intervalli numerici. Sull’Arduino Uno una lettura analogica va da 0 a 1023 e il PWM da 0 a 255; sull’ESP32 la lettura analogica arriva a 0–4095; sul Pico, MicroPython dà sia le letture sia il duty PWM nell’intervallo 0–65535. Per questo non puoi copiare una soglia da una scheda all’altra così com’è. La quarta differenza è l’unità di tempo: delay() vuole millisecondi, time.sleep() vuole secondi. Mezzo secondo è delay(500) in C++ e time.sleep(0.5) in MicroPython. Se tieni a mente queste quattro regole, la maggior parte delle righe della tabella va a posto da sola.

  • I numeri nella tabella sono esempi: dove il blocco dice 13, il tuo progetto può usare 7, e il numero nella riga di codice cambia di conseguenza.
  • I pin nella colonna MicroPython sono numeri GP del Pico (GP14, GP15, GP26). Non devono coincidere con i pin dell’Uno; guarda lo schema.
  • Le righe con «Nessun blocco Pico» indicano che quel blocco non si usa nei progetti Pico; il codice MicroPython che fa lo stesso lavoro è comunque riportato.
  • Anche l’ESP32 si programma in Arduino C++; la colonna C++ vale anche per lui, cambiano solo l’intervallo analogico e alcuni numeri di pin.

Tabella di corrispondenza: blocchi, Arduino C++ e MicroPython

La tabella è divisa in 12 gruppi: struttura del programma, pin, tempo, condizione, ciclo, variabili, matematica, porta seriale, analogico e PWM, suono, servo e sensore. Il testo nella colonna Blocco è l’etichetta scritta sui blocchi nell’app; «…» e «?» indicano lo spazio in cui si innesta un altro blocco. Quando una riga contiene più blocchi, sono separati da un punto.

GruppoBlocco (etichetta nell’app)Arduino C++MicroPython (Pico)
Strutturasetup (una volta)void setup() { … }Le righe prima di while True:
Strutturaripeti per semprevoid loop() { … }while True: (contenuto rientrato di 4 spazi)
Strutturavariabili globali (all’inizio)Inizio del file, prima di setup()Le prime righe dopo gli import
Strutturaper blinkTwicevoid blinkTwice() { … } · chiamata: blinkTwice();def blinkTwice(): · chiamata: blinkTwice()
Pinimposta pin 13 come USCITApinMode(13, OUTPUT);led = Pin(15, Pin.OUT)
Pinimposta pin 2 come INGRESSO (PULLUP)pinMode(2, INPUT_PULLUP);btn = Pin(14, Pin.IN, Pin.PULL_UP)
Pinscrivi ALTO sul pin 13 · scrivi BASSO sul pin 13digitalWrite(13, HIGH); · digitalWrite(13, LOW);led.value(1) · led.value(0)
Pinleggi pin 2digitalRead(2) → HIGH (1) o LOW (0)btn.value() → 1 o 0
Pin (solo Pico)pin led : GP 14, USCITA · accendi (on) / spegni (off) il pin ledEquivale a pinMode() + digitalWrite()led = Pin(14, Pin.OUT) · led.on() / led.off()
Tempoattendi 1000 ms · attendi 0.5 secondi (Pico)delay(1000); · delay(500);time.sleep_ms(1000) · time.sleep(0.5)
Tempoattendi 10 µsdelayMicroseconds(10);time.sleep_us(10)
Tempoms dall’avviomillis() (unsigned long)time.ticks_ms()
Condizionese … fai … altrimenti se … altrimenti …if (…) { … } else if (…) { … } else { … }if …: · elif …: · else:
Condizione? = ? (≠, <, ≤, >, ≥)== != < <= > >=== != < <= > >=
Condizione? e ? · ? o ? · non ?&& · || · !xand · or · not x
Cicloripeti 3 volte faifor (int i = 0; i < 3; i++) { … }for i in range(3):
Cicloconta con i da 0 a 5 per 1for (i = 0; i <= 5; i++) (5 incluso, 6 giri)for i in range(0, 6): (6 escluso)
Cicloripeti mentrewhile (…) { … }while …:
Cicloesce dal ciclobreak;break
Variabilidichiara intero (int) delayTime = 60int delayTime = 60;delayTime = 60 (senza tipo)
Variabilidichiara decimale (float) voltage = 0.0float voltage = 0.0;voltage = 0.0
Variabiliimposta x a 0 · cambia x di 1x = 0; · x += 1; (oppure x++;)x = 0 · x += 1 (x++ non esiste)
Variabiliarray 2 3 4 · elemento 0 di ledPinsint ledPins[] = {2, 3, 4}; · ledPins[0]ledPins = [2, 3, 4] · ledPins[0]
Matematica1 + 1 (anche −, ×, ÷)+ - * / · con due int 7 / 2 = 3+ - * / · 7 / 2 = 3.5, divisione intera 7 // 2 = 3
Matematicaresto di 10 ÷ 310 % 310 % 3
Matematicamappa x : 0 – 1023 → 0 – 255map(x, 0, 1023, 0, 255)Non integrata; si scrive una funzione arduino_map()
Matematicacostringi 50 da 0 a 100constrain(50, 0, 100)min(max(50, 0), 100)
Porta serialeavvia seriale a 9600 baudSerial.begin(9600);Non serve, print() passa via USB
Porta serialestampa su seriale … a capo · stessa rigaSerial.println(x); · Serial.print(x);print(x) · print(x, end="")
Analogico e PWMlettura analogica A0analogRead(A0) → 0–1023 (0–4095 sull’ESP32)ADC(26).read_u16() → 0–65535
Analogico e PWMscrivi PWM 128 sul pin 9 · PWM led : GP 14, frequenza 1000 Hz (Pico)analogWrite(9, 128); (0–255)led = PWM(Pin(14)) · led.freq(1000) · led.duty_u16(32768) (0–65535)
Suonosuona 440 Hz sul pin 8 · ferma il suono sul pin 8tone(8, 440); · noTone(8);Nessun blocco Pico: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · stop: bz.duty_u16(0)
Servocollega il servo myServo al pin 9 · ruota il servo myServo a 90 gradi#include <Servo.h> · Servo myServo; · myServo.attach(9); · myServo.write(90);Nessun blocco Pico: s = PWM(Pin(16)) · s.freq(50) · s.duty_ns(1500000) (circa 90°)
Sensoredurata impulso ALTO sul pin 12 (µs)pulseIn(12, HIGH)machine.time_pulse_us(Pin(12, Pin.IN), 1)

Alcune righe sembrano corrispondenze dirette ma richiedono attenzione. In «conta con i da 0 a 5» il 5 è incluso e il ciclo fa 6 giri; per questo in C++ si scrive <= invece di <, e Python ha bisogno di range(0, 6), perché range esclude il numero finale. Anche il blocco della divisione è una trappola: dividendo due interi il C++ scarta i decimali e 7 / 2 dà 3, mentre Python dà 3.5. Per una divisione intera come in C++, in Python si usa //. La funzione map() dietro il blocco «mappa x» non è integrata in MicroPython; nell’esempio qui sotto una funzione arduino_map() di due righe fa lo stesso calcolo.

Ricalcola soglie e tensioni quando passi da Arduino al Pico. Una soglia di luce di 400 sull’Uno corrisponde a circa 25600 sul Pico (400 × 65535 / 1023). Il Pico lavora a 3,3 V: alimenta i partitori dei sensori dal pin 3V3(OUT) e non portare mai 5 V sui pin GPIO o ADC.

Come diventano codice i blocchi annidati?

Conoscere i singoli blocchi non basta; la vera abilità è trasformare blocchi annidati in una sola riga. Per farlo distingui due forme. I blocchi impilati uno sotto l’altro, con una tacca sul bordo, sono istruzioni e ognuno diventa una riga di codice. I blocchi ovali o appuntiti che si innestano nello spazio di un altro blocco sono valori; nel codice stanno tra parentesi, a destra di un segno uguale o dentro una condizione. Le righe qui sotto vengono dal progetto gratuito Impostazione della frequenza con cicalino: quattro pulsanti accendono e spengono il suono e ne alzano o abbassano la frequenza, che resta tra 50 e 5000 Hz.

Blocco (Impostazione della frequenza con cicalino)Riga C++Regola di lettura
imposta state a 1state = 1;Ogni blocco di istruzione impilato sotto un altro è una riga e finisce con un punto e virgola.
se (leggi pin btnOn = ALTO) fai …if (digitalRead(btnOn) == HIGH) { … }Un blocco valore ovale va tra le parentesi; il confronto = del blocco diventa == nel codice.
imposta frequency a (frequency + 50)frequency = frequency + 50;Il blocco interno si calcola per primo e il risultato passa al blocco esterno.
imposta frequency a (costringi frequency da 50 a 5000)frequency = constrain(frequency, 50, 5000);Gli spazi liberi di un blocco sono, nel codice, gli argomenti separati da virgole.
suona frequency Hz sul pin buzzerPintone(buzzerPin, frequency);Nel codice l’ordine è fisso: prima il pin, poi il valore. L’ordine delle parole del blocco cambia con la lingua.
se (state = 1) fai … altrimenti …if (state == 1) { … } else { … }I blocchi nella bocca «fai» vanno nella prima { }, quelli nella bocca «altrimenti» in else { }.

Prendi un’abitudine mentre leggi questa tabella: traduci prima il blocco più interno, poi procedi verso l’esterno. In «imposta frequency a (costringi frequency da 50 a 5000)» la parte più interna è constrain(frequency, 50, 5000), e il blocco imposta esterno la trasforma in frequency = …. Un blocco valore non può essere una riga da solo; se lo lasci con un punto e virgola, il compilatore forse non si lamenta, ma il risultato non viene salvato da nessuna parte.

Errori comuni nel passaggio dai blocchi al codice

L’editor a blocchi non ti lascia fare la maggior parte di questi errori; la forma dei pezzi impedisce che si incastrino nel posto sbagliato. Nel codice questa protezione sparisce, quindi quasi tutti incontrano gli errori qui sotto nelle prime settimane. I messaggi di errore arrivano in inglese, ma gli schemi sono pochi e, dopo averli visti un paio di volte, li riconoscerai.

ErroreSintomoSoluzione
Manca il punto e virgola a fine riga«expected ';' before …»; il compilatore spesso indica la riga sottoChiudi ogni istruzione con ;. Non mettere ; dopo le righe if, for e while.
Graffa mancante o di troppo«expected '}' at end of input» o codice che gira nel punto sbagliatoOgni { vuole la sua }. Ctrl+T (formattazione automatica) nell’Arduino IDE sistema i rientri e una graffa mancante salta all’occhio.
Scrivere = in una condizioneif (state = 1) è sempre vera e in più porta state a 1; SyntaxError in PythonConfronta con ==, assegna con =. Il confronto = di un blocco nel codice è sempre ==.
Mettere un decimale in un intint volt = 3.7; salva 3; 5 / 2 dà 2Usa float per i decimali e in una divisione scrivi un numero come 5.0.
Aspettarsi un valore sbagliato da digitalReadif (digitalRead(2) == 5) non scatta mai; con un pulsante in pull-up la logica è invertitadigitalRead restituisce solo HIGH (1) o LOW (0). Con INPUT_PULLUP un pulsante premuto legge LOW.
Confondere maiuscole e minuscole'digitalwrite' was not declared in this scope; NameError in PythondigitalWrite, pinMode e Serial si scrivono esattamente così. In Python True e False iniziano con la maiuscola.
Tradurre un ciclo di conteggio con un giro in menoUn ciclo che fa 6 giri nei blocchi ne fa 5 nel codice; l’ultimo LED non si accende mai«da 0 a 5» include la fine: i <= 5 in C++, range(0, 6) in Python.
Sfalsare i rientri in PythonIndentationError o una riga che resta fuori dal cicloInizia ogni riga sotto while e if con gli stessi 4 spazi; non mescolare tabulazioni e spazi.
Scambiare il tempo di Python per milliseconditime.sleep(500) aspetta più di 8 minutiScrivi time.sleep(0.5) oppure time.sleep_ms(500).
Portare abitudini del C++ in PythonSyntaxError per x++, && o un ; a fine rigaPython usa x += 1, and, or; non c’è un segno di fine riga.
Quando il compilatore indica una riga, guarda sempre anche quella sopra. Un punto e virgola mancante o una parentesi non chiusa spesso viene segnalato una riga sotto il problema vero. Se compaiono più errori insieme, correggi solo il primo e ricompila; gli altri sono spesso echi del primo.

Lasciarsi alle spalle i blocchi: metodo in 4 passi

Cercare di cambiare tutto in una volta è faticoso. I quattro passi qui sotto vanno dalla lettura alla scrittura a piccoli passi. Uno o due progetti per passo bastano; sei pronto per il successivo quando riesci a fare quello attuale senza guardare la tabella.

  1. Leggi fianco a fianco. Apri insieme i blocchi e il codice di un progetto e abbina con il dito ogni blocco alla sua riga di codice. In questo passo tieni sempre la tabella accanto. Obiettivo: saper collegare ogni riga di codice a un blocco.
  2. Nascondi i blocchi e indovina. Guarda prima i blocchi, poi disattiva la vista a blocchi e scrivi su carta il C++ di quei blocchi senza guardare il codice. Poi confronta con il codice vero. Prova anche al contrario: leggi il codice e indovina i blocchi.
  3. Cambia un valore nel codice. Porta il codice sul computer e cambia un solo numero: porta l’attesa da 100 a 500 o la soglia da 400 a 600. Caricalo e guarda la differenza con i tuoi occhi. Se compare un errore di compilazione, torna alla tabella degli errori qui sopra.
  4. Scrivi una riga nuova. Aggiungi una riga che nei blocchi non c’è: un Serial.println() che mostra il valore nel monitor seriale, un secondo LED o un if che funziona con un pulsante. Ora non traduci più blocchi, scrivi codice direttamente.

Ogni passo ha la sua lezione nella serie. Per il primo, la tabella blocco-riga dell’articolo accendere un LED a blocchi è un buon inizio. Per condizioni e cicli nei passi due e tre, leggi il blocco se e cicli e variabili. Se passi a MicroPython con il Pico, dai blocchi a MicroPython spiega anche come installare Thonny. Se vuoi distribuire il passaggio su più settimane di lezione, il piano di robotica di 8 settimane offre un ordine già pronto.

Aprire blocchi e codice fianco a fianco nell’app BlueGrays

Userai questa tabella soprattutto passando avanti e indietro tra i blocchi e il codice di un progetto vero. L’app BlueGrays ha la vista a blocchi in oltre 100 progetti; in più di 30 progetti gratuiti anche i blocchi sono aperti, mentre nei progetti Premium i blocchi si sbloccano con Premium. I blocchi servono per leggere: nell’app i blocchi non si modificano e non vengono caricati sulla scheda. Sulla scheda va sempre il codice vero; lo prendi con Copia, oppure con Copia link per aprirlo sul computer, e lo incolli nell’Arduino IDE o, per il Pico, in Thonny.

  • Mostra a blocchi: attiva questo interruttore accanto al codice sorgente nella pagina di un progetto e lo stesso programma compare come immagine a blocchi nella lingua dell’app. Tocca l’immagine per aprirla a schermo intero; attivarlo e disattivarlo è proprio l’esercizio dei passi uno e due.
  • Capire i blocchi: con la vista a blocchi attiva, la scheda «Capire il codice» prende questo nome. Il programma è diviso in passi, ognuno con la sua parte e una spiegazione. Il compito «Prova tu» alla fine è un esercizio già pronto per il passo quattro.
  • Guida al codice: ognuna delle 36 schede della sezione Impara (18 Arduino C++, 18 MicroPython) mostra il suo esempio in tre forme con le schede Blocchi, Arduino e MicroPython. Se vuoi vedere una riga della tabella più nel dettaglio, apri la scheda corrispondente.
  • Progetti a blocchi: questa opzione in Filtra di Scopri > Progetti, elenca solo i progetti con la vista a blocchi e ti aiuta a scegliere un progetto per il passaggio.

Abbiamo spiegato come funziona la guida al codice nell’articolo sulla guida al codice, e le sezioni «Capire il codice» e «Prova tu» nella guida a Capire il codice. Per i singoli comandi spiegati uno a uno, l’elenco dei comandi Arduino si abbina bene a questa tabella.

Un programma in tre forme: luce notturna che si regola con la luce

Per vedere la tabella all’opera costruiamo un piccolo programma. Un LDR misura la luce; finché la stanza è illuminata il LED resta spento, e man mano che si fa buio il LED si accende piano piano. Il programma usa blocchi di variabile, lettura analogica, condizione, mappatura, PWM, porta seriale e attesa: più di metà della tabella compare in un solo esempio. L’idea si basa sul progetto gratuito Luce notturna con LDR; lì il LED è solo acceso o spento, qui il PWM lo regola. Per il collegamento dell’LDR puoi guardare anche lo schema del progetto Misurare l'intensità luminosa con LDR.

CollegamentoArduino UnoRaspberry Pi Pico
Piedino 1 dell’LDR5V3V3(OUT), pin fisico 36
Piedino 2 dell’LDR + un capo della resistenza da 10 kΩ (punto centrale)A0GP26 / ADC0, pin fisico 31
Altro capo della resistenza da 10 kΩGNDGND, pin fisico 38
Piedino lungo del LED (tramite una resistenza da 220 Ω)D9 (pin PWM)GP15, pin fisico 20
Piedino corto del LEDGNDGND, pin fisico 18
Lettura della luce / intervallo PWM0–1023 / 0–2550–65535 / 0–65535

Prima la versione a blocchi. Con le etichette dell’app, il programma è formato da questi blocchi; ogni voce corrisponde a una o più righe del codice C++ che segue:

  1. variabili globali (all’inizio): dichiara intero (int) lightValue = 0 e dichiara intero (int) brightness = 0
  2. setup (una volta): avvia seriale a 9600 baud, poi imposta pin 9 come USCITA
  3. ripeti per sempre: imposta lightValue a (lettura analogica A0)
  4. se (lightValue < 400) fai: imposta brightness a (mappa lightValue : 0 – 400 → 255 – 0); altrimenti: imposta brightness a 0
  5. scrivi PWM brightness sul pin 9
  6. stampa su seriale «Light: » stessa riga, stampa su seriale lightValue stessa riga, stampa su seriale « PWM: » stessa riga, stampa su seriale brightness a capo
  7. attendi 200 ms
C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Işığa göre kısılan gece lambası / Dimming night light
4// ─────────────────────────────────────────
5
6int lightValue = 0;   // LDR okuması / LDR reading (0-1023)
7int brightness = 0;   // LED parlaklığı / LED brightness (0-255)
8
9void setup() {
10  Serial.begin(9600);   // Seri port 9600 baud / Serial at 9600 baud
11  pinMode(9, OUTPUT);   // LED, PWM pini D9 / LED on PWM pin D9
12}
13
14void loop() {
15  lightValue = analogRead(A0);   // Az ışık = küçük değer / Little light = small value
16
17  if (lightValue < 400) {
18    // Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
19    brightness = map(lightValue, 0, 400, 255, 0);
20  } else {
21    brightness = 0;   // Oda aydınlık, LED kapalı / Room is bright, LED off
22  }
23
24  analogWrite(9, brightness);   // PWM 0-255 / PWM 0-255
25
26  Serial.print("Light: ");
27  Serial.print(lightValue);
28  Serial.print("  PWM: ");
29  Serial.println(brightness);
30
31  delay(200);   // 0,2 sn bekle / Wait 0.2 s
32}
33
MicroPython
1# ─────────────────────────────────────────
2#   BlueGrays · bluegrays.com
3#   Işığa göre kısılan gece lambası / Dimming night light
4# ─────────────────────────────────────────
5from machine import Pin, ADC, PWM
6import time
7
8ldr = ADC(26)                # GP26 = ADC0 / GP26 = ADC0
9led = PWM(Pin(15))           # LED, GP15 / LED on GP15
10led.freq(1000)               # PWM frekansı 1000 Hz / PWM frequency 1000 Hz
11
12THRESHOLD = 25600            # Uno'daki 400'ün karşılığı / Same as 400 on the Uno
13
14
15def arduino_map(x, in_min, in_max, out_min, out_max):
16    # Arduino map() ile aynı hesap / Same math as Arduino map()
17    return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
18
19
20while True:
21    light_value = ldr.read_u16()          # 0-65535 / 0-65535
22
23    if light_value < THRESHOLD:
24        # Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
25        brightness = arduino_map(light_value, 0, THRESHOLD, 65535, 0)
26    else:
27        brightness = 0                    # Oda aydınlık, LED kapalı / Room is bright, LED off
28
29    led.duty_u16(brightness)              # PWM 0-65535 / PWM 0-65535
30
31    print("Light:", light_value, " PWM:", brightness)
32
33    time.sleep(0.2)                       # 0,2 sn bekle / Wait 0.2 s
34

Confrontando i due programmi riga per riga emergono tutte le differenze della tabella. Il setup() del C++ diventa in Python le righe prima di while True, e Serial.begin() sparisce. analogRead(A0) diventa ADC(26).read_u16() e l’intervallo passa da 0–1023 a 0–65535, per questo la soglia è 25600 invece di 400. Al posto di analogWrite(9, …) si crea prima un oggetto PWM e la luminosità si imposta con duty_u16() tra 0 e 65535. Poiché map() non è integrata, si scrive una funzione arduino_map(); la divisione intera // al suo interno corrisponde alla divisione intera del C++. Un solo print() sostituisce quattro Serial.print(), e delay(200) diventa time.sleep(0.2).

Prova subito il passo tre con questo esempio: sull’Uno porta la soglia da 400 a 600, così il LED inizia ad accendersi prima. Per fare la stessa modifica sul Pico, imposta THRESHOLD a circa 38400. Osserva il valore Light nel monitor seriale (9600 baud) o nella shell di Thonny per trovare la soglia giusta per la tua stanza.

Passare dai blocchi al codice Arduino C++ significa meno imparare a memoria qualcosa di nuovo e più riconoscere la forma scritta di blocchi che già conosci. Tieni questa tabella accanto, in ogni progetto leggi prima fianco a fianco, poi nascondi i blocchi e scrivi da solo. Se vuoi vedere queste righe in progetti veri, apri nell’app BlueGrays un progetto con la vista a blocchi e passa tra le due forme dello stesso programma con Mostra a blocchi.

Domande frequenti

Cosa imparare dopo la programmazione a blocchi: C++ o Python?

Scegli in base alla scheda che hai. La maggior parte dei progetti con Arduino Uno ed ESP32 è scritta in Arduino C++, mentre sul Raspberry Pi Pico è diffuso MicroPython. La logica dei blocchi è la stessa in entrambi, quindi quando ne conosci uno passare all’altro richiede molto meno tempo.

Quanto tempo serve per passare dai blocchi al codice Arduino?

Dipende dalla persona, ma chi lavora con regolarità su qualche progetto a settimana di solito riesce a leggere programmi brevi e a fare piccole modifiche in poche settimane. Leggere prima il codice accanto ai blocchi, poi cambiare un solo valore e infine aggiungere righe nuove rende il passaggio più semplice.

Posso programmare un Arduino Uno con Python?

L’Arduino Uno non può eseguire MicroPython; si programma in C++ con l’Arduino IDE. Per MicroPython serve una scheda più potente come il Raspberry Pi Pico. Puoi però inviare comandi a un Uno tramite la porta seriale da un programma Python che gira sul computer.

Posso modificare i blocchi in BlueGrays e caricarli sulla scheda?

No. I blocchi di BlueGrays servono a leggere e capire il codice; nell’app i blocchi non si modificano e non vengono caricati sulla scheda. Quello che carichi è sempre il codice vero del progetto, con l’Arduino IDE o con Thonny.

Un programma a blocchi è codice vero?

I blocchi sono la forma visiva del codice vero; ogni blocco corrisponde a una o più righe di codice. Nei progetti BlueGrays con la vista a blocchi, i blocchi e il codice Arduino C++ o MicroPython che carichi descrivono lo stesso programma.

Perché digitalRead restituisce 1 o 0, e HIGH è uguale a 1?

Sì, su Arduino HIGH vale 1 e LOW vale 0, e digitalRead restituisce solo uno di questi due valori. Un pulsante collegato con INPUT_PULLUP legge LOW quando è premuto e HIGH quando è rilasciato. In MicroPython anche pin.value() restituisce 1 o 0.

Vedi tutti i progetti
Impostazione della frequenza con cicalino
#14Intermedio

Impostazione della frequenza con cicalino

Comandi il suono di un buzzer con quattro pulsanti: uno avvia il suono, uno lo zittisce e gli altri due lo rendono più acuto o più grave. Tieni premuto il pulsante su o giù e il tono cambia passo dopo

4.6(69)
118
Luce notturna con LDR
#12Principiante

Luce notturna con LDR

Una piccola luce notturna che si accende da sola quando fa buio e si spegne quando arriva il mattino. Un sensore di luce misura quanto è illuminata la stanza, e l'Arduino accende il LED quando è abbas

4.8(102)
205
Misurare l'intensità luminosa con LDR
#11Principiante

Misurare l'intensità luminosa con LDR

Vuoi vedere quanto è luminosa la tua stanza sotto forma di numero? L'LDR, un piccolo componente sensibile alla luce, misura la luce ambiente e l'Arduino scrive il valore sullo schermo del computer ogn

4.6(81)
139
Accendere un LED con un pulsante (Push)
#9Principiante

Accendere un LED con un pulsante (Push)

Come un campanello: la luce resta accesa finché premi e si spegne quando lasci. L'Arduino ascolta il pulsante di continuo; mentre è premuto accende il LED, e appena togli il dito lo spegne. Con questo

4.8(113)
229
Accendere e spegnere un LED con un pulsante
#10Principiante

Accendere e spegnere un LED con un pulsante

Premi il pulsante una volta e la luce si accende, premilo di nuovo e si spegne, proprio come l'interruttore della tua stanza. L'Arduino si accorge di ogni pressione e porta il LED nello stato opposto,

4.8(100)
167
LED in sequenza a velocità regolabile
#7Intermedio

LED in sequenza a velocità regolabile

Sei LED si accendono uno dopo l'altro e la luce sembra correre da un'estremità all'altra. Girando la manopola del potenziometro la velocità di questa corsa cambia all'istante: da un lato la luce vola,

4.6(72)
146
HC-SR04 Misura della distanza (display seriale)
#27Principiante

HC-SR04 Misura della distanza (display seriale)

Il sensore HC-SR04 funziona come un pipistrello che trova la strada al buio: manda un suono che non puoi sentire, ne ascolta l'eco e misura quanto è lontano l'oggetto davanti a sé. L'Arduino scrive qu

4.6(46)
71
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