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:
Eine config.txt-Datei auf der microSD-Karte platzieren, die Schlüssel-Wert-Paare enthält.
ESP8266 programmieren, die Konfigurationsdaten von der microSD-Karte zu lesen und in einer int-Variablen zu speichern.
ESP8266 programmieren, die Konfigurationsdaten von der microSD-Karte zu lesen und in einer float-Variablen zu speichern.
ESP8266 programmieren, die Konfigurationsdaten von der microSD-Karte zu lesen und in einer String-Variablen zu speichern.
Oder Sie können die folgenden Kits kaufen:
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.
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.
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.

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.
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.
#include <SD.h>
#define PIN_SPI_CS D8
#define FILE_NAME "config.txt"
#define KEY_MAX_LENGTH 30
#define VALUE_MAX_LENGTH 30
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);
}
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];
int key_length = 0;
int value_length = 0;
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);
while (configFile.available()) {
int buffer_length = configFile.readBytesUntil('\n', SD_buffer, 100);
if (SD_buffer[buffer_length - 1] == '\r')
buffer_length--;
if (buffer_length > (key_length + 1)) {
if (memcmp(SD_buffer, key_string, key_length) == 0) {
if (SD_buffer[key_length] == '=') {
value_length = buffer_length - key_length - 1;
memcpy(value, SD_buffer + key_length + 1, value_length);
break;
}
}
}
}
configFile.close();
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.
SD Card initialized.
myInt_1 = 2
myInt_2 = -105
myFloat_1 = 0.74
myFloat_2 = -46.08
myString_1 = Hello
myString_2 = newbiely.com
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.
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.