Arduino Đọc Cấu hình từ thẻ SD

Trong bài hướng dẫn này, chúng ta sẽ học cách sử dụng tệp cấu hình trên thẻ Micro SD. Cụ thể, chúng ta sẽ học:

tệp cấu hình thẻ sd cho Arduino micro

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

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (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 Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
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 biết về Mô-đun Thẻ Micro SD (cách bố trí chân, cách nó hoạt động, cách lập trình ...), hãy tìm hiểu về chúng trong hướng dẫn Arduino - Thẻ nhớ Micro SD.

Cách hoạt động

Các cặp khóa-giá trị được lưu sẵn trên thẻ nhớ Micro SD theo định dạng sau:

  • Mỗi cặp khóa-giá trị nằm trên một dòng. Nói cách khác, mỗi cặp khóa-giá trị được phân tách bằng ký tự xuống dòng.
  • Khóa và giá trị được phân tách bằng ký tự =.

Mã Arduino sẽ tìm kiếm khóa và tìm giá trị tương ứng, và lưu giá trị vào một biến. Kiểu biến có thể là int, float, hoặc String

Sơ đồ đấu dây

sơ đồ đấu nối mô-đun thẻ nhớ micro sd cho Arduino

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Nếu bạn sử dụng một Ethernet shield hoặc bất kỳ shield nào có khay đựng thẻ Micro SD, bạn không cần phải sử dụng Module thẻ Micro SD. Bạn chỉ cần chèn thẻ Micro SD vào khay đựng thẻ Micro SD trên shield.

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

  • Tạo file config.txt trên máy tính của bạn bằng Notepad hoặc Notepad++
  • Sao chép các cặp khóa-giá trị dưới đây và dán vào config.txt:
myString_1=Hello myString_2=ArduinoGetStarted.com myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • Kết nối thẻ nhớ Micro SD với PC 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 trên Google)
  • Sao chép config.txt vào thư mục gốc của thẻ nhớ Micro SD
  • Ngắt kết nối thẻ nhớ Micro SD khỏi PC
  • Kết nối thẻ nhớ Micro SD với Arduino qua Module thẻ Micro SD theo sơ đồ nối ở trên
  • Sao chép mã dưới đây và mở bằng Arduino IDE
/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-read-config-from-sd-card */ #include <SD.h> #define PIN_SPI_CS 4 #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ấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Xem kết quả trên 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 = ArduinoGetStarted.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Màn hình Serial Monitor hiển thị các giá trị từ các biến giống hệt với các giá trị được lưu trên thẻ nhớ microSD

Bây giờ bạn có thể chỉnh sửa mã để thêm nhiều biến hơn.

※ Lưu ý:

Đoạn mã ở trên không quan tâm đến thứ tự của các cặp khóa-giá trị. Nó sẽ tìm kiếm khóa từ đầu đến cuối tệp cho đến khi khóa được khớp.

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.