Hallo Allerseits,
Ich habe meinen Arduino Mega nun schon seit ein paar Wochen und bin jetzt an meinem ersten kleineren Projekt.
Momentan versuche ich das aktuelle Wetter von Openweathermap mithilfe eines ESP8266 zu erhalten. Das klappt auch hervorragend und die json kann ich auch ohne Probleme im Serial Monitor anschauen.
Nach einiger Zeit des Testens kann ich nun auch die json Deserialisierung und auf die einzelnen Informationen in den geschweiften Klammern zugreifen. Was ich allerdings für mein Projekt brauche, ist die Informationen in den eckigen Klammern, im genauen die weather id (Im Beispiel zeigt es 803). Ich habe herausgefunden, dass es sich bei den eckigen Klammern um ein Array handelt. Dieses muss ich anscheinend nochmals Deserialisierung?
Ich weis wirklich nicht wie ich es schaffe auf die Wetter ID zuzugreifen und finde die richtige Information auch nicht online.
Kann mir bitte jemand helfen dieses Problem zu lösen?
Hier meine json:
{"coord":{"lon":9.18,"lat":48.78},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":272.91,"feels_like":270.38,"temp_min":270.37,"temp_max":277.59,"pressure":1032,"humidity":92},"visibility":10000,"wind":{"speed":0.5},"clouds":{"all":74},"dt":1580979142,"sys":{"type":1,"id":1274,"country":"DE","sunrise":1580971628,"sunset":1581006451},"timezone":3600,"id":2825297,"name":"Stuttgart","cod":200}
Vielen Dank für jegliche Hilfe im Voraus.
Viele Grüße
Tommy56
February 6, 2020, 10:20am
2
Benutzt Du die Arduino-JSON-Lib ? Dann schau Dir mal dieses Beispiel an.
Ansonsten stelle Deinen Sketch (in Codetags) hier ein mit Links zu den verwendeten Libs.
Gruß Tommy
Hallo,
oder z.B. hier abschauen:
Gruß aus Berlin
Michael
Vielen Dank euch beiden für eure Antworten.
Hier ist der Code den ich verwende. Es ist nicht mein Code sondern stammt im Original von hier: IoT | Internet weather station with ESP8266 Wi-Fi module - SIMPLE PROJECTS
Ich habe ihn ein klein wenig abgewandelt und jetzt sieht er so aus:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> // http web access library
#include <ArduinoJson.h> // JSON decoding library
const char *ssid = "UPC9AFXXXXX";
const char *password = "y3bkctpXXXXXXX";
void setup() {
Serial.begin(9600);
delay(500);
Serial.print("Connecting.");
WiFi.begin(ssid, password); // access Wi-FI point
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
Serial.print(".");
}
Serial.println("connected\r\n");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare an object of class HTTPClient
// specify request destination
http.begin("http://api.openweathermap.org/data/2.5/weather?q=stuttgart,ger&APPID=8c9700b94ad904764930dXXXXXXXXXX");
int httpCode = http.GET(); // send the request
if (httpCode > 0) { // check the returning code
String payload = http.getString(); //Get the request response payload
DynamicJsonDocument jsonBuffer(1024);
// Parse JSON object
// alt JsonObject root = jsonBuffer.parseObject(payload);
DeserializationError error = deserializeJson(jsonBuffer, payload);
if (error) {
Serial.print("Deserialization failed with code: ");
Serial.println(error.c_str());
return;
}
/* Hier Weiter*/
JsonArray array = jsonBuffer["weather"].as<JsonArray>();
Serial.println("vor der for");
for(JsonVariant v : array) {
Serial.println(v.as<int>());
}
float wetterID = (float)(jsonBuffer["weather"]);
float temp = (float)(jsonBuffer["main"]["temp"]) - 273.15; // get temperature
int humidity = jsonBuffer["main"]["humidity"]; // get humidity
float pressure = (float)(jsonBuffer["main"]["pressure"]) / 1000; // get pressure
float wind_speed = jsonBuffer["wind"]["speed"]; // get wind speed
int wind_degree = jsonBuffer["wind"]["deg"]; // get wind degree
// print data
Serial.printf("Temperature = %.2f°C\r\n", temp);
Serial.printf("Humidity = %d %%\r\n", humidity);
Serial.printf("Pressure = %.3f bar\r\n", pressure);
Serial.printf("Wind speed = %.1f m/s\r\n", wind_speed);
Serial.printf("Wind degree = %d°\r\n\r\n", wind_degree);
Serial.println(wetterID);
}
http.end(); //Close connection
}
// delay(60000); // wait 1 minute
delay(15000); // wait 1 minute
}
// End of code.
@amithlon
Damit habe ich etwas rumgespielt, bekomme aber immer Fehler. Ich bin noch nicht so tief in der Programmierung des Arduiono...
Ich brauche im Grunde nur die ID aus der json aber weis eben nicht wie ich da dran komme...
Vielen Dank für eure Hilfe!
Moko
February 6, 2020, 5:03pm
5
Linkshaender:
@amithlon
Damit habe ich etwas rumgespielt, bekomme aber immer Fehler. Ich bin noch nicht so tief in der Programmierung des Arduiono...
Der Fehler liegt evtl an folgendem:
Hoffe es hilft Dir genauso weiter, wie uns deine Fehlermeldung.
Ich versteh schon und du hast ja recht.
Das ist mein Code in den ich ganz billig einfach die Sachen aus dem Beispiel reinkopiert habe:
#include <OpenWeatherMap.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> // http web access library
#include <ArduinoJson.h> // JSON decoding library
const char *ssid = "UPC9Axxxxx";
const char *password = "y3bkctxxxxxx";
OWMconditions owCC;
void setup() {
Serial.begin(9600);
delay(500);
Serial.print("Connecting.");
WiFi.begin(ssid, password); // access Wi-FI point
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
Serial.print(".");
}
Serial.println("connected\r\n");
}
void currentConditions(void) {
OWM_conditions *ow_cond = new OWM_conditions;
owCC.updateConditions(ow_cond, ow_key, "ru", "Moscow", "metric");
Serial.print("Latitude & Longtitude: ");
Serial.print("<" + ow_cond->longtitude + " " + ow_cond->latitude + "> @" + dateTime(ow_cond->dt) + ": ");
Serial.print(", icon: " + ow_cond->icon + ", descr: " + ow_cond->description + ", temp.: " + ow_cond->temp + ", press.: " + ow_cond->pressure);
Serial.println(", Wind :" + ow_cond->w_speed + ", degree: " + ow_cond->w_deg);
delete ow_cond;
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare an object of class HTTPClient
// specify request destination
http.begin("http://api.openweathermap.org/data/2.5/weather?q=stuttgart,ger&APPID=8c9700bxxxxxxxxxxxxxx");
int httpCode = http.GET(); // send the request
if (httpCode > 0) { // check the returning code
String payload = http.getString(); //Get the request response payload
DynamicJsonDocument jsonBuffer(1024);
// Parse JSON object
// alt JsonObject root = jsonBuffer.parseObject(payload);
DeserializationError error = deserializeJson(jsonBuffer, payload);
if (error) {
Serial.print("Deserialization failed with code: ");
Serial.println(error.c_str());
return;
}
/* Hier Weiter*/
JsonArray array = jsonBuffer["weather"].as<JsonArray>();
Serial.println("vor der for");
for(JsonVariant v : array) {
Serial.println(v.as<int>());
}
float wetterID = (float)(jsonBuffer["weather"]);
float temp = (float)(jsonBuffer["main"]["temp"]) - 273.15; // get temperature
int humidity = jsonBuffer["main"]["humidity"]; // get humidity
float pressure = (float)(jsonBuffer["main"]["pressure"]) / 1000; // get pressure
float wind_speed = jsonBuffer["wind"]["speed"]; // get wind speed
int wind_degree = jsonBuffer["wind"]["deg"]; // get wind degree
// print data
Serial.printf("Temperature = %.2f°C\r\n", temp);
Serial.printf("Humidity = %d %%\r\n", humidity);
Serial.printf("Pressure = %.3f bar\r\n", pressure);
Serial.printf("Wind speed = %.1f m/s\r\n", wind_speed);
Serial.printf("Wind degree = %d°\r\n\r\n", wind_degree);
Serial.println(wetterID);
}
http.end(); //Close connection
}
// delay(60000); // wait 1 minute
delay(15000); // wait 1 minute
}
// End of code.
Die Fehlermeldung lautet wie folgt:
Multiple libraries were found for "OpenWeatherMap.h"
Used: C:\Users\XXXXX\Documents\Arduino\libraries\openweathermap.org-ESP8266-master
In file included from C:\Users\XXXXX\Desktop\ELEGOO\8x8x8\Informationen aus dem Internet abrufen\Infos_aus_dem_Internet_abrufen\Infos_aus_dem_Internet_abrufen.ino:1:0:
C:\Users\XXXXXXX\Documents\Arduino\libraries\openweathermap.org-ESP8266-master/OpenWeatherMap.h:4:26: fatal error: JsonListener.h: No such file or directory
#include <JsonListener.h>
^
compilation terminated.
exit status 1
Error compiling for board Generic ESP8266 Module.
Hallo,
Linkshaender:
@amithlon
Damit habe ich etwas rumgespielt, bekomme aber immer Fehler. Ich bin noch nicht so tief in der Programmierung des Arduiono...
ok, war ja nur eine Idee...
Mal runtergeladen, WLAN-Daten und Key angepasst, compiliert ohne Fehler, meldet sich auch artig zumindest mit den aktuellen und den 5-Tage Daten. 16 Tage kam nicht, warum auch immer.
Bin vorsichtshalber noch von ru Moscow nach de Berlin umgezogen. ein Beispiel für tolle Programmierung ist es nicht unbedingt.
Vielleicht kann ja Tommy weiterhelfen.
Gruß aus Berlin
Michael
Ja, ArduinoJson.h hat in dem Sketch mit OpenWethermap.h nichts zu suchen.
@TO : Nimm doch einfach das Beispiel aus dem Link von Amithlon, ohne, außer der Location, etwas daran zu ändern.
Gruß Tommy
Hallo nochmals,
vielen Dank für eure Hilfe!
Ich hab einen Tipp hier aus dem Forum bekommen und es funktioniert.
Hier die Lösung damit es vielleicht auch jemand anderem hilft:
int id=jsonBuffer["weather"][0]["id"];
Ich danke euch vielmals für eure Hilfe!
Schönen Abend und Grüße