ESP8266 - Konfiguration von der SD-Karte lesen

Dieses Tutorial führt Sie durch die Nutzung einer Konfigurationsdatei auf einer Micro-SD-Karte mit ESP8266 und umfasst die folgenden Aspekte:

ESP8266 NodeMCU Mikro-SD-Karten-Konfigurationsdatei

Erforderliche Hardware

1×ESP8266 NodeMCU
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 ESP8266
1×(Empfohlen) Stromverteiler für ESP8266 Typ-C

Oder Sie können die folgenden Kits kaufen:

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 Micro-SD-Kartenmodul

Wenn Sie mit dem Micro-SD-Kartenmodul, einschließlich seiner Pinbelegung, Funktionsweise und wie man es programmiert, nicht vertraut sind, dann schauen Sie sich das ESP8266 - Micro SD Card Tutorial an.

Wie es funktioniert

Jedes Schlüssel-Wert-Paar wird auf einer einzelnen Zeile der Micro-SD-Karte gehalten, wobei der Schlüssel und der Wert durch ein =-Zeichen getrennt sind. Zusätzlich ist jedes Paar durch einen Zeilenumbruch von den anderen getrennt.

Der ESP8266-Code wird nach dem Schlüssel suchen und den zugehörigen Wert finden und in einer Variablen speichern. Diese Variable kann ein int, float oder String sein.

Verdrahtungsdiagramm

ESP8266 NodeMCU Mikro-SD-Kartenmodul Verdrahtungsdiagramm

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

Weitere Informationen finden Sie unter ESP8266-Pinbelegung und wie man ESP8266 und andere Komponenten mit Strom versorgt.

※ Notiz:

Wenn Sie ein Ethernet-Shield oder ein anderes Shield besitzen, das einen Micro-SD-Kartenhalter enthält, müssen Sie das Micro-SD-Kartenmodul nicht verwenden. Legen Sie einfach die Micro-SD-Karte in den Halter auf dem Shield ein.

Wie man Konfigurationswerte in Variablen liest

  • Erstellen Sie eine config.txt-Datei auf Ihrem PC mit Notepad oder Notepad++.
  • Kopieren Sie die folgenden Schlüssel-Wert-Paare in die config.txt:
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 (Anleitungen online nachschlagen).
  • Kopieren Sie die Datei config.txt in das Hauptverzeichnis der Micro-SD-Karte.
  • Wenn Sie fertig sind, trennen Sie die Micro-SD-Karte vom PC.
  • Schließen Sie die Micro-SD-Karte gemäß dem Verdrahtungsdiagramm über das Micro-SD-Kartenmodul an den ESP8266 an.
  • Kopieren Sie den untenstehenden Code und öffnen Sie ihn mit der Arduino IDE.
/* * Dieser ESP8266 NodeMCU Code wurde von newbiely.de entwickelt * Dieser ESP8266 NodeMCU 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/esp8266/esp8266-read-config-from-sd-card */ #include <SD.h> #define PIN_SPI_CS D8 #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)) { Serial.println(F("SD Card failed, or not present")); while (1); // don't do anything more: } 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: error on opening 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; }
  • Klicke auf die Hochladen-Schaltfläche in der Arduino-IDE, um den Code an den ESP8266 zu senden.
  • Überprüfe den Seriellen Monitor auf das Ergebnis.
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 an, die den auf der Micro-SD-Karte gespeicherten Werten entsprechen.

Sie können nun den Code ändern, um zusätzliche Variablen einzubeziehen.

※ Notiz:

Der Code berücksichtigt nicht die Anordnung der Schlüssel-Wert-Paare. Es wird vom Anfang bis zum Ende der Datei suchen, 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!