Hallo,
ich bekomme bei jeder deserialisation außer mit DynamicJsonDocument diese Fehlermeldung:
D:\arduino_unterlagen\sketchbook\sketch_feb03a\sketch_feb03a.ino: In function 'void wetterdaten_auswerten(const String&)':
sketch_feb03a:91:14: error: 'ArduinoJson::V6213PB2::JsonDocument::JsonDocument()' is protected within this context
JsonDocument filter;
^~~~~~
In file included from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/BasicJsonDocument.hpp:7,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/DynamicJsonDocument.hpp:7,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson.hpp:33,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson.h:9,
from D:\arduino_unterlagen\sketchbook\sketch_feb03a\sketch_feb03a.ino:3:
D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/JsonDocument.hpp:280:3: note: declared protected here
JsonDocument() : pool_(0, 0) {}
^~~~~~~~~~~~
sketch_feb03a:91:14: error: 'ArduinoJson::V6213PB2::JsonDocument::~JsonDocument()' is protected within this context
JsonDocument filter;
^~~~~~
usw. ....
Aufbauend auf einem Beispiel, in dem eben DynamicJsonDocument verwendet wurde, habe ich in Wokwi einen Sketch gebaut, der die Zuordnung der API-Daten entsprechend vornimmt.
Läuft und die Daten stimmen.
Anschließend habe ich noch entsprechende Filter angelegt, läuft auch, egal in welcher Kombination von Dokumentenart und Filter.
Auf dem Rechner jedoch bricht alles außer rein DynamicJsonDocument wetter(1000) mit einer Fehlermeldung ab.
Ich habe den Code, den die Website (ArduinoJson Assistant 7 | ArduinoJson 7) generiert versucht, ebenfalls Abbruch.
Hier der Code, der zumindest hier läuft.
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// Wetterdaten ----------------------------------------------------
long sonnenaufgang[2];
long sonnenuntergang[2];
int wettersymbol[5];
float temp[5];
float windgeschwindigkeit[5];
float luftfeuchte[5];
float niederschlag[5];
//WiFi
const char* wifi_ssid = "Wokwi-GUEST"; // SSID
const char* wifi_password = ""; // Password
WiFiClient wifiClient;
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(115200);
// -> WLAN-Verbindung aufbauen
wifiConnect();
} // Ende setup
// -------------------------------------------------------------------------------
void loop() {
// WLAN-Verbindung prüfen
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
wifiConnect();
}
String wetterdaten = wetterdaten_holen();
wetterdaten_auswerten(wetterdaten);
Serial.println("Ende loop -------------------");
delay(5000);
} // Ende loop
// -------------------------------------------------------------------------------
String wetterdaten_holen() {
String wetterdaten = "";
HTTPClient http;
String apiUrl = "http://api.open-meteo.com/v1/dwd-icon?latitude=50.9042&longitude=12.08&hourly=temperature_2m,relative_humidity_2m,precipitation,weather_code,wind_speed_10m&daily=sunrise,sunset&wind_speed_unit=ms&timezone=Europe%2FBerlin&timeformat=unixtime&forecast_days=2&forecast_hours=24";
if (http.begin(wifiClient, apiUrl)) {
int httpCode = http.GET();
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK) {
wetterdaten = http.getString();
}
}
http.end();
//Serial.println("---------Beginn Daten-----------------------------");
//Serial.println(wetterdaten);
//Serial.println("---------Ende Daten----------------------------------------------------------");
}
return wetterdaten;
}
// ----------------------------------------------------------------------------
void wetterdaten_auswerten(const String& wetterdaten) {
JsonDocument filter;
JsonObject filter_hourly = filter["hourly"].to<JsonObject>();
filter_hourly["temperature_2m"][0] = true;
filter_hourly["relative_humidity_2m"][0] = true;
filter_hourly["precipitation"][0] = true;
filter_hourly["weather_code"][0] = true;
filter_hourly["wind_speed_10m"][0] = true;
JsonObject filter_daily = filter["daily"].to<JsonObject>();
filter_daily["sunrise"][0] = true;
filter_daily["sunset"][0] = true;
//DynamicJsonDocument wetter(1000);
//DeserializationError error = deserializeJson(wetter, wetterdaten);
//DeserializationError error = deserializeJson(wetter, wetterdaten, DeserializationOption::Filter(filter));
JsonDocument wetter;
//DeserializationError error = deserializeJson(wetter, wetterdaten);
DeserializationError error = deserializeJson(wetter, wetterdaten, DeserializationOption::Filter(filter));
if (error) {
Serial.print(F("Fehler beim Parsen der JSON-Daten: "));
Serial.println(error.c_str());
return;
}
JsonObject stunde = wetter["hourly"];
Serial.print("temp. ");
JsonArray stunde_temp = stunde["temperature_2m"];
for (int i = 0; i < 5; i++) {
temp[i] = stunde_temp[(i+1)*4] ;
Serial.print(temp[i]);
Serial.print("/");
}
Serial.println();
Serial.print("luftfeuchte: ");
JsonArray stunde_luftfeuchte = stunde["relative_humidity_2m"];
for (int i = 0; i < 5; i++) {
luftfeuchte[i] = stunde_luftfeuchte[(i+1)*4] ;
Serial.print(luftfeuchte[i]);
Serial.print("/");
}
Serial.println();
Serial.print("niederschlag ");
JsonArray stunde_niederschlag = stunde["precipitation"];
for (int i = 0; i < 5; i++) {
niederschlag[i] = stunde_niederschlag[(i+1)*4] ;
Serial.print(niederschlag[i]);
Serial.print("/");
}
Serial.println();
Serial.print("wettercode ");
JsonArray stunde_wettercode = stunde["weather_code"];
for (int i = 0; i < 5; i++) {
wettersymbol[i] = stunde_wettercode[(i+1)*4] ;
Serial.print(wettersymbol[i]);
Serial.print("/");
}
Serial.println();
Serial.print("windgeschw. ");
JsonArray stunde_windgeschwindigkeit = stunde["wind_speed_10m"];
for (int i = 0; i < 5; i++) {
windgeschwindigkeit[i] = stunde_windgeschwindigkeit[(i+1)*4] ;
Serial.print(windgeschwindigkeit[i]);
Serial.print("/");
}
Serial.println();
JsonObject tag = wetter["daily"];
Serial.print("sonnenaufgang ");
JsonArray tag_sonnenaufgang = tag["sunrise"];
for (int i = 0; i < 2; i++) {
sonnenaufgang[i] = tag_sonnenaufgang[i] ;
Serial.print(sonnenaufgang[i]);
Serial.print("/");
}
Serial.println();
Serial.print("sonnenuntergang ");
JsonArray tag_sonnenuntergang = tag["sunset"];
for (int i = 0; i < 2; i++) {
sonnenuntergang[i] = tag_sonnenuntergang[i] ;
Serial.print(sonnenuntergang[i]);
Serial.print("/");
}
Serial.println();
}
// -------------------------------------------------------------------------------
void wifiConnect() {
WiFi.begin(wifi_ssid, wifi_password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(250);
}
Serial.println(" connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// ----------------------------------------------------------------------------------
Bin etwas ratlos, was ich da falsch machen soll ...
cu