Objetivos
- Aprovechar el lector microSD interno del M5Stack Core (SPI, CS = GPIO4) para registrar mediciones en CSV.
- Formatear una tarjeta FAT32 de 16 GB como máximo (límite oficial del slot) y crear archivos con fecha.
- Escribir de forma segura: open/append/println/flush/close, rotación diaria, guardado antes del deep-sleep.
- Mostrar en la pantalla el número de registros y el estado de la tarjeta.
Material
- 1 M5Stack Core (Basic/Gray) con slot TF en la parte trasera (debajo de la tapa).
- 1 tarjeta microSD ≤ 16 GB, formateada en FAT32 (las tarjetas más recientes en exFAT no funcionan).
- Sensor a elección: aquí el ADC1 G36 (PORT.B) y la batería IP5306 como ejemplos de datos.
Código completo
#include <M5Unified.h>
#include <SD.h>
const int PIN_TF_CS = 4; // CS du slot TF interne
const int PIN_CAPTEUR = 36; // ADC1, PORT.B
File journal;
uint32_t nbLignes = 0;
void setup {
Serial.begin(115200);
auto cfg = M5.config;
M5.begin(cfg);
M5.Display.setTextSize(2);
if (!SD.begin(PIN_TF_CS)) {
M5.Display.println("Carte SD absente");
M5.Display.println("ou pas en FAT32");
while (true) vTaskDelay(1000 / portTICK_PERIOD_MS);
}
journal = SD.open("mesures.csv", FILE_APPEND);
if (!journal) { M5.Display.println("Ouverture fichier KO"); while (true); }
if (journal.size == 0) journal.println("millis,adc36,batterie");
Serial.println("Logger SD pret");
}
void loop {
M5.update;
if (M5.BtnA.wasPressed) {
journal.printf("%lu,%d,%d\n", millis,
analogRead(PIN_CAPTEUR), M5.Power.getBatteryLevel);
journal.flush; // ne depend pas de la cache
nbLignes++;
M5.Speaker.beep;
}
if (M5.BtnB.wasPressed) { journal.close; esp_restart; }
M5.Display.fillRect(0, 30, 320, 60, TFT_BLACK);
M5.Display.setCursor(10, 35);
M5.Display.printf("Lignes : %lu", nbLignes);
vTaskDelay(50 / portTICK_PERIOD_MS);
}
Verificación esperada
- Pulsar A: pitido + incremento del contador; aparece un archivo medidas.csv en la raíz de la tarjeta con una línea «millis,adc36,bateria» por pulsación.
- Retirar la tarjeta y leerla en el PC: el CSV se abre en una hoja de cálculo.
- Sin tarjeta (o en exFAT): mensaje «Tarjeta SD ausente» al iniciar en lugar de un bloqueo.
Errores frecuentes
- Tarjeta de más de 16 GB o formateada en exFAT/NTFS: el slot está limitado a 16 GB FAT32 — es un límite oficial, no un error.
- Olvidar flush antes de retirar o de un deep-sleep: se pierden las últimas líneas.
- Mantener el File abierto durante horas sin rotación: crear un archivo por día (nombre con fecha) para limitar los daños en caso de corte.
- Confundir el CS del slot interno (GPIO4) con un CS externo: GPIO4 está cableado de fábrica en el lector TF.
- Escribir en SPI compartido durante el refresco intensivo de la pantalla: aparecen ralentizaciones; cadenciar las escrituras (aquí al pulsar botón o cada N segundos).
- Retirar la tarjeta con tensión y volver a insertarla sin SD.begin: hay que remontar el sistema de archivos (idf.py restart o botón RESET).