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:

ESP8266 NodeMCU tệp cấu hình thẻ nhớ micro sd

Phần cứng cần chuẩn bị

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)

Về Mô-đun Thẻ nhớ Micro SD

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.

Cách hoạt động

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.

Sơ đồ đấu dây

sơ đồ đấu nối của mô-đun thẻ micro sd ESP8266 NodeMCU.

This image is created using Fritzing. Click to enlarge image

Xem thêm Sơ đồ chân ESP8266Cá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.

Cách đọc cấu hình vào các biến

  • Tạo một tập tin config.txt trên máy tính của bạn bằng Notepad hoặc Notepad++.
  • Sao chép và dán các cặp khóa-giá trị sau vào config.txt:
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.
/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/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; }
  • Nhấn nút Tải lên trên Arduino IDE để gửi mã đến ESP8266.
  • KiểmTra Serial Monitor để xem kết quả.
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  
  • Serial Monitor hiển thị các giá trị của các biến giống với những giá trị được lưu trên thẻ micro SD.

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.

Video Tutorial

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.