ESP32 - Konfiguration von der SD-Karte auslesen

In diesem Tutorial befassen wir uns mit der Nutzung einer Konfigurationsdatei auf einer microSD-Karte. Das Tutorial wird die folgenden Aspekte behandeln:

Dieses Tutorial ermöglicht es Ihnen, Konfigurationseinstellungen über eine auf der Micro-SD-Karte gespeicherte Datei zu verwalten und bietet Flexibilität für verschiedene Datentypen wie Ganzzahlen, Fließkommazahlen und Zeichenketten.

ESP32 MicroSD-Karten-Konfigurationsdatei

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Micro-SD-Karte
1×Micro-SD-Karten-Modul
1×Verbindungskabel
1×(Optional) MicroSD-zu-SD-Speicherkarten-Adapter
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über das Micro-SD-Kartenmodul

Nicht mit dem Micro-SD-Kartenmodul vertraut, einschließlich Pinbelegungen, Funktionalität und Programmierung? Erfahren Sie im Tutorial ESP32 - Micro SD Card mehr darüber.

Wie es funktioniert

Die Schlüssel-Wert-Paare sind gemäß dem folgenden Format auf der Micro-SD-Karte vorab gespeichert:

  • Jedes Schlüssel-Wert-Paar steht in einer Zeile. Mit anderen Worten ist jedes Schlüssel-Wert-Paar von den anderen durch einen Zeilenumbruch getrennt.
  • Der Schlüssel und der Wert werden durch das Zeichen = getrennt.

Der ESP32-Code sucht nach dem Schlüssel und findet den entsprechenden Wert und speichert den Wert in einer Variablen. Der Variablentyp kann int, float oder String sein.

Verdrahtungsdiagramm

ESP32 Mikro-SD-Karten-Modul Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

※ Notiz:

Wenn Sie ein Ethernet-Shield oder jedes Shield verwenden, das einen Micro-SD-Kartenhalter hat, benötigen Sie kein Micro-SD-Kartenmodul. Sie müssen die Micro-SD-Karte einfach in den Micro-SD-Kartenhalter am Shield einsetzen.

Wie man Konfigurationswerte in Variablen ausliest

  • Erstellen Sie die config.txt-Datei auf Ihrem PC über Notepad oder Notepad++
  • Kopieren Sie die untenstehenden Schlüssel-Wert-Paare und fügen Sie sie in die config.txt ein:
myString_1=Hello myString_2=newbiely.com myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • Schließen Sie die Micro-SD-Karte über einen USB 3.0 SD-Kartenleser an den PC an
  • Stellen Sie sicher, dass die Micro-SD-Karte FAT16 oder FAT32 formatiert ist (googeln Sie danach)
  • Kopieren Sie config.txt-Datei in das Stammverzeichnis der Micro-SD-Karte
  • Trennen Sie die Micro-SD-Karte vom PC
  • Verbinden Sie die Micro-SD-Karte gemäß dem oben gezeigten Verdrahtungsdiagramm über das Micro-SD-Kartenmodul mit dem ESP32
  • Kopieren Sie den untenstehenden Code und öffnen Sie ihn in der Arduino-IDE
/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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; }
  • Klicken Sie in der Arduino-IDE auf die Hochladen-Schaltfläche, um Code auf den ESP32 hochzuladen.
  • Sehen Sie das Ergebnis im Serial Monitor.
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.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Der serielle Monitor zeigt die Werte der Variablen, die mit den auf der microSD-Karte gespeicherten Werten identisch sind.

Jetzt können Sie den Code ändern, um weitere Variablen hinzuzufügen.

※ Notiz:

Der obige Code kümmert sich nicht um die Reihenfolge der Schlüssel-Wert-Paare. Er durchsucht die Datei von Anfang bis Ende nach dem Schlüssel, bis der Schlüssel gefunden wird.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!