journal-sd.ino
Le boîtier a tout pour la station autonome : SD interne, horloge NTP, pile. Ce logger écrit une ligne CSV toutes les 5 s avec flush — la donnée survit à la coupure, contrairement au tampon.
Matériel requis
Un M5Stack Core Basic/Gray (ESP32 dans un boîtier avec écran TFT 320×240, 3 boutons A/B/C, haut-parleur, micro SD, batterie 110 mAh). 1 carte micro SD (FAT32, ≤ 32 Go conseillés) dans le logement latéral.
Branchement
Aucun câblage : le logement SD est sur le bus SPI interne. Retirer la carte contact coupé évite la corruption.
Fonctionnement
SD.begin monte le bus, open(FILE_APPEND) crée ou complète le fichier, flush force l'écriture physique. time/localtime_r donnent l'heure NTP dès que le Wi-Fi est synchrone. Dans l'Arduino IDE (paquet esp32), carte « M5Stack-Core-ESP32 » ; installez la bibliothèque « M5Stack » (ou M5Unified) via le gestionnaire, puis Téléverser.
Pour aller plus loin
Tronquez le fichier au-delà de 1 Mo, ou ajoutez un capteur Grove sur le port A pour enrichir les colonnes.
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);
}