¿Qué haces cuando quieres registrar datos en un lugar sin WiFi, como el patio o el invernadero? La memoria interna del microcontrolador es de apenas unos megabytes y se borra en cada reinicio. La solución es guardar todo en una tarjeta microSD. En este tutorial vas a armar un registrador de temperatura que anota la hora, la temperatura y la humedad en una microSD, y vas a aprender a leer esos datos de vuelta. Sirve para Arduino, ESP8266 y ESP32, y al final vas a poder adaptar el mismo montaje a cualquier proyecto de datalogging.
Cómo es el módulo microSD por dentro
Antes de conectar, vale la pena entender qué trae el módulo. La tarjeta microSD trabaja con lógica de 3.3 V, mientras que un Arduino opera a 5 V. Por eso el módulo incluye dos componentes clave:
- Regulador de voltaje: baja los 5 V de alimentación a los 3.3 V que necesita la tarjeta.
- Conversor de nivel lógico (level shifter): el chip 74LVC125A traduce las señales SPI entre 5 V y 3.3 V, porque el regulador solo baja la alimentación, no las señales de datos.
La tarjeta SD ya trae su propia interfaz SPI integrada, así que no se necesitan más componentes. Importante: la microSD debe estar formateada como FAT16 o FAT32, y muchos módulos tienen un límite de 32 GB.

Conexión por SPI
El módulo se comunica por SPI, el bus más rápido para transferir datos. Los pines típicos del módulo, de izquierda a derecha, son: GND, VCC, MISO, MOSI, SCK y CS. Cada placa tiene sus pines SPI por defecto, y el pin CS (Chip Select) puede ser cualquier pin digital que definas en el código.
Un detalle que ahorra horas de depuración: si usas un pin CS distinto al de por defecto, el pin CS por defecto de la placa debe quedar libre y configurado como salida, porque la librería SD lo reserva internamente. En Arduino el CS por defecto es el pin 10 y en ESP8266 el D8.


Registrador de temperatura para Arduino y ESP8266
Ahora armamos el registrador completo: lee temperatura y humedad de un sensor DHT22, toma la hora de un módulo de reloj en tiempo real (RTC DS1307) y escribe todo en la microSD. La única librería que no viene por defecto es RTClib, que instalas desde el gestor de librerías del IDE de Arduino.

