Сделайте ArduinoJSON Array глобально доступным
Я уже довольно давно ломаю голову над этой проблемой. Я открываю соединение через веб-сокет из моего ESP32 с моим сервером NodeJS. При получении сообщения содержимое анализируется с помощью ArduinoJSON.
Я сохраняю проанализированный контент в глобальных переменных, чтобы получить к ним доступ в моем цикле void (). Каждый раз, когда приходит новое сообщение, оно перезаписывается. Так и должно быть.
Объявление переменной:
uint8_t brightness = 10;
uint8_t lastMillis = 0;
int ArrayPointer = 0;
int interval = 2000;
bool immediate = true;
const size_t capacity = JSON_ARRAY_SIZE(32) + JSON_OBJECT_SIZE(1) + 290;
После установки void ()
void onMessageCallback(WebsocketsMessage message) {
Serial.print("Got Message: ");
DynamicJsonBuffer jsonBuffer(capacity);
JsonObject & JSONResponse = jsonBuffer.parseObject(message);
JsonArray & PixelArray = JSONResponse["frame"];
brightness = JSONResponse["brightness"];
ArrayPointer = 0;
immediate = true;
}
void loop() {
client.poll();
if(millis() - lastMillis >= interval || immediate == true) {
// Here I would like to access the Variable PixelArray
lastMillis = millis();
}
}
Конечно, я не могу получить доступ к PixelArray в цикле void, потому что это другая область. Теперь мне нужен способ сделать PixelArray глобально доступным.
Что пробовал:
- Объявлен глобальный JsonArray перед void Setup(), но это вызвало ошибку;(.
- Назначение его другому (глобальному) массиву не сработало должным образом, потому что размер PixelArray варьируется.
Надеюсь, кто-нибудь сможет мне помочь;)
Заранее спасибо;)
PS: В настоящее время я использую ArduinoJson 5, но с обновлением проблем не возникнет.
1 ответ
Не делай так.
Вы должны использовать ArduinoJson только для сериализации и десериализации объектов JSON, а не для хранения состояния программы. В документации это очень ясно сказано.
Правильный способ сделать это (способ, которым разработан для использования пакет ArduinoJSON) - поддерживать внутреннюю структуру данных, сериализовать и десериализовать в нее ваши объекты JSON.
Таким образом, у вас будет глобальная переменная, которая будет вашим внутренним представлением PixelArray
а затем скопируйте в него значения из JsonArray, когда получите сообщение JSON. Вы используетеbrightness
правильно здесь; ты должен сделать то же самое сPixelArray
.