Чтение настроек с microSD
Я изменил скетч SD для ESP8266
, чтобы он считывал настройки WIFI
из файла с именем CONFIG.TXT
. Формат содержимого текстового файла: SETTING=VALUE
. Пример.
SSID=AP001
KEY=AP001
Мне удается разделить SETTING
и VALUE
Мой код:
#include <SPI.h>
#include <SD.h>
File myFile;
void readWifiConfig() {
Serial.println("Initializing SD card...");
char temp;
bool isSetting = true;
if (!SD.begin(4)) {
Serial.println("Initialization failed!");
return;
}
Serial.println("Initialization done.");
myFile = SD.open("CONFIG.TXT");
if (myFile) {
Serial.println("CONFIG.TXT");
while (myFile.available()) {
temp = myFile.read();
if (isSetting == true) {
if (temp == '=') {
Serial.print("="); //Записываем '=' в консоль
isSetting = false;
}
else {
Serial.print(temp); //Записываем часть SETTING в консоль
}
}
else {
if (temp == '\n' || temp == '\r') {
isSetting = true;
}
else {
Serial.print(temp); //Записывает часть VALUE в консоль
}
}
}
myFile.close();
} else {
Serial.println("Can't open CONFIG.TXT");
}
}
void setup() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin(115200);
delay(10);
readWifiConfig();
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
}
Выход:
Initializing SD card...
Initialization done.
CONFIG.TXT
SSID=AP001
KEY=AP001
Я хочу записать значения в соответствующие переменные, но не знаю как.
char* ssid;
char* key;
@JFetz2191, 👍0
Обсуждение3 ответа
Лучший ответ:
▲ 0
Новый улучшенный код.
Формат файла:
$SETTINGNAME=SETTINGVALUE;
Новый код:
#include <SPI.h>
#include <SD.h>
File configFile;
uint8_t filePosition;
uint8_t workingIndex = 0;
uint8_t settingNameValuePositions[16][3];
uint8_t temporaryBufferPosition = 0;
char temporaryBuffer[32];
void setPosition(uint8_t mrk) {
settingNameValuePositions[workingIndex][mrk] = filePosition;
}
uint8_t getPosition(uint8_t idx, uint8_t mrk) {
return settingNameValuePositions[idx][mrk];
}
void addToBuffer(char inp) {
temporaryBuffer[temporaryBufferPosition] = inp;
temporaryBufferPosition++;
}
void resetBuffer() {
temporaryBufferPosition = 0;
memset(temporaryBuffer, 0, sizeof(temporaryBuffer));
}
char* requestSetting(char *settingName) {
for (int i = 0; i < workingIndex; i++) {
uint8_t nS = getPosition(i,0); //$
uint8_t eQ = getPosition(i,1); //=
uint8_t vE = getPosition(i,2); //;
bool isFound = false;
resetBuffer();
for (int g = nS; g < eQ - 1; g++) {
configFile.seek(g);
addToBuffer(configFile.read());
}
if (strcmp(temporaryBuffer,settingName) == 0) {
isFound = true;
resetBuffer();
}
for (int g = eQ; g < vE - 1; g++) {
configFile.seek(g);
addToBuffer(configFile.read());
}
if (isFound) {
isFound = false;
return temporaryBuffer;
}
}
return "0";
}
bool readConfigFile(char* fileName) {
//Serial.println("ИНИЦИАЛИЗАЦИЯ SD-КАРТЫ");
if (!SD.begin()) {
//Serial.println("ОШИБКА ИНИЦИАЛИЗАЦИИ SD-КАРТЫ");
return false;
}
else {
//Serial.println("ИНИЦИАЛИЗАЦИЯ SD-КАРТЫ ЗАВЕРШЕНА");
//Serial.println("ОТКРЫТИЕ ФАЙЛА: " + String(fileName));
configFile = SD.open(fileName);
if (!configFile) {
//Serial.println("ОШИБКА ОТКРЫТИЯ ФАЙЛА: " + String(fileName));
return false;
}
else {
//Serial.println("ФАЙЛ " + имя_файла + " ОТКРЫТО");
//Serial.println("ПОИСК ПОЗИЦИИ МАРКЕРА");
while (configFile.available()) {
char fileChar = configFile.read();
filePosition = configFile.position();
switch (fileChar) {
case '$':
setPosition(0);
break;
case '=':
setPosition(1);
break;
case ';':
setPosition(2);
workingIndex++;
}
}
}
return true;
}
}
void setup() {
Serial.begin(115200);
readConfigFile("CONFIG.TXT"); //ИМЯ ФАЙЛА
Serial.println(requestSetting("SETTINGNAME"));
}
void loop() {
}
,
@JFetz2191
▲ 0
Как-то мне удалось это сделать, но мой код неоптимизирован. Пожалуйста, дайте мне знать, если я сделал что-то плохое.
Я изменил формат контента на этот, так мне стало намного проще. (CONFIG.TXT)
SSID%&WIFIAP001&%KEY%&PASS1234&
Новый код.
#include <SPI.h>
#include <SD.h>
File myFile;
char wifiSsid[63];
char wifiKey[63];
char temp;
char settingSsid[5] = "SSID";
char settingKey[4] = "KEY";
char settingTemp[10];
char valueTemp[63];
int settingTempLastPos = 0;
int valueTempLastPos = 0;
int percentCount = 0;
int andCount = 0;
bool isSetting = true;
bool ssidValueFound = false;
bool keyValueFound = false;
void readWifiConfig() {
Serial.println("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("Initialization failed!");
return;
}
Serial.println("Initialization done.");
myFile = SD.open("CONFIG.TXT");
if (myFile) {
Serial.println("CONFIG.TXT");
while (myFile.available()) {
temp = myFile.read();
if (temp == '%') {
percentCount++;
isSetting = true;
if (percentCount == 2) {
//Serial.println(settingTemp);
if (strcmp(settingSsid,settingTemp) == 0) {
Serial.println("SSID SETTING FOUND");
//ЕСЛИ ОБНАРУЖЕНЫ, ПОДНИМИТЕ ФЛАГ ДЛЯ ДОБАВЛЕНИЯ ЗНАЧЕНИЯ К МАССИВУ СИМВОЛОВ SSID
ssidValueFound = true;
}
else if (strcmp(settingKey,settingTemp) == 0) {
Serial.println("KEY SETTING FOUND");
//ЕСЛИ ОБНАРУЖЕНЫ, ПОДНИМИТЕ ФЛАГ ДЛЯ ДОБАВЛЕНИЯ ЗНАЧЕНИЯ К МАССИВУ СИМВОЛОВ SSID
keyValueFound = true;
}
memset(&settingTemp[0], 0, sizeof(settingTemp));
settingTempLastPos = 0;
percentCount = 0;
}
}
else if (temp == '&') {
andCount++;
isSetting = false;
if (andCount == 2) {
//Serial.println(valueTemp);
if (ssidValueFound) {
//Serial.println(valueTemp);
memcpy(wifiSsid,valueTemp,63);
//Serial.println(wifiSsid);
ssidValueFound = false;
}
else if (keyValueFound) {
//Serial.println(valueTemp);
memcpy(wifiKey,valueTemp,63);
//Serial.println(wifiKey);
keyValueFound = false;
}
memset(&valueTemp[0], 0, sizeof(valueTemp));
valueTempLastPos = 0;
andCount = 0;
}
}
else {
if (isSetting == true) { //настройка
settingTemp[settingTempLastPos] = temp;
settingTempLastPos++;
}
else if (isSetting == false) { //значение
valueTemp[valueTempLastPos] = temp;
valueTempLastPos++;
}
}
}
//Serial.println(settingTemp);
myFile.close();
} else {
Serial.println("Can't open CONFIG.TXT");
}
}
void setup() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin(115200);
delay(10);
readWifiConfig();
Serial.println(wifiSsid);
Serial.println(wifiKey);
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
}
Выход:
Initializing SD card...
Initialization done.
CONFIG.TXT
SSID SETTING FOUND
KEY SETTING FOUND
WIFIAP001
PASS1234
,
@JFetz2191
▲ 0
uint8_t settingNameValuePositions[16][3];
Если у вас более 16 переменных, это приведет к сбою вашего веб-сервера.
Если ваш файл конфигурации содержит более 256 символов, вам следует использовать short вместо uint8_t.
,
@Sebastian Franco
Смотрите также:
- Загрузить сайт с SD-карты
- Любой способ использовать DMA для передачи данных на SD - карту в ESP8266
- Два интерфейса SD-карты на одном ESP8266?
- Чтение SD-карты на ATMEGA328 с ESP826
- ESP8266 Извлечение учетных данных с SD делает esp неспособным подключиться
- Получить LFN из SFN с SdFat
- Выбор контакта SdFat.h ESP8266
- Как читать и записывать EEPROM в ESP8266
Я не вижу вопроса, @Michel Keijzers
Вы не можете просто написать в указатель, вам нужно выделить буфер и скопировать туда данные., @Chris Stratton