ESP32 - Lire la configuration depuis une carte SD

Dans ce tutoriel, nous allons approfondir l'utilisation d'un fichier de configuration sur une carte Micro SD. Le tutoriel couvrira les aspects suivants :

Ce tutoriel vous permet de gérer les paramètres de configuration via un fichier stocké sur la carte Micro SD, offrant une flexibilité pour différents types de données tels que les entiers, les flottants et les chaînes de caractères.

Fichier de configuration de carte SD ESP32

Préparation du matériel

1×Module de développement ESP32 ESP-WROOM-32
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×Carte Micro SD
1×Module carte Micro SD
1×Fils de connexion
1×Optionnel: Adaptateur carte mémoire MicroSD vers SD
1×Recommandé: Carte d'extension à bornier à vis pour ESP32
1×Recommandé: Breakout Expansion Board for ESP32
1×Recommandé: Répartiteur d'alimentation pour ESP32

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables ESP32 (ESP32 inclus)
1×Kit de Capteurs DIYables (30 capteurs/écrans)
1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du module de carte Micro SD

Non familiarisé avec le module de carte Micro SD, y compris ses brochages, ses fonctionnalités et sa programmation ? Apprenez-en plus dans le tutoriel ESP32 - Carte Micro SD.

Comment ça marche

Les paires clé-valeur sont pré-enregistrées sur la carte Micro SD selon le format suivant :

  • Chaque paire clé-valeur est sur une seule ligne. Autrement dit, chaque paire clé-valeur est séparée des autres par un caractère de nouvelle ligne
  • La clé et la valeur sont séparées par un caractère =

Le code ESP32 recherchera la clé et trouvera la valeur correspondante, puis enregistrera cette valeur dans une variable. Le type de la variable peut être int, float ou String.

Diagramme de câblage

Schéma de câblage du module de carte micro SD ESP32

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, consultez les instructions dans le tutoriel suivant : Comment alimenter l'ESP32..

※ Note:

Si vous utilisez un shield Ethernet ou tout autre shield disposant d'un support pour carte Micro SD, vous n'avez pas besoin d'utiliser le module de carte Micro SD. Vous devez simplement insérer la carte Micro SD dans le support de carte Micro SD sur le shield.

Comment lire la configuration dans des variables

  • Créez le fichier config.txt sur votre PC via Notepad ou Notepad++
  • Copiez les paires clé-valeur ci-dessous et collez-les dans le config.txt :
