🌡️ Arduino • DHT11 • microSD

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.

DifficoltàFacile
Tempo25–30 minuti
Cosa impariDatalogging e file su SD
In poche parole: Arduino legge periodicamente temperatura e umidità dal DHT11 e salva ogni campione nel file 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

🔌 Arduino Uno
🌡️ Sensore DHT11
💾 Modulo microSD
🗂️ Scheda SD / microSD compatibile
🔗 Cavetti di collegamento
🧩 Breadboard

🧰 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 consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema di collegamento

Schema datalogger Arduino DHT11 microSD

Schema del datalogger con sensore DHT11 e modulo microSD.

Collegamenti principali

ElementoArduino Uno
DHT11 DATAD2
microSD CSD4
microSD MOSID11
microSD MISOD12
microSD SCKD13
Attenzione al modulo microSD: verifica sempre la tensione di alimentazione prevista dalla scheda che stai usando. Molti moduli includono regolatore e adattamento dei livelli logici, altri no.

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.

⬇️ Scarica la libreria DHT11

Codice Arduino commentato

Datalogger DHT11 + microSD
/*
  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:

Formato del file datalog.txt
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.

File datalog txt Arduino DHT11 SD Card

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.

Grafico temperatura umidità Arduino datalogger

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.