POLECAM Ci te API (darmowe) : api.weatherapi.com
u mnie działa bez zarzutu (na ESP-WROVER 8MB PS-RAM)
wycinek z programu - tylko że ja korzystam z modułu z pamięcią PS-RAM i tam alokuje dane)
ale może się przyda
u mnie działa bez zarzutu (na ESP-WROVER 8MB PS-RAM)
wycinek z programu - tylko że ja korzystam z modułu z pamięcią PS-RAM i tam alokuje dane)
ale może się przyda
Kod:
void AirUpdate()
{
if (!F_ptrAir) ptrAirMalloc(); // jesli pamięć nie utworzona stwórz ją w PSRAM
#if SERIAL
#if ENGLISH
Serial.printf("\n[Air Update] Try Downloading JSON File from https://api.weatherapi.com/");
#endif
#if POLISH
Serial.printf("\n[Air Update] Próbuję pobrać plik JSON z https://api.weatherapi.com/");
#endif
#endif
#if ENGLISH
String path = "http://api.weatherapi.com/v1/current.json?key=" + PogodaToken + "&q=" + PogodaMiasto + "&aqi=yes";
#endif
#if POLISH
String path = "http://api.weatherapi.com/v1/current.json?key=" + PogodaToken + "&q=" + PogodaMiasto + "&aqi=yes";
#endif
HTTPClient http;
http.useHTTP10(true);
http.begin(client, path);
http.GET();
DynamicJsonDocument doc(2048);
DeserializationError error = deserializeJson(doc, http.getStream());
if(error)
{
F_AirUpdate = false; // aktualizacja nie powiodła się
#if SERIAL
#if ENGLISH
Serial.printf("\n[Air Update] DeserializeJson() failed: ");
Serial.println(error.c_str());
#endif
#if POLISH
Serial.printf("\n[Air Update] DeserializeJson() error: ");
Serial.println(error.c_str());
#endif
#endif
}
else
{
F_AirUpdate = true;
}
http.end();
if(F_AirUpdate)
{
#if SERIAL
#if ENGLISH
Serial.printf("\n[ESP] [Air Update] JsonDocument Usage Memory : %s bytes", String(doc.memoryUsage()));
Serial.printf("\n[ESP] [Air Update] [FREE RAM] : %d kB\n", ESP.getFreeHeap());
#endif
#if POLISH
Serial.printf("\n[ESP] [Air Update] JsonDocument zaalokował pamięć : %s bajtów", String(doc.memoryUsage()));
Serial.printf("\n[ESP] [Air Update] [FREE RAM] : %d kB\n", ESP.getFreeHeap());
#endif
#endif
// --- update struct Air in PSRAM !!! -------------------------------------------------- //
ptrAir->co = doc["current"]["air_quality"]["co"].as<double>();
ptrAir->o3 = doc["current"]["air_quality"]["o3"].as<double>();
ptrAir->no2 = doc["current"]["air_quality"]["no2"].as<double>();
ptrAir->so2 = doc["current"]["air_quality"]["so2"].as<double>();
ptrAir->pm25 = doc["current"]["air_quality"]["pm2_5"].as<double>();
ptrAir->pm10 = doc["current"]["air_quality"]["pm10"].as<double>();
ptrAir->defra = doc["current"]["air_quality"]["gb-defra-index"];
ptrAir->epa = doc["current"]["air_quality"]["us-epa-index"];
switch (ptrAir->epa)
{
#if POLISH
case 1: strcpy(ptrAir->description, "dobra"); break;
case 2: strcpy(ptrAir->description, "umiarkowana"); break;
case 3: strcpy(ptrAir->description, "niezdrowa dla alergików"); break;
case 4: strcpy(ptrAir->description, "niezdrowa"); break;
case 5: strcpy(ptrAir->description, "bardzo niezdrowa"); break;
case 6: strcpy(ptrAir->description, "niebezpieczna"); break;
default : strcpy(ptrAir->description, "błąd parsowania"); break;
#endif
#if ENGLISH
case 1: strcpy(ptrAir->description, "good"); break;
case 2: strcpy(ptrAir->description, "moderate"); break;
case 3: strcpy(ptrAir->description, "unhealthy for allergy sufferers"); break;
case 4: strcpy(ptrAir->description, "unhealthy"); break;
case 5: strcpy(ptrAir->description, "very unhealthy"); break;
case 6: strcpy(ptrAir->description, "dangerous"); break;
default : strcpy(ptrAir->description, "parsing error"); break;
#endif
}
// --- update struct Air in PSRAM !!! -------------------------------------------------- //
#if SERIAL
if (F_AirUpdate) AirShow(); // pokaż jeśli SERIAl jest TRUE
#endif
}
}