myString_1=Hello myString_2=newbiely.fr myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • Connectez la carte Micro SD au PC via le lecteur de carte SD USB 3.0
  • Assurez-vous que la carte Micro SD est formatée en FAT16 ou FAT32 (cherchez sur Google)
  • Copiez le fichier config.txt dans le répertoire racine de la carte Micro SD
  • Déconnectez la carte Micro SD du PC
  • Connectez la carte Micro SD à l'ESP32 via le module de carte Micro SD selon le schéma de câblage ci-dessus
  • Copiez le code ci-dessous et ouvrez-le avec Arduino IDE
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-read-config-from-sd-card */ #include <SD.h> #define PIN_SPI_CS 5 // The ESP32 pin GPIO5 #define FILE_NAME "/config.txt" #define KEY_MAX_LENGTH 30 // change it if key is longer #define VALUE_MAX_LENGTH 30 // change it if value is longer // variables int myInt_1; int myInt_2; float myFloat_1; float myFloat_2; String myString_1; String myString_2; void setup() { Serial.begin(9600); if (!SD.begin(PIN_SPI_CS)) { while (1) { Serial.println(F("SD CARD FAILED, OR NOT PRESENT!")); delay(1000); } } Serial.println(F("SD Card initialized.")); myInt_1 = SD_findInt(F("myInt_1")); myInt_2 = SD_findInt(F("myInt_2")); myFloat_1 = SD_findFloat(F("myFloat_1")); myFloat_2 = SD_findFloat(F("myFloat_2")); myString_1 = SD_findString(F("myString_1")); myString_2 = SD_findString(F("myString_2")); Serial.print(F("myInt_1 = ")); Serial.println(myInt_1); Serial.print(F("myInt_2 = ")); Serial.println(myInt_2); Serial.print(F("myFloat_1 = ")); Serial.println(myFloat_1); Serial.print(F("myFloat_2 = ")); Serial.println(myFloat_2); Serial.print(F("myString_1 = ")); Serial.println(myString_1); Serial.print(F("myString_2 = ")); Serial.println(myString_2); } void loop() { } bool SD_available(const __FlashStringHelper * key) { char value_string[VALUE_MAX_LENGTH]; int value_length = SD_findKey(key, value_string); return value_length > 0; } int SD_findInt(const __FlashStringHelper * key) { char value_string[VALUE_MAX_LENGTH]; int value_length = SD_findKey(key, value_string); return HELPER_ascii2Int(value_string, value_length); } float SD_findFloat(const __FlashStringHelper * key) { char value_string[VALUE_MAX_LENGTH]; int value_length = SD_findKey(key, value_string); return HELPER_ascii2Float(value_string, value_length); } String SD_findString(const __FlashStringHelper * key) { char value_string[VALUE_MAX_LENGTH]; int value_length = SD_findKey(key, value_string); return HELPER_ascii2String(value_string, value_length); } int SD_findKey(const __FlashStringHelper * key, char * value) { File configFile = SD.open(FILE_NAME); if (!configFile) { Serial.print(F("SD Card: Issue encountered while attempting to open the file ")); Serial.println(FILE_NAME); return; } char key_string[KEY_MAX_LENGTH]; char SD_buffer[KEY_MAX_LENGTH + VALUE_MAX_LENGTH + 1]; // 1 is = character int key_length = 0; int value_length = 0; // Flash string to string PGM_P keyPoiter; keyPoiter = reinterpret_cast<PGM_P>(key); byte ch; do { ch = pgm_read_byte(keyPoiter++); if (ch != 0) key_string[key_length++] = ch; } while (ch != 0); // check line by line while (configFile.available()) { int buffer_length = configFile.readBytesUntil('\n', SD_buffer, 100); if (SD_buffer[buffer_length - 1] == '\r') buffer_length--; // trim the \r if (buffer_length > (key_length + 1)) { // 1 is = character if (memcmp(SD_buffer, key_string, key_length) == 0) { // equal if (SD_buffer[key_length] == '=') { value_length = buffer_length - key_length - 1; memcpy(value, SD_buffer + key_length + 1, value_length); break; } } } } configFile.close(); // close the file return value_length; } int HELPER_ascii2Int(char *ascii, int length) { int sign = 1; int number = 0; for (int i = 0; i < length; i++) { char c = *(ascii + i); if (i == 0 && c == '-') sign = -1; else { if (c >= '0' && c <= '9') number = number * 10 + (c - '0'); } } return number * sign; } float HELPER_ascii2Float(char *ascii, int length) { int sign = 1; int decimalPlace = 0; float number = 0; float decimal = 0; for (int i = 0; i < length; i++) { char c = *(ascii + i); if (i == 0 && c == '-') sign = -1; else { if (c == '.') decimalPlace = 1; else if (c >= '0' && c <= '9') { if (!decimalPlace) number = number * 10 + (c - '0'); else { decimal += ((float)(c - '0') / pow(10.0, decimalPlace)); decimalPlace++; } } } } return (number + decimal) * sign; } String HELPER_ascii2String(char *ascii, int length) { String str; str.reserve(length); str = ""; for (int i = 0; i < length; i++) { char c = *(ascii + i); str += String(c); } return str; }
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code vers l'ESP32
  • Consultez le résultat sur le moniteur série.
COM6
Send
SD Card initialized. myInt_1 = 2 myInt_2 = -105 myFloat_1 = 0.74 myFloat_2 = -46.08 myString_1 = Hello myString_2 = newbiely.fr
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Le moniteur série affiche les valeurs des variables qui sont identiques aux valeurs enregistrées sur la carte micro SD.

Vous pouvez maintenant modifier le code pour ajouter plus de variables.

※ Note:

Le code ci-dessus ne tient pas compte de l'ordre des paires clé-valeur. Il recherchera la clé du début à la fin du fichier jusqu'à ce que la clé corresponde.

Vidéo

Références de fonction

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !