ESP8266 Đọc Cấu hình từ thẻ SD
Hướng dẫn này hướng dẫn bạn cách sử dụng một tệp cấu hình trên thẻ Micro SD dùng cho ESP8266, bao gồm các khía cạnh sau:
Đặt một tệp config.txt lên thẻ nhớ Micro SD, bao gồm các cặp khóa-giá trị.
Lập trình ESP8266 để đọc dữ liệu cấu hình từ thẻ nhớ Micro SD và lưu nó vào biến kiểu int.
Lập trình ESP8266 để đọc dữ liệu cấu hình từ thẻ nhớ Micro SD và lưu nó vào biến kiểu float.
Lập trình ESP8266 để đọc dữ liệu cấu hình từ thẻ nhớ Micro SD và lưu nó vào biến kiểu String.
| 1 | × | ESP8266 NodeMCU ESP-12E | | |
| 1 | × | Recommended: ESP8266 NodeMCU ESP-12E (Uno-form) | | |
| 1 | × | USB Cable Type-A to Type-C (for USB-A PC) | | |
| 1 | × | USB Cable Type-C to Type-C (for USB-C PC) | | |
| 1 | × | Micro SD Card | | |
| 1 | × | Micro SD Card Module | | |
| 1 | × | dây jumper | | |
| 1 | × | (Tùy chọn) MicroSD to SD Memory Card Adapter | | |
| 1 | × | (Khuyến nghị) Screw Terminal Expansion Board for ESP8266 | | |
| 1 | × | (Khuyến nghị) Power Splitter for ESP8266 Type-C | | |
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) | | |
Nếu bạn chưa quen với Module thẻ nhớ Micro SD, bao gồm sơ đồ chân, cách nó hoạt động và cách lập trình nó, hãy xem bài hướng dẫn ESP8266 - Thẻ nhớ Micro SD.
Mỗi cặp khóa-giá trị được giữ trên một dòng duy nhất của thẻ nhớ microSD, với khóa và giá trị được phân cách bằng ký tự =. Ngoài ra, mỗi cặp được phân tách khỏi các cặp khác bằng ký tự xuống dòng.
Đoạn mã ESP8266 sẽ tìm khóa và xác định giá trị tương ứng, lưu nó vào một biến. Biến này có thể là một int, float, hoặc String.

This image is created using Fritzing. Click to enlarge image
Xem thêm Sơ đồ chân ESP8266 và Cách cấp nguồn cho ESP8266.
※ Lưu ý:
Nếu bạn có một shield Ethernet hoặc bất kỳ shield nào khác có khay thẻ Micro SD, bạn sẽ không cần phải sử dụng Mô-đun thẻ Micro SD. Chỉ cần chèn thẻ Micro SD vào khay trên shield.
myString_1=Hello
myString_2=newbiely.com
myInt_1=2
myInt_2=-105
myFloat_1=0.74
myFloat_2=-46.08
Gắn thẻ nhớ Micro SD vào máy tính thông qua đầu đọc thẻ SD USB 3.0.
Đảm bảo thẻ nhớ Micro SD được định dạng FAT16 hoặc FAT32 (tìm kiếm hướng dẫn trực tuyến).
Đặt tập tin config.txt vào thư mục gốc của thẻ nhớ Micro SD.
Khi đã xong, rút thẻ nhớ Micro SD khỏi máy tính.
Kết nối thẻ nhớ Micro SD với ESP8266 bằng mô-đun thẻ Micro SD theo sơ đồ kết nối.
Sao chép mã dưới đây và mở nó bằng 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;
}
SD Card initialized.
myInt_1 = 2
myInt_2 = -105
myFloat_1 = 0.74
myFloat_2 = -46.08
myString_1 = Hello
myString_2 = newbiely.com
Bây giờ bạn có thể chỉnh sửa mã để thêm các biến bổ sung.
※ Lưu ý:
Mã không tính đến cách sắp xếp các cặp khóa-giá trị. Nó sẽ tìm kiếm từ đầu đến cuối tệp cho đến khi khóa được tìm thấy.
Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.