아두이노 나노 - SD 카드에서 구성 읽기 | Arduino Nano - Read Config from SD Card

이 튜토리얼은 Micro SD 카드에서 설정 파일을 사용하는 방법을 알려줍니다. 구체적으로, 우리는 다음을 살펴볼 것입니다:

Arduino Nano Micro SD Card Config File

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×Micro SD Card Amazon
1×Micro SD Card Module 쿠팡 | Amazon
1×Jumper Wires Amazon
1×USB 3.0 SD Card Reader Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Adapter for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

마이크로 SD 카드 모듈에 대하여

Micro SD 카드 모듈, 핀 배치, 작동 방법 및 프로그래밍 방법을 잘 모르신다면, Arduino Nano - Micro SD Card 튜토리얼을 확인하세요.

작동 원리

각 키-값 쌍은 자체 줄에 Micro SD 카드에 저장됩니다. 키와 값은 = 기호로 구분됩니다. 새 줄 문자가 다른 키-값 쌍들과 각각을 분리합니다.

아두이노 나노 코드는 키를 찾아서 연결된 값을 찾아내어 변수에 저장할 것입니다. 변수는 int, float, 또는 String 타입일 수 있습니다.

선연결

마이크로 SD 카드 모듈을 Arduino Nano에 연결하려면 남성에서 여성으로의 점퍼 와이어를 사용할 수 있습니다.

Arduino Nano Micro SD Card Module wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

또는 마이크로 SD 카드 모듈을 브레드보드에 꽂은 다음 남성 대 남성 점퍼 와이어를 사용할 수 있습니다.

Arduino Nano Micro SD Card Module wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

변수로 구성 읽는 방법

  • 메모장이나 Notepad++를 사용하여 PC에 config.txt 파일을 생성하세요.
  • 다음의 키-값 쌍을 복사하여 config.txt에 붙여넣으세요:
myString_1=Hello myString_2=ArduinoGetStarted.com myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • USB 3.0 SD 카드 리더기를 사용하여 마이크로 SD 카드를 PC에 연결하세요.
  • 마이크로 SD 카드가 FAT16 또는 FAT32로 포맷되어 있는지 확인하세요 (온라인에서 지침을 찾을 수 있습니다).
  • config.txt 파일을 마이크로 SD 카드의 메인 폴더에 놓으세요.
  • PC에서 마이크로 SD 카드를 분리하세요.
  • 배선도를 따라 아두이노 나노에 마이크로 SD 카드 모듈을 사용하여 마이크로 SD 카드를 연결하세요.
  • 아래 코드를 복사하고 아두이노 IDE로 열어보세요.
/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-read-config-from-sd-card */ #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 카드 실패, 또는 존재하지 않음")); while (1); // 더 이상 아무 것도 하지 마세요: } Serial.println(F("SD 카드 초기화 됨.")); 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 카드: 파일 열기 오류 ")); Serial.println(FILE_NAME); return; } char key_string[KEY_MAX_LENGTH]; char SD_buffer[KEY_MAX_LENGTH + VALUE_MAX_LENGTH + 1]; // 1은 = 문자입니다 int key_length = 0; int value_length = 0; // Flash 문자열을 문자열로 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--; // \r을 잘라냅니다 if (buffer_length > (key_length + 1)) { // 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; }
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 Arduino Nano에 업로드합니다.
  • 결과를 확인하기 위해 시리얼 모니터를 확인하세요.
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  

시리얼 모니터는 마이크로 SD 카드에 저장된 것과 동일한 변수의 값을 표시합니다.

이제 코드를 변경하여 추가 변수를 포함할 수 있습니다.

※ NOTE THAT:

코드는 키-값 쌍의 순서를 고려하지 않습니다. 키를 찾을 때까지 시작부터 끝까지 파일을 검색합니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!