Grafico con Arduino e Processing usando un potenziometro
Leggiamo un valore analogico con Arduino, lo inviamo al PC tramite porta seriale e lo trasformiamo in un grafico in tempo reale con Processing.
Cosa imparerai
- come leggere un ingresso analogico;
- come inviare dati con
Serial.println(); - come leggere la porta seriale da Processing;
- come convertire una stringa seriale in un numero;
- come usare
map()per adattare i valori all’altezza del grafico; - come sostituire il potenziometro con altri sensori analogici.
Come funziona il progetto
In questo progetto Arduino invia al computer i valori del potenziometro, compresi indicativamente tra 0 e 1023. Processing riceve ogni valore terminato da un carattere di nuova riga e lo rappresenta graficamente.
Esempio del grafico realizzato con Arduino e Processing.
Materiale necessario
🧰 Kit Arduino consigliato
Molti progetti del sito utilizzano potenziometri, breadboard, cavetti e componenti di base. Un kit completo può essere comodo per iniziare.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Software necessario
Oltre all’Arduino IDE serve Processing, usato per leggere la seriale e disegnare il grafico.
👉 Vai alla pagina di ProcessingSchema del circuito
schema del potenziometro collegato ad Arduino.
Collegamento del potenziometro
| Pin potenziometro | Collegamento |
|---|---|
| Estremo 1 | 5 V |
| Centrale / cursore | A0 |
| Estremo 2 | GND |
Codice Arduino commentato
// ==========================================================
// ARDUINO + PROCESSING
// Invio di un valore analogico via seriale
// ==========================================================
void setup() {
// Avvia la comunicazione seriale a 9600 baud.
// Processing dovrà usare la stessa velocità.
Serial.begin(9600);
}
void loop() {
// Legge il potenziometro collegato ad A0.
// Su Arduino Uno il valore è normalmente 0...1023.
int valore = analogRead(A0);
// Invia il valore seguito da un carattere di nuova riga.
// Processing userà '\n' per capire quando una misura è completa.
Serial.println(valore);
// Piccola pausa tra una misura e la successiva.
delay(2);
}
Codice Processing commentato
import processing.serial.*;
// Porta seriale usata per comunicare con Arduino
Serial myPort;
// Posizione orizzontale corrente del grafico
int xPos = 1;
// Valore ricevuto dalla seriale
float inByte = 0;
void setup() {
// Dimensione della finestra del grafico
size(400, 300);
// Mostra nell'area console tutte le porte seriali disponibili.
// Serve per individuare quella usata da Arduino.
println(Serial.list());
// Apre la prima porta dell'elenco a 9600 baud.
// Se Arduino non è sulla porta [0], modifica l'indice.
myPort = new Serial(this, Serial.list()[0], 9600);
// Genera serialEvent() solo quando arriva '\n'
myPort.bufferUntil('\n');
// Sfondo nero iniziale
background(0);
}
void draw() {
// Disegna una linea verticale proporzionale
// al valore ricevuto dalla seriale.
stroke(127, 34, 255);
line(xPos, height, xPos, height - inByte);
// Quando raggiunge il bordo destro,
// riparte da sinistra e pulisce il grafico.
if (xPos >= width) {
xPos = 0;
background(0);
}
else {
xPos++;
}
}
void serialEvent(Serial myPort) {
// Legge una riga completa dalla seriale
String inString = myPort.readStringUntil('\n');
if (inString != null) {
// Elimina spazi e caratteri superflui
inString = trim(inString);
// Converte la stringa ricevuta in numero
inByte = float(inString);
// Mostra il valore nella console
println(inByte);
// Converte 0...1023 nell'altezza
// disponibile nella finestra del grafico.
inByte = map(inByte, 0, 1023, 0, height);
}
}
Come lavorano insieme Arduino e Processing
| Arduino | Processing |
|---|---|
| Legge A0 | Attende dati seriali |
| Invia un numero con Serial.println() | Riceve una riga completa |
| Trasmette a 9600 baud | Apre la porta a 9600 baud |
| Produce valori 0–1023 | Li converte nell’altezza del grafico |
La scelta della porta seriale
Nel codice Processing apre Serial.list()[0]. Questo funziona solo se Arduino è effettivamente la prima porta dell’elenco.
La riga println(Serial.list()); serve proprio per vedere le porte disponibili. Se Arduino compare, per esempio, come terza voce, dovrai usare Serial.list()[2].
Risultato del progetto
Esempio dell’output grafico visualizzato in Processing.
Usare altri sensori
Il potenziometro è soltanto il modo più semplice per generare un valore analogico variabile. Lo stesso principio può essere utilizzato con molti sensori analogici.
- fotoresistenza LDR;
- sensore di temperatura analogico;
- sensore di pressione;
- sensore di luce;
- joystick;
- sensori di umidità o livello con uscita analogica.
Velocità di aggiornamento
Nello sketch Arduino il tempo tra due misure è controllato da delay(2). Aumentando questo valore il grafico si aggiorna più lentamente; diminuendolo arrivano più campioni in un secondo.
Per applicazioni più evolute è possibile sostituire delay() con una temporizzazione tramite millis() o micros().
Scarica i file originali
⬇️ Processing: arduino_processing.pde
⬇️ Arduino: arduinograficoprocessing.ino
Debug rapido
- controlla che il cursore del potenziometro sia collegato ad A0;
- verifica che Arduino e Processing usino entrambi 9600 baud;
- controlla quale indice di
Serial.list()corrisponde ad Arduino; - chiudi il Monitor Seriale prima di avviare Processing;
- se il grafico rimane fermo, verifica che Arduino stia realmente inviando dati;
- se Processing segnala porta occupata, chiudi eventuali programmi che la stanno usando.
Varianti del progetto
- visualizzare più sensori contemporaneamente;
- disegnare una linea continua invece di barre verticali;
- aggiungere scala e griglia;
- mostrare anche il valore numerico;
- salvare i campioni su file;
- aggiungere pulsanti nell’interfaccia Processing per inviare comandi ad Arduino.
Cosa devi ricordare
- Arduino acquisisce il dato analogico.
Serial.println()invia ogni misura al PC.- Processing legge la porta seriale e interpreta ogni riga.
map()adatta il valore 0–1023 all’altezza del grafico.- La porta seriale scelta in Processing deve essere quella di Arduino.
- Lo stesso sistema può rappresentare molti altri sensori analogici.
Domande frequenti
Perché Processing non trova Arduino?
Controlla l’elenco prodotto da Serial.list() e modifica l’indice usato in Serial.list()[0].
Posso usare il Monitor Seriale insieme a Processing?
Normalmente no sulla stessa porta seriale, perché un solo programma alla volta può aprirla.
Posso usare un sensore al posto del potenziometro?
Sì. Se il sensore fornisce un’uscita analogica compatibile con Arduino, puoi inviare il suo valore allo stesso modo.
Posso visualizzare due sensori contemporaneamente?
Sì, ma devi definire un formato seriale che contenga più valori e modificare lo sketch Processing per separarli e disegnarli.

