Парсинг данных о качестве воздуха с сайта iqair.com

Denokop

✩✩✩✩✩✩✩
22 Сен 2019
11
0
Добрые люди кто силён в програмировании, мож кто подскажет как спарсить данные с сайта www.iqair.com для своего города о качестве воздуха с помощью ключа API
используя плату ESP8266 и выводить данные в сериал порт. Поделитесь кодом для примера. Планирую использовать для виджета и выводить на олед дисплей.
 

Denokop

✩✩✩✩✩✩✩
22 Сен 2019
11
0
Пример запроса
curl --location -g 'http://api.airvisual.com/v2/city?city=Los Angeles&state=California&country=USA&key={{YOUR_API_KEY}}'
ответ
{
"status": "success",
"data": {
"city": "Los Angeles",
"state": "California",
"country": "USA",
"location": {
"type": "Point",
"coordinates": [
-118.4108248,
34.0193936
]
},
"current": {
"pollution": {
"ts": "2025-09-08T08:00:00.000Z",
"aqius": 36,
"mainus": "p2",
"aqicn": 19,
"maincn": "p1"
},
"weather": {
"ts": "2025-09-08T08:00:00.000Z",
"ic": "01n",
"hu": 66,
"pr": 1017,
"tp": 20,
"wd": 146,
"ws": 1.57,
"heatIndex": 20
}
}
}
}
 

Bruzzer

★★★★✩✩✩
23 Май 2020
720
222
Как спарсить, может помочь ИИ.
Если программирование вас интересует, советую попробовать использовать помощь ИИ для типовых задач.
 

Denokop

✩✩✩✩✩✩✩
22 Сен 2019
11
0
Давай лучше я скину готовую структуру скетча в которой я немного разбираюсь. А в целом я не силён в программировании.
@Denokop ,если я дам тебе простые функции, которые распарсивают строку json, сам разберешься?
Давай лучше я скину готовую структуру скетча в которой я немного разбираюсь. А в целом я не силён в программировании.
Мож что сможешь подправить или изменить или добавить
 

Denokop

✩✩✩✩✩✩✩
22 Сен 2019
11
0
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

// Константы для подключения к Wi-Fi
const char* ssid = "********"; // Замените на имя вашей сети Wi-Fi
const char* password = "********"; // Замените на пароль от вашей сети Wi-Fi

// Константы для API IQAir
const char* apiKey = "******************"; // Замените на ваш API-ключ IQAir
const char* host = "api.iqair.com";
const String city = "Tashkent"; // Город
const String state = "Tashkent City"; // Область/регион (может потребоваться уточнение для API)
const String country = "Uzbekistan"; // Страна

// URL запроса данных для конкретного города/области/страны
String apiRequestUrl = "/v2/city?city=" + city + "&state=" + state + "&country=" + country + "&key=" + String(apiKey);

void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n");

// Подключение к Wi-Fi
Serial.printf("Подключение к %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" ПОДКЛЮЧЕНО");
Serial.print("IP-адрес: ");
Serial.println(WiFi.localIP());
}

void loop() {
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
HTTPClient http;

Serial.println("\nОтправка HTTP GET запроса...");

// Подключение к хосту и выполнение запроса
http.begin(client, "http://" + String(host) + apiRequestUrl);
int httpCode = http.GET();

if (httpCode > 0) {
// HTTP-запрос успешен
Serial.printf("[HTTP] GET... код: %d\n", httpCode);

if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println("Получен ответ (JSON):");
// Serial.println(payload); // Раскомментируйте для просмотра всего JSON

// Парсинг JSON с помощью ArduinoJson
// Рекомендуемый размер буфера можно рассчитать с помощью помощника на ArduinoJson.org
// Для этого API может потребоваться буфер около 1024-2048 байт.
DynamicJsonDocument doc(2048);
DeserializationError error = deserializeJson(doc, payload);

if (!error) {
// Успешный парсинг JSON
Serial.println("\nУспешный парсинг JSON:");

// Извлечение данных
int aqiUS = doc["data"]["current"]["pollution"]["aqius"];
int aqiCN = doc["data"]["current"]["pollution"]["aqicn"];
float temperature = doc["data"]["current"]["weather"]["tp"];
int humidity = doc["data"]["current"]["weather"]["hu"];
String mainPollutant = doc["data"]["current"]["pollution"]["mainus"].as<String>();

// Вывод данных в Serial Monitor
Serial.printf("AQI US: %d\n", aqiUS);
Serial.printf("AQI CN: %d\n", aqiCN);
Serial.printf("Температура: %.1f C\n", temperature);
Serial.printf("Влажность: %d %%\n", humidity);
Serial.printf("Основной загрязнитель (US): %s\n", mainPollutant.c_str());

} else {
// Ошибка парсинга JSON
Serial.print(F("Ошибка deserializeJson(): "));
// Serial.println(error.f_str());
}
}
} else {
// Ошибка HTTP-запроса
Serial.printf("[HTTP] GET... не удалось, ошибка: %s\n", http.errorToString(httpCode).c_str());
}

http.end();
}

// Ожидание перед следующим запросом (например, 5 минут)
Serial.println("\nОжидание 5 минут перед следующим запросом...");
delay(300000); // Задержка в 5 минут (300000 миллисекунд)
}
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
101
19
www.youtube.com
ну и что ? это работает?

на это обрати внимание...
// Serial.println(payload); // Раскомментируйте для просмотра всего JSON
убедись что у тебя есть ответ от сервера
 

Denokop

✩✩✩✩✩✩✩
22 Сен 2019
11
0
ну и что ? это работает?

на это обрати внимание...
// Serial.println(payload); // Раскомментируйте для просмотра всего JSON
убедись что у тебя есть ответ от сервера
Работает и выдает это...........
 

Вложения

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
101
19
www.youtube.com
@Denokop, Ошибка 400 (Bad Request) — это тип HTTP-ошибки, который означает, что сервер не смог обработать запрос, отправленный пользователем на сервер из-за синтаксических ошибок или неверной структуры данных.
Сделай вывод в сериал url. И проверь его через браузер.