Как написать объект Arrey в EEPROM в ESP32
Привет, ребята, я получил дело с проектом в школе. Позвольте мне объяснить вам, что это такое.
Я получил микропроцессор ESP32.
Я использую этот ESP32, чтобы создать сеть WLAN и обслуживать некоторые html-страницы. Поэтому я использую его как точку доступа и веб-сервер одновременно.
Причина в том, что мне нужно, чтобы отобразить некоторую информацию с запросами GET и получить некоторую информацию с запросами POST для конфигурации ESP32.
В любом случае мне удалось без проблем обработать оба (GET и POST) запроса, используя библиотеку ESPAsyncWebServer GitHub из ESPAsyncWebServer.
Я использую специальный корень "/admin" для обработки запросов GET и POST для конфигурации.
Все отлично работает. Проблема возникает, когда я пытаюсь сохранить данные в виде массива внутри моей EEPROM.
Код структуры:
struct Hour{
String ring_in; //time -> "hh:mm"
String ring_out; //time -> "hh:mm"
String ring; //boolean -> "checked" or ""
String play_music; //boolean -> "checked" or ""
};
Код, который обрабатывает запросы POST в "/admin" и заполняет массив 27 параметрами POST.
server.on("/admin", HTTP_POST, [](AsyncWebServerRequest *request){ // ~~~ POST 192.148.4.1/admin
AsyncWebParameter* p = request->getParam("download", true);
Hour hours_values[7];
int counter = 0;
for(int i=0; i<7; i++){// Loop used to asaign the values from POST request.
hours_values[i].ring_in = request->arg(counter).c_str();
hours_values[i].ring_out = request->arg(counter+1).c_str();
hours_values[i].ring = request->arg(counter+2).c_str();
hours_values[i].play_music = request->arg(counter+3).c_str();
counter += 4;
}
for(int i=0; i<7; i++){ // Loop that proofs values are ok and just can't be loaded to EEPROM.
Serial.println(hours_values[i].ring_in);
Serial.println(hours_values[i].ring_out);
Serial.println(hours_values[i].ring);
Serial.println(hours_values[i].play_music);
}
EEPROM.put(0, hours_values); delay(500); EEPROM.end(); //THIS THING DOESN'T WORK.
request->send(200, "text/html", "Changes have been saved. Refresh to see the changes!");
});
Поэтому, когда я пытаюсь получить данные из EEPROM для обработки запроса GET, программа завершается неудачей.
Сообщение:
Rebooting... 8 июня 2016 г. 00:22:57RST:0xc (SW_CPU_RESET), загрузка:0x13 (SPI_FAST_FLASH_BOOT). Конфиг.: 0, SPIWP:0xee. 1 нагрузка:0x3fff0018, длина линзы:4:0x3fff001c, длина линзы:928 ho 0 tail 12 room 4 load:0x40078000, длина линки 9280:0x40080400, длина строки 5848 0x40080698
GET-код запроса "/admin":
server.on("/admin", HTTP_GET, [](AsyncWebServerRequest *request){ // ~~~ GET 192.148.4.1/admin
Hour hours[7] = EEPROM.get(0, hours_values); //Can't get data from here.
String html = "Some long long long html that includes values of Hours[] arrey"
request->send(200, "text/html", html);
});
Ребята, есть ли другой способ, которым я должен использовать методы EEPROM.put() и EEPROM.get(), когда мне приходится иметь дело с массивом структур, а не только со структурой? Или что-то еще?
Заранее спасибо!
1 ответ
Вы пробовали примеры EEPROM?
Попробуйте загрузить только пример и посмотрите, работает ли он, прежде чем загружать весь ваш код