В этом уроке мы будем получать данные о погоде с сайта
OpenWeatherMap и выводить в serial порт.
Схемы для данного проекта нет.
Регистрация на OpenWeatherMap и получения API ключа
Для начала необходимо зарегистрироваться на
OpenWeatherMap и получить API ключ для получения погоды.
Сначала перейдите на
OpenWeatherMap и нажмите "Sign Up"
После этого заполните все поля, поставьте галочки и нажмите "Create Account"
Далее на email который вы указали придет письмо со ссылкой для подтверждения аккаунта.
Перейдите на
home.openweathermap.org и перейдите на вкладку "API keys"
Скопируйте Ваш API ключ, он понадобится далее.
Программа
В
ESP8266 загрузите код ниже, но перед загрузкой в строке 7 напишите cвой API ключ, в строке 8 id вашего города (его можно узнать введя Ваш почтовый индекс на главной сайта OpenWeatherMap в поле "Weather in you city"), а в строках 5 и 6 напишите данные для подключения к Вашему WiFi.
C++:
#include <ArduinoJson.h> //Подключаем библиотеку для работы с данными в формате JSON
#include <ESP8266WiFi.h> //Подключаем библиотеку для работы с WiFi на ESP8266
const char* ssid = "ssid"; //Имя вашей сети WiFi
const char* password = "password"; //Пароль вашей сети WiFi
const char* api = "api"; //Ваш API ключ
const char* city = "id"; //ID вашего города
const char* host = "api.openweathermap.org";
String line; //Строка с JSON ответом OpenWeatherMap
void setup() {
Serial.begin(9600); //Инициализируем Serial на скорости 9600 бод
delay(10);
WiFi.begin(ssid, password); //Подключаемся к сети WiFi
while (WiFi.status() != WL_CONNECTED) {}//Ждем пока не подключимся к WiFi
jsonGet(); //Запускаем функцию получения данных в формате JSON
}
void loop() {
StaticJsonBuffer<2000> jsonBuffer; //Создаем буфер на 2000 символов
JsonObject& root = jsonBuffer.parseObject(line); //Передаем строку с данными для обработки
if (!root.success()) {
Serial.println("parseObject() failed"); //Если ошибка, сообщаем об этом
jsonGet(); //Получаем данные от сервера снова
return; //И начинаем заново
}
Serial.println(); //В serial переходим на новую строку
String name = root["name"]; //Получаем имя
Serial.println("name:" + name); //И выводим в Serial
float tempK = root["main"]["temp"]; //Получаем температуру из структуры main
float tempC = tempK - 273.15; //Переводим кельвины в цельси
Serial.println("temp: " + String(tempC) + " C"); //Выводим данные в Serial
//Далее: то-же самое, но другие данные
float tempKmin = root["main"]["temp_min"]; //Минимальная температура
float tempCmin = tempKmin - 273.15;
Serial.println("temp min: " + String(tempCmin) + " C");
float tempKmax = root["main"]["temp_max"]; //Максимальная температура
float tempCmax = tempKmax - 273.15;
Serial.println("temp max: " + String(tempCmax) + " C");
int pressurehPa = root["main"]["pressure"]; //Давление
float pressure = pressurehPa/1.333;
Serial.println("pressure: " + String(pressure) + " mmHc");
int humidity = root["main"]["humidity"]; //Влажность
Serial.println("humidity: " + String(humidity) + " %");
float windspeed = root["wind"]["speed"]; //Скорость ветра
Serial.println("wind speed: " + String(windspeed) + " m/s");
int winddeg = root["wind"]["deg"]; //Температура ветра
Serial.println("wind deg :" + String(winddeg));
Serial.println();
Serial.println();
delay(50000); //Ждем 50 секунд и начинаем заново(чаще нельзя, если вы на бесплатном тарифе)
}
void jsonGet() {
WiFiClient client; //Инициализируем клиента WiFi
if (!client.connect(host, 80)) { //Подключаемся к серверу
Serial.println("connection failed"); //Если ошибка, пишем в serial
return; //И пробуем снова
}
//Делаем GET запрос на сервер:
client.println("GET /data/2.5/weather?id=" + String(city) + "&appid=" + String(api) + " HTTP/1.1");
client.println("Host: api.openweathermap.org");
client.println("Connection: close");
client.println();
delay(1500);
while(client.available()){ //Если получили ответ от сервера...
line = client.readStringUntil('\r'); //Добавляем полученные данные в строку line
}
}