Сделайте 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.

Другие вопросы по тегам