journal-sd.ino
La carcasa tiene todo para la estación autónoma: SD interna, reloj NTP, pila. Este registrador escribe una línea CSV cada 5 s con flush: los datos sobreviven al corte de corriente, a diferencia del búfer.
Hardware necesario
Un M5Stack Core Basic/Gray (ESP32 en carcasa con TFT de 320×240, botones A/B/C, altavoz, ranura microSD, batería de 110 mAh). 1 tarjeta micro SD (FAT32, ≤ 32 Go recomendado) en el alojamiento lateral.
Cableado
Sin cableado: el alojamiento SD está en el bus SPI interno. Retire la tarjeta sin corriente para evitar corrupción.
Funcionamiento
SD.begin monta el bus, open(FILE_APPEND) crea o amplía el archivo, flush fuerza la escritura física. time/localtime_r dan la hora NTP en cuanto el Wi-Fi sincroniza. En el Arduino IDE (paquete esp32), placa « M5Stack-Core-ESP32 »; instale la biblioteca « M5Stack » (o M5Unified) desde el gestor y suba.
Para ir más lejos
Trunque el archivo pasado 1 Mo, o añada un sensor Grove al puerto A para enriquecer las columnas.
journal-sd.ino
// Journal CSV sur la micro SD interne (SPI HS) + horloge NTP.
#include <M5Stack.h>
#include <SD.h>
#include <WiFi.h>
#include <time.h>
const char *SSID = "votre-wifi", *CLE = "votre-cle";
File journal;
unsigned long precedent = 0;
void setup() {
M5.begin(true, true, true, false);
Serial.begin(115200);
if (!SD.begin()) { M5.Lcd.drawString("SD absente!", 10, 10, 2); for (;;); }
WiFi.begin(SSID, CLE);
configTime(3600 * 2, 0, "pool.ntp.org"); // heure locale +2, sans DST
journal = SD.open("/mesures.csv", FILE_APPEND);
if (!journal) for (;;);
if (journal.size() == 0) journal.println("epoch;heure;tension_mv;bouton");
}
void loop() {
if (millis() - precedent < 5000) return;
precedent = millis();
time_t maintenant = time(nullptr);
struct tm t; localtime_r(&maintenant, &t);
char horo[24]; strftime(horo, sizeof(horo), "%F %T", &t);
journal.printf("%ld;%s;%d;%d\n", (long)maintenant, horo,
M5.Power.getBatteryLevel(), M5.GetPowerKey());
journal.flush(); // survit a une coupure d'alim
Serial.printf("%s ecrit\n", horo);
}