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 Amazon
1 × USB 2.0 cable type A/B (for USB-A PC) Amazon
1 × USB 2.0 cable type C/B (for USB-C PC) Amazon
1 × Micro SD Card Amazon
1 × Micro SD Card Module Amazon
1 × dây jumper Amazon
1 × (Tùy chọn ) MicroSD to SD Memory Card Adapter Amazon
1 × (Khuyến nghị ) Screw Terminal Block Shield for Arduino Uno Amazon
1 × (Khuyến nghị ) Sensors/Servo Expansion Shield for Arduino Uno Amazon
1 × (Khuyến nghị ) Breadboard Shield for Arduino Uno Amazon
1 × (Khuyến nghị ) Enclosure for Arduino Uno Amazon
1 × (Khuyến nghị ) Prototyping Base Plate & Breadboard Kit for Arduino UNO Amazon
Or you can buy the following kits:
1 × DIYables STEM V3 Starter Kit (Arduino included) Amazon
1 × DIYables Sensor Kit (18 sensors/displays) Amazon
Tiết lộ: Một số liên kết trong bài viết này là liên kết tiếp thị Amazon và có thể nhận hoa hồng theo chính sách của chương trình.
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;
}
∞
Newbiely | Arduino IDE 2.3.8
8
Serial .println ("Hello World!" );
Message (Enter to send message to 'Arduino Uno' on 'COM15')
SD Card initialized.
myInt_1 = 2
myInt_2 = -105
myFloat_1 = 0.74
myFloat_2 = -46.08
myString_1 = Hello
myString_2 = ArduinoGetStarted.com
Ln 11, Col 1
Arduino Uno on COM15
2
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.