🚀 Introduzione
Vuoi osservare l’andamento dei sensori sotto forma di grafico, senza utilizzare un display esterno? 📈💻
In questo progetto utilizzerai il Serial Plotter dell’Arduino IDE per visualizzare in tempo reale temperatura, umidità e luminosità ambientale.
Arduino leggerà i dati da un sensore DHT22 e da una fotoresistenza, applicherà un piccolo filtro alle misurazioni e invierà i valori al computer attraverso la porta USB.
👉 Il Serial Plotter trasforma automaticamente i numeri ricevuti in linee grafiche, permettendo di osservare variazioni, picchi e tendenze.
Vuoi osservare l’andamento dei sensori sotto forma di grafico, senza utilizzare un display esterno? 📈💻
In questo progetto utilizzerai il Serial Plotter dell’Arduino IDE per visualizzare in tempo reale temperatura, umidità e luminosità ambientale.
Arduino leggerà i dati da un sensore DHT22 e da una fotoresistenza, applicherà un piccolo filtro alle misurazioni e invierà i valori al computer attraverso la porta USB.
👉 Il Serial Plotter trasforma automaticamente i numeri ricevuti in linee grafiche, permettendo di osservare variazioni, picchi e tendenze.
🎯 Cosa realizzerai
Con Arduino creerai un sistema che:
Con Arduino creerai un sistema che:
- 🌡️ misura la temperatura ambientale;
- 💧 misura l’umidità relativa;
- 💡 rileva il livello di luminosità;
- 📉 filtra il rumore della fotoresistenza;
- 💻 invia i dati al computer;
- 📊 visualizza tre grafici contemporaneamente;
- 🔄 aggiorna automaticamente le misurazioni;
- ⚠️ segnala gli errori del sensore DHT22;
- ⏱️ utilizza millis() senza bloccare Arduino;
- 🧮 converte i valori in scale facilmente confrontabili.
🧰 Materiale necessario
Il cavo USB viene utilizzato sia per alimentare Arduino sia per inviare i dati al Serial Plotter.
- 1x Arduino UNO;
- 1x sensore DHT22;
- 1x resistenza da 10 kΩ, se utilizzi il DHT22 senza modulo;
- 1x fotoresistenza LDR;
- 1x resistenza da 10 kΩ per il partitore;
- cavetti jumper;
- breadboard;
- cavo USB;
- computer con Arduino IDE.
Il cavo USB viene utilizzato sia per alimentare Arduino sia per inviare i dati al Serial Plotter.
🛒 Non hai ancora i componenti?
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 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 Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 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 Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
📚 Librerie necessarie
Per utilizzare il sensore DHT22 devi installare:
Per installarle:
Per il Serial Plotter non è necessaria alcuna libreria aggiuntiva.
Per utilizzare il sensore DHT22 devi installare:
- DHT sensor library;
- Adafruit Unified Sensor.
Per installarle:
- apri Arduino IDE;
- seleziona Sketch → Include Library → Manage Libraries;
- cerca DHT sensor library;
- installa la libreria sviluppata da Adafruit;
- installa anche Adafruit Unified Sensor quando richiesto.
Per il Serial Plotter non è necessaria alcuna libreria aggiuntiva.
🔌 Schema di collegamento
Sensore DHT22
Se utilizzi un modulo DHT22 già assemblato:
Se utilizzi il sensore senza modulo:
Fotoresistenza LDR
Realizza un partitore di tensione:
Sensore DHT22
Se utilizzi un modulo DHT22 già assemblato:
- VCC → 5V;
- GND → GND;
- DATA → pin digitale 2.
Se utilizzi il sensore senza modulo:
- pin 1 VCC → 5V;
- pin 2 DATA → pin digitale 2;
- pin 3 → non collegato;
- pin 4 GND → GND;
- resistenza da 10 kΩ tra DATA e 5V.
Fotoresistenza LDR
Realizza un partitore di tensione:
- un terminale della fotoresistenza → 5V;
- terminale opposto → A0;
- resistenza da 10 kΩ tra A0 e GND.
💻 Codice Arduino
Il programma invia al computer tre valori:
Ogni dato viene preceduto da un’etichetta:
Temperatura:23.4
Umidita:51.0
Luminosita:67
Le misurazioni vengono separate tramite tabulazioni e terminate con un ritorno a capo.
Questo formato permette al Serial Plotter di riconoscere automaticamente le tre serie di dati.
Il programma invia al computer tre valori:
- temperatura;
- umidità;
- luminosità.
Ogni dato viene preceduto da un’etichetta:
Temperatura:23.4
Umidita:51.0
Luminosita:67
Le misurazioni vengono separate tramite tabulazioni e terminate con un ritorno a capo.
Questo formato permette al Serial Plotter di riconoscere automaticamente le tre serie di dati.
/*
============================================================
Progetto 137 - Visualizzazione dati con Serial Plotter
Mostra temperatura, umidita e luminosita in tempo reale
============================================================
*/
#include <DHT.h>
// Configurazione del sensore DHT22
#define PIN_DHT 2
#define TIPO_DHT DHT22
// Pin analogico collegato alla fotoresistenza
#define PIN_LUCE A0
// Intervallo tra due aggiornamenti.
// Il DHT22 non deve essere interrogato troppo velocemente.
const unsigned long INTERVALLO_LETTURA = 2000;
// Numero di campioni utilizzati per filtrare
// la lettura della fotoresistenza
const byte NUMERO_CAMPIONI = 20;
// Oggetto utilizzato per controllare il DHT22
DHT dht(PIN_DHT, TIPO_DHT);
// Ultimi valori ambientali validi
float temperatura = 0.0;
float umidita = 0.0;
int luminositaPercentuale = 0;
// Indica se l'ultima lettura del DHT22 è valida
bool sensoreDhtValido = false;
// Memorizza il momento dell'ultimo aggiornamento
unsigned long ultimaLettura = 0;
void setup() {
// Avvia la comunicazione seriale.
// La stessa velocità deve essere selezionata
// anche nella finestra del Serial Plotter.
Serial.begin(115200);
// Avvia il sensore DHT22
dht.begin();
// Attende brevemente la stabilizzazione del sensore
delay(1000);
// Esegue subito una prima acquisizione
leggiSensori();
inviaDatiSeriali();
ultimaLettura = millis();
}
void loop() {
// Esegue una nuova lettura quando è trascorso
// l'intervallo previsto, senza usare delay()
if (millis() - ultimaLettura >= INTERVALLO_LETTURA) {
ultimaLettura = millis();
leggiSensori();
inviaDatiSeriali();
}
}
void leggiSensori() {
// Legge temperatura e umidità dal DHT22
float nuovaTemperatura = dht.readTemperature();
float nuovaUmidita = dht.readHumidity();
// Aggiorna i valori soltanto quando
// entrambe le letture sono valide
if (!isnan(nuovaTemperatura) &&
!isnan(nuovaUmidita)) {
temperatura = nuovaTemperatura;
umidita = nuovaUmidita;
sensoreDhtValido = true;
} else {
// In caso di errore conserva gli ultimi dati validi
// e segnala il problema attraverso una serie dedicata
sensoreDhtValido = false;
}
// Acquisisce una lettura filtrata della fotoresistenza
int valoreLuce = leggiLuceFiltrata();
// Converte il valore analogico in una percentuale
luminositaPercentuale = map(
valoreLuce,
0,
1023,
0,
100
);
// Mantiene il risultato tra 0 e 100
luminositaPercentuale = constrain(
luminositaPercentuale,
0,
100
);
}
int leggiLuceFiltrata() {
unsigned long somma = 0;
// Esegue più letture ravvicinate
// per ridurre oscillazioni e rumore
for (byte i = 0; i < NUMERO_CAMPIONI; i++) {
somma += analogRead(PIN_LUCE);
// Breve pausa necessaria alla stabilizzazione dell'ADC
delayMicroseconds(200);
}
// Restituisce la media dei campioni acquisiti
return somma / NUMERO_CAMPIONI;
}
void inviaDatiSeriali() {
/*
Ogni serie utilizza il formato:
Etichetta:valore
Le serie vengono separate con una tabulazione.
println() termina il gruppo di dati e permette
al Serial Plotter di disegnare un nuovo punto.
*/
Serial.print("Temperatura:");
Serial.print(temperatura, 1);
Serial.print('\t');
Serial.print("Umidita:");
Serial.print(umidita, 1);
Serial.print('\t');
Serial.print("Luminosita:");
Serial.print(luminositaPercentuale);
Serial.print('\t');
// Invia 1 quando il DHT22 funziona
// e 0 quando l'ultima lettura è fallita
Serial.print("StatoDHT:");
if (sensoreDhtValido) {
Serial.println(1);
} else {
Serial.println(0);
}
}
============================================================
Progetto 137 - Visualizzazione dati con Serial Plotter
Mostra temperatura, umidita e luminosita in tempo reale
============================================================
*/
#include <DHT.h>
// Configurazione del sensore DHT22
#define PIN_DHT 2
#define TIPO_DHT DHT22
// Pin analogico collegato alla fotoresistenza
#define PIN_LUCE A0
// Intervallo tra due aggiornamenti.
// Il DHT22 non deve essere interrogato troppo velocemente.
const unsigned long INTERVALLO_LETTURA = 2000;
// Numero di campioni utilizzati per filtrare
// la lettura della fotoresistenza
const byte NUMERO_CAMPIONI = 20;
// Oggetto utilizzato per controllare il DHT22
DHT dht(PIN_DHT, TIPO_DHT);
// Ultimi valori ambientali validi
float temperatura = 0.0;
float umidita = 0.0;
int luminositaPercentuale = 0;
// Indica se l'ultima lettura del DHT22 è valida
bool sensoreDhtValido = false;
// Memorizza il momento dell'ultimo aggiornamento
unsigned long ultimaLettura = 0;
void setup() {
// Avvia la comunicazione seriale.
// La stessa velocità deve essere selezionata
// anche nella finestra del Serial Plotter.
Serial.begin(115200);
// Avvia il sensore DHT22
dht.begin();
// Attende brevemente la stabilizzazione del sensore
delay(1000);
// Esegue subito una prima acquisizione
leggiSensori();
inviaDatiSeriali();
ultimaLettura = millis();
}
void loop() {
// Esegue una nuova lettura quando è trascorso
// l'intervallo previsto, senza usare delay()
if (millis() - ultimaLettura >= INTERVALLO_LETTURA) {
ultimaLettura = millis();
leggiSensori();
inviaDatiSeriali();
}
}
void leggiSensori() {
// Legge temperatura e umidità dal DHT22
float nuovaTemperatura = dht.readTemperature();
float nuovaUmidita = dht.readHumidity();
// Aggiorna i valori soltanto quando
// entrambe le letture sono valide
if (!isnan(nuovaTemperatura) &&
!isnan(nuovaUmidita)) {
temperatura = nuovaTemperatura;
umidita = nuovaUmidita;
sensoreDhtValido = true;
} else {
// In caso di errore conserva gli ultimi dati validi
// e segnala il problema attraverso una serie dedicata
sensoreDhtValido = false;
}
// Acquisisce una lettura filtrata della fotoresistenza
int valoreLuce = leggiLuceFiltrata();
// Converte il valore analogico in una percentuale
luminositaPercentuale = map(
valoreLuce,
0,
1023,
0,
100
);
// Mantiene il risultato tra 0 e 100
luminositaPercentuale = constrain(
luminositaPercentuale,
0,
100
);
}
int leggiLuceFiltrata() {
unsigned long somma = 0;
// Esegue più letture ravvicinate
// per ridurre oscillazioni e rumore
for (byte i = 0; i < NUMERO_CAMPIONI; i++) {
somma += analogRead(PIN_LUCE);
// Breve pausa necessaria alla stabilizzazione dell'ADC
delayMicroseconds(200);
}
// Restituisce la media dei campioni acquisiti
return somma / NUMERO_CAMPIONI;
}
void inviaDatiSeriali() {
/*
Ogni serie utilizza il formato:
Etichetta:valore
Le serie vengono separate con una tabulazione.
println() termina il gruppo di dati e permette
al Serial Plotter di disegnare un nuovo punto.
*/
Serial.print("Temperatura:");
Serial.print(temperatura, 1);
Serial.print('\t');
Serial.print("Umidita:");
Serial.print(umidita, 1);
Serial.print('\t');
Serial.print("Luminosita:");
Serial.print(luminositaPercentuale);
Serial.print('\t');
// Invia 1 quando il DHT22 funziona
// e 0 quando l'ultima lettura è fallita
Serial.print("StatoDHT:");
if (sensoreDhtValido) {
Serial.println(1);
} else {
Serial.println(0);
}
}
Apri il Serial Plotter impostando 115200 baud. Vedrai quattro linee: temperatura, umidità, luminosità e stato del DHT22.
⚙️ Come funziona
Arduino legge temperatura e umidità dal sensore DHT22 ogni due secondi.
La fotoresistenza viene letta più volte e i risultati vengono mediati per ridurre il rumore.
I valori vengono quindi inviati alla porta seriale con questa struttura:
Serial.print("Temperatura:");
Serial.print(temperatura);
Serial.print('\t');
Serial.print("Umidita:");
Serial.print(umidita);
Serial.print('\t');
Serial.print("Luminosita:");
Serial.println(luminosita);
La tabulazione \t separa le diverse serie.
Serial.println() termina la riga e indica al Serial Plotter che il gruppo di misurazioni è completo.
Arduino legge temperatura e umidità dal sensore DHT22 ogni due secondi.
La fotoresistenza viene letta più volte e i risultati vengono mediati per ridurre il rumore.
I valori vengono quindi inviati alla porta seriale con questa struttura:
Serial.print("Temperatura:");
Serial.print(temperatura);
Serial.print('\t');
Serial.print("Umidita:");
Serial.print(umidita);
Serial.print('\t');
Serial.print("Luminosita:");
Serial.println(luminosita);
La tabulazione \t separa le diverse serie.
Serial.println() termina la riga e indica al Serial Plotter che il gruppo di misurazioni è completo.
📊 Come aprire il Serial Plotter
Dopo aver caricato il programma:
Dovrebbero apparire tre linee con le relative etichette:
👉 Non aprire contemporaneamente il Serial Monitor e il Serial Plotter, perché entrambi utilizzano la stessa porta seriale.
Dopo aver caricato il programma:
- collega Arduino al computer;
- apri Arduino IDE;
- seleziona la porta corretta;
- vai su Tools → Serial Plotter;
- imposta la velocità a 115200 baud.
Dovrebbero apparire tre linee con le relative etichette:
- Temperatura;
- Umidita;
- Luminosita.
👉 Non aprire contemporaneamente il Serial Monitor e il Serial Plotter, perché entrambi utilizzano la stessa porta seriale.
🧪 Esperimenti da provare
Dopo aver aperto il Serial Plotter puoi:
👉 Il grafico permette di vedere fenomeni che sarebbero meno evidenti osservando soltanto valori numerici.
Dopo aver aperto il Serial Plotter puoi:
- coprire lentamente la fotoresistenza;
- accendere e spegnere una lampada;
- avvicinare una mano al DHT22;
- aprire una finestra;
- confrontare mattina e sera;
- osservare quanto rapidamente reagiscono i diversi sensori.
👉 Il grafico permette di vedere fenomeni che sarebbero meno evidenti osservando soltanto valori numerici.
🧠 Perché è un progetto importante
Con questo progetto impari a:
👉 Il Serial Plotter è uno strumento molto utile per testare sensori, calibrare soglie e individuare problemi nei progetti Arduino.
Con questo progetto impari a:
- utilizzare il Serial Plotter;
- inviare più dati sulla porta seriale;
- formattare correttamente le serie;
- visualizzare sensori in tempo reale;
- leggere temperatura e umidità;
- filtrare un ingresso analogico;
- convertire valori in percentuale;
- controllare la validità delle letture;
- aggiornare i dati tramite millis();
- analizzare l’andamento di un sistema.
👉 Il Serial Plotter è uno strumento molto utile per testare sensori, calibrare soglie e individuare problemi nei progetti Arduino.
🔄 Varianti possibili
Vuoi migliorare il progetto?
Vuoi migliorare il progetto?
- 📈 aggiungi la temperatura percepita;
- 🔋 visualizza la tensione di una batteria;
- ⚡ mostra corrente e potenza;
- 🌬️ collega un sensore di qualità dell’aria;
- 📉 aggiungi una media mobile;
- 🎛️ utilizza un potenziometro per modificare una soglia;
- 🚨 mostra una linea di allarme;
- 💾 salva contemporaneamente i dati su microSD;
- ⏰ aggiungi data e ora con RTC DS3231;
- 📶 invia i dati tramite Wi-Fi;
- 🖥️ crea una dashboard sul computer;
- 🧮 normalizza tutte le serie tra 0 e 100.