Yritän saada säätietoja näkyviin Arduinoon openweathermap.org -palvelusta, saan vastauksen palvelimelta, mutta koodi antaa virheilmoituksen.
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HttpClient.h>
const char *ssid = "xxxx";
const char *password = "xxxx";
const char *apiKey = "xxxx";
const char *apiEndpoint = "https://api.openweathermap.org/data/2.5/weather?lat=61.4981&lon=23.7444&appid=";
void getWeatherData() {
// Luo WiFiClient-objekti
WiFiClient client;
// Muodosta API-kutsu
String apiURL = String(apiEndpoint) + apiKey;
Serial.print("Lähetetään HTTP-pyyntö: ");
Serial.println(apiURL);
// Yhdistä palvelimeen
if (client.connect("api.openweathermap.org", 80)) {
// Lähetä HTTP-pyyntö
client.print(String("GET ") + apiURL + " HTTP/1.1\r\n" +
"Host: api.openweathermap.org\r\n" +
"User-Agent: ArduinoWiFi/1.1\r\n" +
"Connection: close\r\n\r\n");
} else {
Serial.println("Yhteys epäonnistui");
return;
}
// Odota vastausta
while (!client.available()) {
delay(4000);
}
// ##
String responseHeader = client.readStringUntil('\r\n\r\n');
String response = client.readString();
Serial.println("Vastaus:");
Serial.println(response);
// ##
// Lue vastaus JSON-muodossa
DynamicJsonDocument jsonDoc(1024);
DeserializationError jsonError = deserializeJson(jsonDoc, client);
if (jsonError) {
Serial.print("JSON-parsinta epäonnistui: ");
Serial.println(jsonError.c_str());
} else {
// Tulosta säätiedot
const char *description = jsonDoc["weather"][0]["description"];
float temperature = jsonDoc["main"]["temp"];
Serial.print("Sää: ");
Serial.println(description);
Serial.print("Lämpötila: ");
Serial.println(temperature);
}
// Sulje yhteys
client.stop();
}
void setup() {
Serial.begin(115200);
// Yhdistetään WiFi-verkkoon
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(5000);
Serial.println("Yhdistetään WiFi-verkkoon...");
}
Serial.println("Yhdistetty WiFi-verkkoon!");
// Hae säätiedot ja tulosta ne sarjaporttiin
getWeatherData();
}
void loop() {
// Ei tehdä mitään tässä ohjelmassa
}COM-porttiin tulostuu seuraavaa:
Vastaus:
Server: openresty
Date: Mon, 20 Nov 2023 08:44:38 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 460
Connection: close
X-Cache-Key: /data/2.5/weather?lat=61.5&lon=23.74
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST
{"coord":{"lon":23.7444,"lat":61.4981},"weather":[{"id":741,"main":"Fog","description":"fog","icon":"50d"}],"base":"stations","main":{"temp":271.45,"feels_like":268.64,"temp_min":271.05,"temp_max":271.99,"pressure":1015,"humidity":98},"visibility":600,"wind":{"speed":2.06,"deg":210},"clouds":{"all":100},"dt":1700469878,"sys":{"type":2,"id":2081862,"country":"FI","sunrise":1700462700,"sunset":1700487383},"timezone":7200,"id":661226,"name":"Amuri","cod":200}
JSON-parsinta epäonnistui: IncompleteInputLaitteena Arduino Giga R1 WiFi
Osaisiko joku auttaa?
timodemus kirjoitti:
//... String response = client.readString(); Serial.println("Vastaus:"); Serial.println(response); // ## // Lue vastaus JSON-muodossa DynamicJsonDocument jsonDoc(1024); DeserializationError jsonError = deserializeJson(jsonDoc, client); //...
Minusta näyttää että lainaamani kohdan ekalla rivillä luet kaiken palvelimelta tulevan, jonka jälkeen tuon pätkän viimesiellä rivillä olevalla Jsonia lukeavalla koodilla ei ole mitään luettavaa.
Voisit kenties ratkaista ongelman lukemalla rivi kerrallaan ja lopettamalla kun tulee tyhjä rivi.
Nyt en löydä mistään esimerkkiä miten tulostetaan String rivi kerrallaan.
Olennaista ei ole tulostaminen vaan lukeminen.
Jotenkin tänne päin (en ole koodannut Arduinoa)
while (client.connected() && client.available()) {
String line = client.readStringUntil('\n');
//if (line.isEmpty()) break;
//Tai ehkä parempi jos rivi sattuisi olemaan \r
if (line.length()<2) break;
Serial.println(line);
}Kiitos Grez, poistin koodista
// ##
String responseHeader = client.readStringUntil('\r\n\r\n');
String response = client.readString();
Serial.println("Vastaus:");
Serial.println(response);
// ##ja laitoin sen tilalle antamasi koodin.
Nyt saan tulostettua kaikki säätiedot mitä haluan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.