#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 миллисекунд)
}