Datalogger con Arduino, DHT11 e SD Card per temperatura e umidità
Registriamo automaticamente temperatura e umidità su una scheda microSD e poi utilizziamo i dati salvati per creare grafici e analizzare l’andamento delle misure nel tempo.
datalog.txt sulla microSD. Il file può poi essere aperto con un foglio di calcolo per creare grafici.Cosa imparerai
- leggere temperatura e umidità con il DHT11;
- inizializzare una scheda microSD;
- creare e aggiornare un file di testo;
- salvare misure separate da virgole;
- registrare un campione ogni 10 secondi;
- importare i dati in un foglio di calcolo.
Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo è utile per avere breadboard, cavetti, sensori, resistenze e molti componenti di base per sperimentare con Arduino.
👉 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.
Schema di collegamento
Schema del datalogger con sensore DHT11 e modulo microSD.
Collegamenti principali
| Elemento | Arduino Uno |
|---|---|
| DHT11 DATA | D2 |
| microSD CS | D4 |
| microSD MOSI | D11 |
| microSD MISO | D12 |
| microSD SCK | D13 |
Preparare la scheda SD
Prima della prova formatta la scheda con un file system compatibile con la libreria SD e inseriscila nel modulo. Per questo progetto viene creato il file datalog.txt.
Libreria DHT11
Lo sketch utilizza la libreria DHT per leggere il sensore. Le librerie SPI.h e SD.h gestiscono invece la comunicazione con la scheda di memoria.
Codice Arduino commentato
/*
DATALOGGER TEMPERATURA E UMIDITÀ CON DHT11 E MICROSD
Sensore DHT11:
DATA -> D2
Modulo microSD:
CS -> D4
MOSI -> D11
MISO -> D12
SCK -> D13
Il programma salva ogni 10 secondi nel file datalog.txt:
tempo_ms,umidita_percento,temperatura_celsius
Esempio:
10000,55.0,23.0
20000,56.0,23.0
*/
#include <DHT.h>
#include <SPI.h>
#include <SD.h>
// ---------------------------
// Configurazione DHT11
// ---------------------------
const byte DHT_PIN = 2;
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
// ---------------------------
// Configurazione microSD
// ---------------------------
const byte CHIP_SELECT = 4;
const char FILE_NAME[] = "datalog.txt";
// Intervallo tra due registrazioni: 10 secondi
const unsigned long LOG_INTERVAL = 10000UL;
unsigned long ultimoLog = 0;
bool sdPronta = false;
void setup() {
Serial.begin(9600);
// Avvia il sensore DHT11
dht.begin();
Serial.println("Inizializzazione SD card...");
// Prova a inizializzare la scheda microSD
sdPronta = SD.begin(CHIP_SELECT);
if (!sdPronta) {
Serial.println("Errore: SD Card non valida o non presente.");
return;
}
Serial.println("SD Card pronta.");
// Scrive una riga di intestazione solo se il file non esiste ancora
if (!SD.exists(FILE_NAME)) {
File dataFile = SD.open(FILE_NAME, FILE_WRITE);
if (dataFile) {
dataFile.println("tempo_ms,umidita_percento,temperatura_celsius");
dataFile.close();
}
}
}
void loop() {
// Se la microSD non è stata inizializzata, non tenta di scrivere
if (!sdPronta) {
return;
}
unsigned long adesso = millis();
// Registra un campione ogni 10 secondi senza bloccare il programma
if (adesso - ultimoLog < LOG_INTERVAL) {
return;
}
ultimoLog = adesso;
// Legge umidità e temperatura in °C
float umidita = dht.readHumidity();
float temperatura = dht.readTemperature();
// Il DHT restituisce NaN se la lettura non è valida
if (isnan(umidita) || isnan(temperatura)) {
Serial.println("Errore lettura DHT11.");
return;
}
// Apre il file in modalità append
File dataFile = SD.open(FILE_NAME, FILE_WRITE);
if (!dataFile) {
Serial.println("Errore apertura datalog.txt");
return;
}
// Scrive: tempo, umidità, temperatura
dataFile.print(adesso);
dataFile.print(',');
dataFile.print(umidita, 1);
dataFile.print(',');
dataFile.println(temperatura, 1);
// Chiude il file per assicurare il salvataggio dei dati
dataFile.close();
// Mostra lo stesso campione sul Monitor Seriale
Serial.print(adesso);
Serial.print(',');
Serial.print(umidita, 1);
Serial.print(',');
Serial.println(temperatura, 1);
}
Come funziona lo sketch
1. Inizializzazione del DHT11
Il sensore è collegato a D2 e viene avviato con dht.begin().
2. Inizializzazione della microSD
SD.begin(4) inizializza la scheda usando D4 come Chip Select. Se la scheda non è disponibile, il programma evita di tentare le scritture.
3. Lettura dei sensori
readHumidity() restituisce l’umidità relativa, mentre readTemperature() restituisce la temperatura in gradi Celsius.
4. Controllo degli errori
Se il DHT11 non restituisce una lettura valida, il campione viene ignorato invece di salvare valori errati nel file.
5. Registrazione ogni 10 secondi
Il campionamento viene temporizzato con millis(), quindi non è necessario bloccare il programma con un delay(10000).
6. Chiusura del file
Dopo ogni riga il file viene chiuso. Questo riduce il rischio di perdere i dati già acquisiti se l’alimentazione viene interrotta.
Formato dei dati salvati
Ogni riga contiene tre valori separati da virgole:
tempo_ms,umidita_percento,temperatura_celsius
10000,55.0,23.0
20000,56.0,23.0
30000,57.0,24.0
Il primo valore indica i millisecondi trascorsi dall’accensione di Arduino; seguono umidità relativa e temperatura.
Esempio del file di testo generato. L’immagine mantiene una larghezza massima di 448 px.
Creare un grafico con i dati
Dopo aver raccolto un numero sufficiente di campioni puoi rimuovere la scheda, aprire il file con un programma di foglio di calcolo e separare le colonne usando la virgola come delimitatore.
Da lì puoi creare un grafico con il tempo sull’asse orizzontale e temperatura o umidità sull’asse verticale.
I dati registrati possono essere trasformati in un grafico per osservare l’andamento nel tempo.
Quanto spazio occupano i dati?
Un campione testuale occupa pochi byte. Con una registrazione ogni 10 secondi si generano 360 campioni all’ora e 8.640 campioni al giorno, quindi anche una scheda di capacità modesta può contenere moltissime misure.
Scarica lo sketch
⬇️ Scarica arduino_datalogger_con_sd_card_e_dht-11.ino
Debug rapido
- se compare un errore SD, controlla CS su D4 e i collegamenti SPI;
- se il DHT11 restituisce errori, verifica alimentazione e pin DATA su D2;
- se il file resta vuoto, controlla che la scheda sia scrivibile;
- se il modulo microSD diventa instabile, verifica alimentazione e livelli logici;
- se vuoi campionare più lentamente, aumenta
LOG_INTERVAL; - non estrarre la scheda mentre Arduino sta scrivendo.
Varianti del progetto
- aggiungere un modulo RTC per associare data e ora reali a ogni campione;
- usare un sensore DHT22 per una misura più accurata;
- registrare pressione, luce o qualità dell’aria;
- aggiungere un display per mostrare le misure in tempo reale;
- creare file giornalieri separati;
- aggiungere un pulsante per avviare e fermare il logging;
- trasmettere gli stessi dati anche via Wi-Fi.
Cosa devi ricordare
- Il DHT11 è collegato a D2.
- La microSD usa D4 come Chip Select.
- I dati vengono registrati nel file
datalog.txt. - Ogni campione contiene tempo, umidità e temperatura.
- Il progetto registra un campione ogni 10 secondi.
- I dati possono essere importati in un foglio di calcolo per creare grafici.
Domande frequenti
Posso cambiare l’intervallo di registrazione?
Sì. Modifica LOG_INTERVAL. Per esempio 60000UL corrisponde a un campione ogni minuto.
Posso usare un DHT22?
Sì, modificando il tipo di sensore nel codice e usando una libreria compatibile.
Perché nel file non compare l’ora reale?
Il progetto salva il tempo trascorso dall’accensione tramite millis(). Per data e ora reali serve aggiungere un RTC o un’altra sorgente temporale.
Posso aprire il file con Excel o LibreOffice Calc?
Sì. I valori sono separati da virgole e possono essere importati come colonne in un normale foglio di calcolo.

