🚀 Introduzione
Vuoi visualizzare più dati ambientali contemporaneamente su un unico display? 📊
In questo progetto realizzerai una dashboard per Arduino su display OLED, capace di mostrare temperatura, umidità, luminosità e livello della batteria.
I dati vengono aggiornati automaticamente e organizzati in una schermata compatta, simile al pannello di controllo di un dispositivo professionale.
👉 Il progetto rappresenta un’evoluzione del precedente menu OLED e introduce la visualizzazione simultanea di più sensori.
Vuoi visualizzare più dati ambientali contemporaneamente su un unico display? 📊
In questo progetto realizzerai una dashboard per Arduino su display OLED, capace di mostrare temperatura, umidità, luminosità e livello della batteria.
I dati vengono aggiornati automaticamente e organizzati in una schermata compatta, simile al pannello di controllo di un dispositivo professionale.
👉 Il progetto rappresenta un’evoluzione del precedente menu OLED e introduce la visualizzazione simultanea di più sensori.
🎯 Cosa realizzerai
Con Arduino creerai un sistema che:
Con Arduino creerai un sistema che:
- 🌡️ misura la temperatura ambientale
- 💧 misura l’umidità
- 💡 rileva il livello di luminosità
- 🔋 mostra un livello batteria simulato
- 📟 visualizza tutti i dati su un display OLED
- 🔄 aggiorna automaticamente la dashboard
- ⚠️ segnala eventuali errori del sensore
🧰 Materiale necessario
Il potenziometro viene utilizzato per simulare il livello di una batteria, evitando di collegare direttamente batterie con tensioni superiori ai limiti degli ingressi analogici di Arduino.
- 1x Arduino UNO
- 1x display OLED 0,96 pollici I2C SSD1306
- 1x sensore DHT11
- 1x fotoresistenza LDR
- 1x resistenza da 10kΩ
- 1x potenziometro da 10kΩ
- cavetti jumper
- breadboard
- cavo USB
Il potenziometro viene utilizzato per simulare il livello di una batteria, evitando di collegare direttamente batterie con tensioni superiori ai limiti degli ingressi analogici di Arduino.
🛒 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 realizzare il progetto devi installare le seguenti librerie:
Per installarle:
Per realizzare il progetto devi installare le seguenti librerie:
- Adafruit SSD1306
- Adafruit GFX Library
- DHT sensor library
- Adafruit Unified Sensor
Per installarle:
- apri Arduino IDE;
- seleziona Sketch → Include Library → Manage Libraries;
- cerca il nome della libreria;
- premi Install;
- ripeti l’operazione per tutte le librerie richieste.
🔌 Schema di collegamento
Display OLED SSD1306
Sensore DHT11
I moduli DHT11 già assemblati normalmente possiedono questa resistenza integrata.
Fotoresistenza LDR
Realizza un partitore di tensione:
Potenziometro per simulare la batteria
Display OLED SSD1306
- VCC → 5V
- GND → GND
- SDA → A4
- SCL → A5
Sensore DHT11
- VCC → 5V
- GND → GND
- DATA → pin digitale 2
I moduli DHT11 già assemblati normalmente possiedono questa resistenza integrata.
Fotoresistenza LDR
Realizza un partitore di tensione:
- un terminale della fotoresistenza → 5V
- terminale opposto → A0
- resistenza da 10kΩ tra A0 e GND
Potenziometro per simulare la batteria
- terminale laterale → 5V
- terminale laterale opposto → GND
- terminale centrale → A1
💻 Codice Arduino
Il programma legge periodicamente tutti i sensori e aggiorna il display OLED.
La dashboard mostra:
Il programma legge periodicamente tutti i sensori e aggiorna il display OLED.
La dashboard mostra:
- temperatura in gradi Celsius;
- umidità in percentuale;
- luminosità in percentuale;
- livello della batteria;
- barra grafica dello stato batteria.
/*
==================================================
Progetto 123 - Dashboard sensori su display OLED
Visualizza temperatura, umidita, luce e batteria
==================================================
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define LARGHEZZA_DISPLAY 128
#define ALTEZZA_DISPLAY 64
#define RESET_OLED -1
#define PIN_DHT 2
#define TIPO_DHT DHT11
#define PIN_LUCE A0
#define PIN_BATTERIA A1
Adafruit_SSD1306 display(
LARGHEZZA_DISPLAY,
ALTEZZA_DISPLAY,
&Wire,
RESET_OLED
);
DHT dht(PIN_DHT, TIPO_DHT);
float temperatura = 0;
float umidita = 0;
int luminositaPercentuale = 0;
int batteriaPercentuale = 0;
unsigned long ultimoAggiornamento = 0;
const unsigned long intervalloAggiornamento = 2000;
void setup() {
dht.begin();
if (!display.begin(
SSD1306_SWITCHCAPVCC,
0x3C
)) {
while (true) {
}
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(16, 20);
display.println("Dashboard sensori");
display.setCursor(28, 36);
display.println("Progetto 123");
display.display();
delay(1800);
leggiSensori();
mostraDashboard();
}
void loop() {
if (millis() - ultimoAggiornamento >= intervalloAggiornamento) {
ultimoAggiornamento = millis();
leggiSensori();
mostraDashboard();
}
}
void leggiSensori() {
temperatura = dht.readTemperature();
umidita = dht.readHumidity();
int valoreLuce = analogRead(PIN_LUCE);
int valoreBatteria = analogRead(PIN_BATTERIA);
luminositaPercentuale = map(
valoreLuce,
0,
1023,
0,
100
);
batteriaPercentuale = map(
valoreBatteria,
0,
1023,
0,
100
);
luminositaPercentuale = constrain(
luminositaPercentuale,
0,
100
);
batteriaPercentuale = constrain(
batteriaPercentuale,
0,
100
);
}
void mostraDashboard() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("DASHBOARD SENSORI");
display.drawLine(
0,
10,
127,
10,
SSD1306_WHITE
);
if (isnan(temperatura) || isnan(umidita)) {
mostraErroreSensore();
display.display();
return;
}
display.setCursor(0, 15);
display.print("Temp: ");
display.print(temperatura, 1);
display.print((char)247);
display.println("C");
display.setCursor(0, 27);
display.print("Umid: ");
display.print(umidita, 0);
display.println("%");
display.setCursor(0, 39);
display.print("Luce: ");
display.print(luminositaPercentuale);
display.println("%");
mostraBatteria();
display.display();
}
void mostraBatteria() {
display.setCursor(0, 52);
display.print("Batt: ");
display.print(batteriaPercentuale);
display.print("%");
display.drawRect(
80,
51,
44,
10,
SSD1306_WHITE
);
display.drawRect(
124,
54,
3,
4,
SSD1306_WHITE
);
int larghezzaBarra = map(
batteriaPercentuale,
0,
100,
0,
40
);
display.fillRect(
82,
53,
larghezzaBarra,
6,
SSD1306_WHITE
);
}
void mostraErroreSensore() {
display.setCursor(12, 25);
display.setTextSize(1);
display.println("Errore DHT11");
display.setCursor(5, 40);
display.println("Controlla i cavi");
}
==================================================
Progetto 123 - Dashboard sensori su display OLED
Visualizza temperatura, umidita, luce e batteria
==================================================
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define LARGHEZZA_DISPLAY 128
#define ALTEZZA_DISPLAY 64
#define RESET_OLED -1
#define PIN_DHT 2
#define TIPO_DHT DHT11
#define PIN_LUCE A0
#define PIN_BATTERIA A1
Adafruit_SSD1306 display(
LARGHEZZA_DISPLAY,
ALTEZZA_DISPLAY,
&Wire,
RESET_OLED
);
DHT dht(PIN_DHT, TIPO_DHT);
float temperatura = 0;
float umidita = 0;
int luminositaPercentuale = 0;
int batteriaPercentuale = 0;
unsigned long ultimoAggiornamento = 0;
const unsigned long intervalloAggiornamento = 2000;
void setup() {
dht.begin();
if (!display.begin(
SSD1306_SWITCHCAPVCC,
0x3C
)) {
while (true) {
}
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(16, 20);
display.println("Dashboard sensori");
display.setCursor(28, 36);
display.println("Progetto 123");
display.display();
delay(1800);
leggiSensori();
mostraDashboard();
}
void loop() {
if (millis() - ultimoAggiornamento >= intervalloAggiornamento) {
ultimoAggiornamento = millis();
leggiSensori();
mostraDashboard();
}
}
void leggiSensori() {
temperatura = dht.readTemperature();
umidita = dht.readHumidity();
int valoreLuce = analogRead(PIN_LUCE);
int valoreBatteria = analogRead(PIN_BATTERIA);
luminositaPercentuale = map(
valoreLuce,
0,
1023,
0,
100
);
batteriaPercentuale = map(
valoreBatteria,
0,
1023,
0,
100
);
luminositaPercentuale = constrain(
luminositaPercentuale,
0,
100
);
batteriaPercentuale = constrain(
batteriaPercentuale,
0,
100
);
}
void mostraDashboard() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("DASHBOARD SENSORI");
display.drawLine(
0,
10,
127,
10,
SSD1306_WHITE
);
if (isnan(temperatura) || isnan(umidita)) {
mostraErroreSensore();
display.display();
return;
}
display.setCursor(0, 15);
display.print("Temp: ");
display.print(temperatura, 1);
display.print((char)247);
display.println("C");
display.setCursor(0, 27);
display.print("Umid: ");
display.print(umidita, 0);
display.println("%");
display.setCursor(0, 39);
display.print("Luce: ");
display.print(luminositaPercentuale);
display.println("%");
mostraBatteria();
display.display();
}
void mostraBatteria() {
display.setCursor(0, 52);
display.print("Batt: ");
display.print(batteriaPercentuale);
display.print("%");
display.drawRect(
80,
51,
44,
10,
SSD1306_WHITE
);
display.drawRect(
124,
54,
3,
4,
SSD1306_WHITE
);
int larghezzaBarra = map(
batteriaPercentuale,
0,
100,
0,
40
);
display.fillRect(
82,
53,
larghezzaBarra,
6,
SSD1306_WHITE
);
}
void mostraErroreSensore() {
display.setCursor(12, 25);
display.setTextSize(1);
display.println("Errore DHT11");
display.setCursor(5, 40);
display.println("Controlla i cavi");
}
💻 Codice Arduino
Il programma legge periodicamente tutti i sensori e aggiorna il display OLED.
La dashboard mostra:
Il programma legge periodicamente tutti i sensori e aggiorna il display OLED.
La dashboard mostra:
- temperatura in gradi Celsius;
- umidità in percentuale;
- luminosità in percentuale;
- livello della batteria;
- barra grafica dello stato batteria.
⚙️ Come funziona
Arduino legge temperatura e umidità attraverso il sensore DHT11.
La fotoresistenza collegata al pin A0 genera un valore analogico compreso tra 0 e 1023.
Il programma converte questo valore in una percentuale:
luminositaPercentuale = map(valoreLuce, 0, 1023, 0, 100);
Anche il valore del potenziometro viene trasformato in una percentuale compresa tra 0 e 100.
I dati vengono poi mostrati sul display OLED utilizzando una disposizione compatta su più righe.
👉 La dashboard viene aggiornata ogni due secondi, un intervallo adatto anche al sensore DHT11.
Arduino legge temperatura e umidità attraverso il sensore DHT11.
La fotoresistenza collegata al pin A0 genera un valore analogico compreso tra 0 e 1023.
Il programma converte questo valore in una percentuale:
luminositaPercentuale = map(valoreLuce, 0, 1023, 0, 100);
Anche il valore del potenziometro viene trasformato in una percentuale compresa tra 0 e 100.
I dati vengono poi mostrati sul display OLED utilizzando una disposizione compatta su più righe.
👉 La dashboard viene aggiornata ogni due secondi, un intervallo adatto anche al sensore DHT11.
🌡️ Lettura di temperatura e umidità
La funzione dht.readTemperature() restituisce la temperatura in gradi Celsius.
La funzione dht.readHumidity() restituisce invece l’umidità relativa in percentuale.
Se il sensore non risponde correttamente, il programma mostra sul display il messaggio:
Errore DHT11
Questo controllo impedisce di visualizzare valori non validi.
La funzione dht.readTemperature() restituisce la temperatura in gradi Celsius.
La funzione dht.readHumidity() restituisce invece l’umidità relativa in percentuale.
Se il sensore non risponde correttamente, il programma mostra sul display il messaggio:
Errore DHT11
Questo controllo impedisce di visualizzare valori non validi.
💡 Lettura della luminosità
La fotoresistenza cambia il proprio valore elettrico in base alla luce ricevuta.
Arduino legge il partitore di tensione attraverso il pin analogico A0.
Il risultato viene convertito in percentuale per renderlo più facile da interpretare.
In base al collegamento e al tipo di fotoresistenza, potrebbe essere necessario invertire la conversione:
luminositaPercentuale = map(valoreLuce, 0, 1023, 100, 0);
Utilizza questa variante se la percentuale diminuisce quando l’ambiente diventa più luminoso.
La fotoresistenza cambia il proprio valore elettrico in base alla luce ricevuta.
Arduino legge il partitore di tensione attraverso il pin analogico A0.
Il risultato viene convertito in percentuale per renderlo più facile da interpretare.
In base al collegamento e al tipo di fotoresistenza, potrebbe essere necessario invertire la conversione:
luminositaPercentuale = map(valoreLuce, 0, 1023, 100, 0);
Utilizza questa variante se la percentuale diminuisce quando l’ambiente diventa più luminoso.
🔋 Indicatore della batteria
Il potenziometro simula la tensione di una batteria.
Il valore letto sul pin A1 viene convertito in percentuale e visualizzato sia numericamente sia attraverso una barra grafica.
La larghezza della barra viene calcolata in proporzione al livello:
larghezzaBarra = map(batteriaPercentuale, 0, 100, 0, 42);
Con la batteria al 100%, la barra viene riempita completamente.
👉 In un progetto reale, una batteria deve essere collegata ad Arduino attraverso un partitore di tensione correttamente dimensionato.
Non collegare mai direttamente a un ingresso analogico una tensione superiore a 5V.
Il potenziometro simula la tensione di una batteria.
Il valore letto sul pin A1 viene convertito in percentuale e visualizzato sia numericamente sia attraverso una barra grafica.
La larghezza della barra viene calcolata in proporzione al livello:
larghezzaBarra = map(batteriaPercentuale, 0, 100, 0, 42);
Con la batteria al 100%, la barra viene riempita completamente.
👉 In un progetto reale, una batteria deve essere collegata ad Arduino attraverso un partitore di tensione correttamente dimensionato.
Non collegare mai direttamente a un ingresso analogico una tensione superiore a 5V.
⏱️ Aggiornamento senza bloccare il programma
Il programma utilizza millis() per aggiornare la dashboard ogni due secondi.
In questo modo Arduino non rimane bloccato da lunghi comandi delay() e può continuare a eseguire altre operazioni.
Questa tecnica sarà utile nei progetti successivi, dove dovremo controllare contemporaneamente sensori, display, relè e sistemi di allarme.
Il programma utilizza millis() per aggiornare la dashboard ogni due secondi.
In questo modo Arduino non rimane bloccato da lunghi comandi delay() e può continuare a eseguire altre operazioni.
Questa tecnica sarà utile nei progetti successivi, dove dovremo controllare contemporaneamente sensori, display, relè e sistemi di allarme.
🧠 Perché è un progetto importante
Con questo progetto impari a:
👉 È una base perfetta per stazioni ambientali, centraline domotiche, serre automatiche e sistemi di monitoraggio.
Con questo progetto impari a:
- utilizzare contemporaneamente più sensori
- leggere ingressi digitali e analogici
- visualizzare più informazioni su un display OLED
- creare una dashboard compatta
- convertire valori analogici in percentuali
- disegnare barre grafiche
- controllare gli errori di lettura
- aggiornare il display tramite millis()
👉 È una base perfetta per stazioni ambientali, centraline domotiche, serre automatiche e sistemi di monitoraggio.
🔄 Varianti possibili
Vuoi migliorare il progetto?
Vuoi migliorare il progetto?
- 🌡️ sostituisci il DHT11 con un DHT22
- 🌬️ aggiungi un sensore di qualità dell’aria
- 🔊 inserisci un allarme sonoro
- 📊 aggiungi icone grafiche per ogni sensore
- 🔋 misura la tensione reale di una batteria
- 💾 salva i dati su una scheda microSD
- ⏰ aggiungi data e ora con un RTC DS3231
- 📶 invia i dati tramite Wi-Fi
- 🚨 mostra un avviso quando un valore supera una soglia