#include "SPI.h"
#include "SD.h"
#include "DHT.h"
#include "RTClib.h"
#define DHTPIN 7 // used for Arduino
//#define DHTPIN D4 // used for ESP8266
#define DHTYPE DHT22
const int chipSelect = 10; // used for Arduino
//const int chipSelect = D8; // used for ESP8266
DHT dht(DHTPIN, DHTYPE);
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
while (!Serial) {
}
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
if (!SD.begin(chipSelect)) {
Serial.println("Initialization failed!");
while (1);
}
dht.begin();
}
void loop() {
String dataString = "";
float h = dht.readHumidity();
float t = dht.readTemperature();
DateTime now = rtc.now();
dataString += String(now.unixtime());
dataString += ",";
dataString += String(h);
dataString += ",";
dataString += String(t);
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString);
} else {
Serial.println("error opening datalog.txt");
}
delay(2000);
}
El código incluye las librerías SPI (comunicación con la SD), SD (lectura/escritura), DHT (sensor) y RTClib (reloj). En Arduino el DHT22 se lee del pin digital 7 y en ESP8266 del pin D4: solo comentas la línea de la placa que no uses. En el setup(), tres condicionales inicializan el RTC y la SD, y si algo falla verás el error en el monitor serial. En el loop() se arma un string con la hora Unix, la humedad y la temperatura separadas por comas, se abre datalog.txt con permiso de escritura, se escribe la línea y se cierra el archivo. Cada 2 segundos se repite.
Registrador de temperatura para ESP32
En el ESP32 el montaje es el mismo (DHT22 + RTC + microSD), pero el código cambia porque usa el sistema de archivos FS y funciones separadas para escribir y agregar líneas. El DHT22 se conecta al pin digital 2.
#include "FS.h"
#include "SD.h"
#include "SPI.h"
#include "RTClib.h"
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if (!file){
Serial.println("Failed to open file for writing");
return;
}
if (file.print(message)){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}
void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if (!file){
Serial.println("Failed to open file for appending");
return;
}
if (file.print(message)){
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
void setup(){
Serial.begin(9600);
dht.begin();
if (!SD.begin()){
Serial.println("Card Mount Failed");
return;
}
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
writeFile(SD, "/datalog_ESP32.txt", "Time, Humidity, Temperature \r\n");
}
void loop(){
String dataString = "";
float h = dht.readHumidity();
float t = dht.readTemperature();
DateTime now = rtc.now();
dataString += String(now.unixtime());
dataString += ",";
dataString += String(h);
dataString += ",";
dataString += String(t);
dataString += "\r\n";
Serial.println(dataString);
appendFile(SD, "/datalog_ESP32.txt", dataString.c_str());
delay(2000);
}
La diferencia principal: además de la librería SD, se incluye la librería FS (file system). La función writeFile() se ejecuta una sola vez para crear el archivo con un encabezado, y appendFile() se llama en cada ciclo del loop() para agregar una nueva línea con la marca de tiempo, la humedad y la temperatura, terminando con \r\n para saltar de línea.
Leer los datos desde la microSD
Una vez que tienes datos guardados, quieres recuperarlos. Este ejemplo abre el archivo sin permiso de escritura (solo lectura) y vuelca cada línea al monitor serial.
#include "SPI.h"
#include "SD.h"
const int chipSelect = 10;
void setup() {
Serial.begin(9600);
while (!Serial) {
}
if (!SD.begin(chipSelect)) {
Serial.println("Initialization failed!");
while (1);
}
File dataFile = SD.open("datalog.txt");
if (dataFile) {
Serial.println("datalog.txt:");
// read from the file until there's nothing else in it:
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
} else {
Serial.println("error opening datalog.txt");
}
}
void loop() {
}
La única diferencia con el registrador es que se abre el archivo sin el argumento FILE_WRITE, así el microcontrolador solo puede leer. El bucle while recorre cada fila del archivo de texto y la imprime en el serial. En el ESP32 se usa una función readFile() equivalente con la librería FS.
Variantes y mejoras
Estas extensiones no están en el tutorial original, pero potencian mucho el proyecto:
- Enviar a una Raspberry Pi vía MQTT cuando hay WiFi: en el garaje guardas en la SD, pero cuando el dispositivo detecta una red conocida, publica los datos acumulados por MQTT a un broker en tu Raspberry Pi. Así tienes respaldo local y una base de datos central sin perder registros.
- Guardar en formato CSV con encabezado: cambia el string a un CSV limpio (
fecha,hora,temp,humedad) para abrirlo directo en una planilla de cálculo y graficar tendencias. - Estación meteorológica completa: combina el DHT22 con un sensor de presión BMP280 y un LDR para registrar también presión atmosférica y luz, todo en el mismo archivo.
Personalización para Chile
Todos los componentes están disponibles en el catálogo de MechatronicStore:
- Módulo lector microSD (SPI). almacenamiento de datos
- Sensor DHT22. temperatura y humedad
- Módulo RTC DS1307. reloj en tiempo real (marca de tiempo)
- Tarjeta microSD 32 GB (FAT32). soporte de datos
- Placa Arduino Uno o placa ESP32 NodeMCU. controlador (elige según tu proyecto)
- Protoboard 830 puntos y jumpers macho hembra. prototipado
Si en el tutorial original ves el "Data Logger Shield" de AZDelivery, no es imprescindible: con el módulo microSD suelto más el RTC DS1307 armas la misma función y eliges tú los pines.
Recursos
- Tutorial original: SD Card Tutorial for Arduino, ESP8266 and ESP32
- Librería recomendada: RTClib (Adafruit), instalable desde el gestor de librerías del IDE de Arduino
Versión chilena con componentes en stock local en MechatronicStore.




