ESP8266 - SD 카드에서 구성 읽기 | ESP8266 - Read Config from SD Card

이 튜토리얼은 ESP8266에서 마이크로 SD 카드의 설정 파일 사용법을 다루며, 다음과 같은 측면을 포함합니다:

ESP8266 NodeMCU Micro SD Card Config File

준비물

1×ESP8266 NodeMCU Amazon
1×Micro 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) 5V Power Adapter for ESP8266 Amazon
1×(Optional) ESP8266 Screw Terminal Adapter Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

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

마이크로 SD 카드 모듈을 잘 모르시거나, 핀 배치, 작동 방식, 프로그래밍 방법 등에 대해 알고 싶으시면 ESP8266 - 마이크로 SD 카드 튜토리얼을 확인해 보세요.

작동 원리

각 키-값 쌍은 Micro SD 카드의 단일 줄에 위치하며, 키와 값은 = 문자로 구분됩니다. 추가적으로, 각 쌍은 새 줄 문자로 다른 쌍들로부터 분리됩니다.

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

선연결

ESP8266 NodeMCU Micro SD Card Module wiring diagram

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

ESP8266의 핀 배치ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.

※ NOTE THAT:

이더넷 실드나 Micro SD 카드 홀더가 포함된 다른 실드가 있으면, Micro SD 카드 모듈을 사용할 필요가 없습니다. 단순히 Micro SD 카드를 실드의 홀더에 삽입하면 됩니다.

구성을 변수로 읽는 방법

  • 메모장이나 Notepad++를 사용하여 PC에 config.txt 파일을 생성하세요.
  • 다음 키-값 쌍을 config.txt에 복사하여 붙여넣으세요:
myString_1=Hello myString_2=newbiely.kr myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • USB 3.0 SD 카드 리더기를 사용하여 PC에 마이크로 SD 카드를 연결하세요.
  • 마이크로 SD 카드가 FAT16 또는 FAT32로 포맷되었는지 확인하세요(온라인에서 지침을 찾아보세요).
  • config.txt 파일을 마이크로 SD 카드의 메인 디렉토리에 넣으세요.
  • 완료되면, PC에서 마이크로 SD 카드를 분리하세요.
  • 배선도대로 마이크로 SD 카드 모듈을 사용하여 ESP8266에 마이크로 SD 카드를 연결하세요.
  • 아래에 주어진 코드를 복사하고 Arduino IDE로 열어보세요.
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/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 // 키가 더 길면 변경하세요 #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 카드 ")); 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; // 플래시 문자열을 문자열로 변환 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; }
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 ESP8266으로 보냅니다.
  • 결과를 확인하려면 시리얼 모니터를 확인하세요.
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.kr
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!