Arduino JSON OpenWeatherMap

Bonjour,

Je souhaite récupérer plusieurs valeurs de température et les exploiter avec la bibliothèque Arduino JSON.

{
   "cod": "200",
   "message": 0,
   "cnt": 2,
   "list":    [
            {
         "dt": 1664182800,
         "main":          {
            "temp": 8.21,
            "feels_like": 6.96,
            "temp_min": 8.21,
            "temp_max": 12,
            "pressure": 1014,
            "sea_level": 1014,
            "grnd_level": 972,
            "humidity": 94,
            "temp_kf": -3.79
         },
         "weather": [         {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04d"
         }],
         "clouds": {"all": 100},
         "wind":          {
            "speed": 2.17,
            "deg": 237,
            "gust": 4.27
         },
         "visibility": 10000,
         "pop": 0,
         "sys": {"pod": "d"},
         "dt_txt": "2022-09-26 09:00:00"
      },
            {
         "dt": 1664193600,
         "main":          {
            "temp": 12.84,
            "feels_like": 11.93,
            "temp_min": 12.84,
            "temp_max": 16.11,
            "pressure": 1013,
            "sea_level": 1013,
            "grnd_level": 971,
            "humidity": 67,
            "temp_kf": -3.27
         },
         "weather": [         {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04d"
         }],
         "clouds": {"all": 99},
         "wind":          {
            "speed": 4.81,
            "deg": 258,
            "gust": 8.02
         },
         "visibility": 10000,
         "pop": 0,
         "sys": {"pod": "d"},
         "dt_txt": "2022-09-26 12:00:00"
      }
   ],
   "city":    {
      "id": 2998285,
      "name": "Arrondissement de Limoges",
      "coord":       {
         "lat": 45.75,
         "lon": 1.3333
      },
      "country": "FR",
      "population": 292998,
      "timezone": 7200,
      "sunrise": 1664171177,
      "sunset": 1664214348
   }
}

Ci-dessus un exemple de renvoi, je souhaite récupérer la deuxième valeur de température.

  StaticJsonDocument<1024>doc;
  deserializeJson(doc, result);

  String temp = doc["list"][1]["main"]["temp"];
  Serial.print("temperature :");
  Serial.println(temp);
  int temperature = temp.toInt();

Voici mon code. Sans le [1] je récupère la première valeur de température. Mon objectif est donc de récupérer la deuxième valeur de température qui se trouve dans la deuxième accolade de "list". Je cru comprendre dans la doc que je pouvais choisir avec [0] ou [1] pour choisir quelle sous-division de list je souhaite récupérer.

Mais cela me retourne NULL.

Si quelqu'un est capable de m'expliquer. Merci.

Devrait te retourner 8.21

Devrait te retourner 12.84

ce code devrait vous imprimer toutes les températures trouvées

#include <ArduinoJson.h>

const char* json = R"--8<--(
  {
   "cod": "200",
   "message": 0,
   "cnt": 2,
   "list":    [
            {
         "dt": 1664182800,
         "main":          {
            "temp": 8.21,
            "feels_like": 6.96,
            "temp_min": 8.21,
            "temp_max": 12,
            "pressure": 1014,
            "sea_level": 1014,
            "grnd_level": 972,
            "humidity": 94,
            "temp_kf": -3.79
         },
         "weather": [         {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04d"
         }],
         "clouds": {"all": 100},
         "wind":          {
            "speed": 2.17,
            "deg": 237,
            "gust": 4.27
         },
         "visibility": 10000,
         "pop": 0,
         "sys": {"pod": "d"},
         "dt_txt": "2022-09-26 09:00:00"
      },
            {
         "dt": 1664193600,
         "main":          {
            "temp": 12.84,
            "feels_like": 11.93,
            "temp_min": 12.84,
            "temp_max": 16.11,
            "pressure": 1013,
            "sea_level": 1013,
            "grnd_level": 971,
            "humidity": 67,
            "temp_kf": -3.27
         },
         "weather": [         {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04d"
         }],
         "clouds": {"all": 99},
         "wind":          {
            "speed": 4.81,
            "deg": 258,
            "gust": 8.02
         },
         "visibility": 10000,
         "pop": 0,
         "sys": {"pod": "d"},
         "dt_txt": "2022-09-26 12:00:00"
      }
   ],
   "city":    {
      "id": 2998285,
      "name": "Arrondissement de Limoges",
      "coord":       {
         "lat": 45.75,
         "lon": 1.3333
      },
      "country": "FR",
      "population": 292998,
      "timezone": 7200,
      "sunrise": 1664171177,
      "sunset": 1664214348
   }
}
)--8<--";

void setup() {
  Serial.begin(115200);

  StaticJsonDocument<512> doc;
  StaticJsonDocument<200> filter;
  filter["list"][0]["main"]["temp"] = true;

  DeserializationError error = deserializeJson(doc, json, DeserializationOption::Filter(filter));

  if (error) {
    Serial.print("deserializeJson() failed: ");
    Serial.println(error.c_str());
    return;
  }

  for (JsonObject l : doc["list"].as<JsonArray>()) {
    float temp = l["main"]["temp"];
    Serial.println(temp, 3); // 3 chiffres après la virgule
  }
}

void loop() {}

Bonjour,

J'avais compris cela également mais cela me retourne NULL

Je vais tester votre code merci

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.