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:
Lưu một tệp config.txt lên thẻ nhớ Micro SD. Tệp chứa các cặp khóa-giá trị
Đọc cấu hình từ thẻ nhớ Micro SD và lưu vào biến int
Đọc cấu hình từ thẻ nhớ Micro SD và lưu vào biến float
Đọc cấu hình từ thẻ nhớ Micro SD và lưu vào biến String
| 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) | | |
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á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

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.
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
#include <SD.h>
#define PIN_SPI_CS 4
#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 = ArduinoGetStarted.com
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.
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.