Objectifs
- Exploiter le lecteur microSD interne de l'M5Stack Core (SPI, CS = GPIO4) pour journaliser des mesures en CSV.
- Formater une carte FAT32 de 16 Go maximum (limite officielle du slot) et créer des fichiers datés.
- Écrire de façon sûre : open/append/println/flush/close, rotation quotidienne, sauvegarde avant deep-sleep.
- Afficher sur l'écran le nombre d'enregistrements et l'état de la carte.
Matériel
- 1 M5Stack Core (Basic/Gray) avec slot TF à l'arrière (sous la trappe).
- 1 carte microSD ≤ 16 Go, formatée en FAT32 (les cartes plus récentes en exFAT ne fonctionnent pas).
- Capteur au choix : ici l'ADC1 G36 (PORT.B) et la batterie IP5306 en exemples de données.
Code complet
#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);
}
Vérification attendue
- Appui sur A : bip + incrémentation du compteur ; un fichier mesures.csv apparaît à la racine de la carte avec une ligne « millis,adc36,batterie » par appui.
- Retirer la carte et la lire sur PC : le CSV s'ouvre dans un tableur.
- Sans carte (ou en exFAT) : message « Carte SD absente » au démarrage au lieu d'un plantage.
Erreurs fréquentes
- Carte de plus de 16 Go ou formatée exFAT/NTFS : le slot est limité à 16 Go FAT32 — c'est une limite officielle, pas un bug.
- Oublier flush avant un retrait ou un deep-sleep : les dernières lignes sont perdues.
- Rester File ouvert pendant des heures sans rotation : créer un fichier par jour (nom daté) pour limiter les dégâts en cas de coupure.
- Confondre le CS du slot interne (GPIO4) avec un CS externe : GPIO4 est câblé en usine sur le lecteur TF.
- Écrire en SPI partagé pendant le rafraîchissement intensif de l'écran : des ralentissements apparaissent ; cadencer les écritures (ici sur appui bouton ou toutes les N secondes).
- Retirer la carte sous tension puis la réinsérer sans SD.begin : il faut remonter le système de fichiers (idf.py restart ou bouton RESET).