Arduino - Configuratie lezen van SD-kaart

In deze tutorial leert u hoe u het configbestand op een Micro SD-kaart gebruikt. In detail gaan we leren:

Arduino Micro SD Card Config File

Hardware Benodigd

1×Arduino Uno R3
1×USB 2.0-kabel type A/B
1×Micro SD-kaart
1×Micro SD-kaartmodule
1×Jumperdraden
1×USB 3.0 SD-kaartlezer
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables STEM V3 Starterskit (Arduino inbegrepen)
1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over Micro SD-kaartmodule

Als u niet bekend bent met de Micro SD-kaartmodule (pinout, werking, programmeren, etc.), leer er meer over in de Arduino - Micro SD Card tutorial.

Hoe het werkt

De key-value paren zijn vooraf opgeslagen op de Micro SD-kaart volgens het volgende formaat:

  • Elk key-value paar staat op een eigen regel. Met andere woorden, elk key-value paar wordt gescheiden door een regeleinde
  • De key en value worden gescheiden door een = teken

De Arduino-code doorzoekt de key en vindt de bijbehorende waarde, en slaat deze waarde op in een variabele. Het type van de variabele kan int, float of String zijn.

Aansluitschema

Arduino Micro SD Card Module Wiring Diagram

This image is created using Fritzing. Click to enlarge image

※ Notiz:

Als u een Ethernet shield of een ander shield gebruikt met een Micro SD-kaarthouder, hoeft u de Micro SD-kaartmodule niet te gebruiken. U hoeft alleen de Micro SD-kaart in de houder op het shield te plaatsen.

Hoe config te lezen naar variabelen

  • Maak een config.txt bestand aan op uw pc via Notepad of Notepad++
  • Kopieer onderstaande key-value paren en plak deze in het config.txt bestand:
myString_1=Hello myString_2=ArduinoGetStarted.com myInt_1=2 myInt_2=-105 myFloat_1=0.74 myFloat_2=-46.08
  • Verbind de Micro SD-kaart met de pc via de USB 3.0 SD-kaartlezer
  • Zorg ervoor dat de Micro SD-kaart geformatteerd is als FAT16 of FAT32 (zoek online hoe dit te doen)
  • Kopieer het config.txt bestand naar de rootmap van de Micro SD-kaart
  • Koppel de Micro SD-kaart los van de pc
  • Verbind de Micro SD-kaart met de Arduino via de Micro SD-kaartmodule volgens het bovenstaande aansluitschema
  • Kopieer onderstaande code en open deze in de Arduino IDE
/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }
  • Klik op de knop Upload in de Arduino IDE om de code naar de Arduino te uploaden
  • Bekijk het resultaat in de 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  
  • De Serial Monitor toont de waarden van de variabelen die exact overeenkomen met de waarden die op de Micro SD-kaart zijn opgeslagen

U kunt de code nu aanpassen om meer variabelen toe te voegen.

※ Notiz:

De bovenstaande code let niet op de volgorde van key-value paren. Het zoekt de key van begin tot eind van het bestand totdat een match wordt gevonden.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!