Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Arduino Giga - säätiedot

timodemus [20.11.2023 10:54:25]

#

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: IncompleteInput

Laitteena Arduino Giga R1 WiFi
Osaisiko joku auttaa?

Grez [20.11.2023 11:11:00]

#

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.

timodemus [20.11.2023 12:55:52]

#

Nyt en löydä mistään esimerkkiä miten tulostetaan String rivi kerrallaan.

Grez [20.11.2023 17:29:50]

#

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);
}

timodemus [20.11.2023 19:25:03]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta