☰ Оглавление

Создание домашнего погодного виджета с помощью Arduino и Raspberry

С вами снова Артем Лужецкий и мы продолжаем создавать свой собственный "Умный дом". На очереди - объединение устройств в сеть, часть 1.

Для создания умного дома, необходимо объединить все умные устройства в единую сеть. Для этого Arduino UNO не подойдет в своей обычной комплектации. Часто данная плата работает как периферийное устройство, которое связывает датчики или устройства вместе и уже отсылает данные в “мозг”. На роль данного “мозга” отлично подойдет Raspberry pi. Подробно рассказывать об этой плате я не буду. Она обладает всеми нужными функциями маломощного сервера, что для iot устройств отлично подходит.

Можно несколькими путями связать два устройства, но мы воспользуемся проводным подключением через UART – USB. На нашем сайте уже есть подробная статья, которая расскажет вам о данном способе подключения: https://arduinoplus.ru/podkluchenie-raspberry-arduino/ , и поэтому опустим инструкцию по подключению и применению.

Используем Open Weather Map

Итак, первое, что мы делаем — это используем уже готовый погодный сервис, на котором мы будем брать всю нужную нам информацию о всех городах мира. Сервис - Open Weather Map. Сайт - https://openweathermap.org/.  Для управления функциями данного сайта нужен специальный ключ, который нам дадут после создания аккаунта. После того, как вы его создали, переходим по ссылке “API keys”

И вот тот ключ, который мы будем использовать в нашем коде.

Если ключ у вас есть, то отлично, переходите к пункту два.

Теперь я попробую кратко, но информативно описать все, что в итоге будет происходить между raspberry pi и сервисом OpenWeatherMap. Raspberry отправляет http запрос на сервер, который в ответ отправляет json ответ (также возможет XML и HTML ответ, но их мы рассматривать не будем, про них можно узнать на офицальном сайте).

Выглядит это как-то так:

Запрос на сайт - http://api.openweathermap.org/data/2.5/weather?q=Rostov-na-Donu&appid=b6fc7c896bb814a45e2ea7e2b44758f3&units=metric\

Ответ:

Да, много непонятных символов, но на самом дела каждый элемент запроса и ответа несет в себе нужную информацию.

В запросе есть несколько изменяемых элементов.

  1. Город: weather?q=Rostov-na-Donu
  2. Ключ: appid=b6fc7c896bb814a45e2ea7e2b44758f3
  3. Измерение: units=metric

В запросе можно изменить “город”, и информация ответа будет соответствовать данному городу. “Ключ” вы подставляете свой, который вы получил в пункте 1. “Измерение” влияет на единицы измерения полученного ответа. Есть 3 разных измерения: standard;  metric; imperial.
Разницу между всеми измерениями можно узнать по ссылке: https://openweathermap.org/weather-data.

В json ответе есть несколько пунктов и подпунктов, которые можно отдельно вызывать в программе, также есть другие пункты, которых в ответе может и не быть, если такого события не случается. В городе нет дождя или снега, то в ответе не будет про них информации. Также все возможные пункты в отправленном вам файле можно узнать на официальном сайте.

Программа для Raspberry pi

Raspberry будет связываться с погодным сервисом по команде от Arduino, позже отправлять обратно полученную информацию про город на Arduino. В этом нет логического смысла, ведь raspberry может все сделать абсолютно сама, но для того, чтобы научиться связывать дынные платы между собой, данный опыт будет очень полезным.

Для начала попробуем сделать так, чтобы полученную информацию от сервера мы могли увидеть своими глазами и убедится, что наш код и сервис работает исправно.

В ответ на введённый город ‘Moscow’, он мне выдал точные данные про Москву на ближайшие 3 часа. Убедитесь, что вы вводите правильное название города, на карте open weather map вы можете посмотреть правильные названия, так мой родной город "Ростов-на-дону" (анг. "Rostov-on-Don") там называется "Rostov-na-Donu", что может изначально немного смутить.

Если у вас все получилось, то немного измените код, по которому из serial-порта будет приходить текст, в нашем случае название городов, raspberry подключается к погодному сервису и находит ближайшие погодные данные по присланному городу и после этого отправляет часть этих данных обратно.

Программа на Arduino UNO

Данная плата будет исполнять те функции, которые были в одной из прошлых статей (управление на расстоянии), а именно, отправлять команды и принимать информацию, которую позже мы сможем посмотреть через ЖК-дисплей.

С помощью потенциометра мы выбираем один из трех городов (Ростов-на-Дону, Санкт-Петербург, Москва) и нажимаем на кнопку, чтобы отправить данные о выбранном городе на raspberry. Если данные пришли, то нам будет показан список погодных условий данного города на ближайшее время, а также его географические координаты.

Всю электроную схему подключения модулей к arduino  вы можете узнать из прошлой статьи “Управление умным домом на расстоянии (продолжение)”, оно не отличается.

Вы можете скачать или скопировать мой код ниже:

Если у вас все получилось, то вы можете поэкспериментировать с погодным ресурсом и добавить больше автоматики, подробно о возможностях погодного виджета вы найдете на просторах сети. Первая часть подошла к концу и увидимся скоро во второй части, где мы поговорим о протоколе MQTT и его реализации. Становитесь умнее вместе с вашим умным домом!

Ардуино+
Больше интересного ↓