Arduino Nano - Ler Configuração do Cartão SD
Este tutorial ensina você a usar um arquivo de configuração em um Cartão Micro SD. Especificamente, vamos ver:
Como criar um arquivo config.txt em um Cartão Micro SD, contendo pares chave-valor
Como ler a configuração do Cartão Micro SD e salvá-la em uma variável int
Como ler a configuração do Cartão Micro SD e salvá-la em uma variável float
Como ler a configuração do Cartão Micro SD e salvá-la em uma variável String
Or you can buy the following kits:
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.
Se você não conhece o Módulo de Cartão Micro SD, incluindo a pinagem, como ele funciona e como programá-lo, confira o tutorial Arduino Nano - Cartão Micro SD .
Cada par chave-valor é armazenado no Cartão Micro SD em sua própria linha. A chave e o valor são separados por um sinal = . Um caractere de nova linha separa cada par chave-valor dos outros.
O código do Arduino Nano vai procurar a chave e localizar o valor associado, armazenando-o em uma variável. A variável pode ser do tipo int , float ou String .
This image is created using Fritzing . Click to enlarge image
This image is created using Fritzing . Click to enlarge image
Veja A melhor forma de alimentar o Arduino Nano e outros componentes .
myString_1=Hello
myString_2=ArduinoGetStarted.com
myInt_1=2
myInt_2=-105
myFloat_1=0.74
myFloat_2=-46.08
Conecte o Cartão Micro SD ao PC com um Leitor de Cartão SD USB 3.0.
Certifique-se de que o Cartão Micro SD esteja formatado como FAT16 ou FAT32 (você pode pesquisar instruções na internet).
Coloque o arquivo config.txt na pasta principal do Cartão Micro SD.
Desconecte o Cartão Micro SD do PC.
Conecte o Cartão Micro SD ao Arduino Nano usando o Módulo de Cartão Micro SD, seguindo o diagrama de ligação.
Copie o código abaixo e abra-o com o 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 Nano' 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 Nano on COM15
2
Agora você pode alterar o código para incluir variáveis adicionais.
※ Nota:
O código não leva em conta a sequência dos pares chave-valor. Ele vai percorrer o arquivo do início ao fim até encontrar a chave.
※ NOSSAS MENSAGENS
Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!