Замість вступу
Проста домашня метеостанція на ESP8266 NodeMCU, прогноз погоди і доступ через Інтернет – для початку поясню, що саме я реалізував у проекті, описаному в даній публікації. Елементарна домашня погодна станція, яка відображає поточну температуру і вологість повітря, атмосферний тиск і висоту (дуже приблизну) над рівнем моря, а також доступна через локальну мережу Wi-Fi і навіть з Інтернету, може бути без проблем реалізована за допомогоб мікроконтролера ESP8266 NodeMCU. Одним знайбільших плюсів даного мікроконтролера є наявність вбудованого Wi-Fi модуля, що дає змогу бавитися в Інтернет Речей (IoT) не виходячи з дому. Також в рамках даного проекту ми будемо діставати інформацію про прогноз погоди і відображати її разом з показами давачів на веб-сервері реалізованому на ESP8266.
Використане обладнання:
- Мікроконтролер ESP8266 (модель ESP-12E NODEMCU);
- Давач атмосферного тиску і температури BMP280;
- Цифровий термометр DS18B20;
- Давач температури і вологості повітря DHT11;
- Макетна плата, провідники.
Налаштування і програмування мікроконтролера ESP8266 тут розглядати не буду, алдже Інтернет переповнений різного роду інструкціями як це зробити. Свій NodeMCU я програмував через Arduino IDE. Також не буду детально зупинятися над підключенням необхідних бібліотек. Дана публікація є лише трохи допрацьованою компіляцією кількох цікавих статей, посилання на які можна знайти внизу. Я додав деякі доволі корисні функціональні можливості такі як доступ до показів підключених давачів через Інтернет та прогнозування погоди за допомогою API викликів до сервісу, який надає доступ до метео даних з усього світу.
Розділимо процес побудови метеостанції на кілька етапів:
- Підключення давачів до мікроконтролера;
- Програмування мікроконтролера;
- Підключення мікроконтролера до локальної Wi-Fi мережі і відображення показів давачів за зверненням до ESP8266 по IP адресі;
- Відкриття доступу до показів давачів із мережі Інтернет;
- Відображення прогнозу погоди.
Підключення давачів до мікроконтролера
Загалом і BMP280 і DS18B20 і DHT11 придатні як давачі температури, але точність вимірювання у них різна. Тому беспосередньо для визначення температури повітря я використав DS18B20, для вимірювання вологості повітря – DHT11, а для визначення атмосферного тиску та висоти (яка у свою чергу обчислюється із температури і тиску) – модуль BMP280. Схема підключення стає зрозумілою, якщо глянути на код програми.
Давач BMP280 –> мікроконтролер:
#define BMP_SCK D1
#define BMP_MISO D4
#define BMP_MOSI D2
#define BMP_CS D3
Цифровий термометр DS18B20 –> мікроконтролер:
#define ONE_WIRE_BUS D5
Давач DHT11 –> мікроконтролер:
uint8_t DHTPin = D6;
Програмування мікроконтролера ESP8266
Для програмування метеостанції я використовував наступні бібліотеки:
#include <Arduino_JSON.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
Повний вихідний код програми можна знайти за посиланням в кінці публікації. Код готовий до використання, але не забудьте замінити назву та пароль мережі Wi-Fi для підключення мікроконтролера, координати вашого міста і ваш API ключ для прогнозу погоди:
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Replace the next line with your API Key
#define ONECALLKEY "REPLACE_WITH_YOUR_API_KEY"
// Sample Lat and Lon for Lviv, UA
float myLatitude = 49.8383; //<-----------------------------in range to use GPS coordinates
float myLongitude = 24.0232; // Coordinates for Lviv, UA. Change these for your city
Підключення мікроконтролера ESP8266 до локальної Wi-Fi мережі і відображення показів по IP адресі
Після підключення усіх давачів і завантаження програмного коду в пам’ять мікроконтролера, метеостанція повинна автоматично під’єднатися до вказаної в ssid мережі Wi-Fi. В більшості випадків роутер динамічно видасть для мікроконтролера локальну IP адресу за допомогою DHCP сервера. Дізнатися її можна двома способами: відкрити Serial Monitor (якщо використовуєте Arduino IDE) або переглянути перелік клієнтів в адмін консолі вашого роутера.
Serial Monitor у Arduino IDE:
IP адреса мікроконтролера у налаштуваннях Wi-Fi роутера:
Якщо все зроблено правильно, то перейшовши у браузері по отриманій IP адресі з будь-якого девайсу, що підключений до нашої локальної Wi-Fi мережі, ми побачимо щось подібне:
Відкриття доступу до показів давачів із мережі Інтернет
Тепер ми робимо нашу метеостанцію доступною із мережі Інтернет. Якщо у вас немає виділеної провайдером статичної IP адреси, а як правило її немає, то доведеться скористатися сервісами типу DynDNS або NoIP. В моєму випадку це NoIP. Дані сервіси необхідні для того аби закріпити відкритий нами порт роутера на IP адресі метеостанції за статичним іменем.
Для початку потрібно відкрити порт 80 для IP адреси мікроконтролера в налаштуваннях роутера. В роутерах різних виробників цей процес може відрізнятися, так само як і можуть відрізнятися назви пунків меню налаштувань, але як правило, це буде щось типу Port forwarding чи Virtual servers. Можна просто погуглити або подивитися в інструкцію конкретно вашої моделі мережевого обладняння. У моєму випадку з TP-Link це виглядає насткпним чином:
Далі реєструємося у сервісі NoIP та створюємо тестовий домен для нашої метеостанції. У полі IP / Target буде відображатися мережева адреса вашого роутера:
Завдяки виконаним діям тепер ми можемо звернутися за створеним доменним іменем з Інтернету із будь-якох точки світу і отримати покази, які збирає наша проста домашня метеостанція. Виглядає це приблизно так:
Відображення прогнозу погоди
Завантаження прогнозу погоди з Інтернету можна легко реалізувати за допомогою таких сервісів як OpenWeather. Після реєстрації на сайті можна отримати API ключ із яким можливо здійснювати HTTP запити та отримувати від сервера інформацію про поточний стан, а також поргноз погоди. Можна використати ключ, створений зазамовчуванням або згенерувати новий:
Детальніше про openweathermap API та параметри запитів можна почитати у їх документації. openweathermap надають можливість здійснювати запити до їх API безкоштовно лімітовану кількість разів на добу. Ліміти можна розширити платною підпискою, проте чесно кажучи, безкоштовної достатньо для домашніх експериментів (60 викликів на хвилину). Можна отримувати як поточну погоду, так і досить детальний прогноз.
До речі, існують й інші бібліотеки для роботи з їхнім API, але описаний тут спосіб особисто для мене виявився найпростішим. Якщо ви зробили це інакше, мені було б дуже цікаво прочитати про це у коментарях. Загалом те, як я реалізував діставання прогнозу погоди і відображення його на сервері метеостанції досить гарно видно із коду програми (наголошу тільки на тому, що важливо конвертувати JSON об’єкти після парсингу відповіді API сервера у тип, придатний для обробки і виводу – тут мені в пригоді став метод JSON.stringify() бібліотеки Arduino_JSON), тому тут наведу тільки скріншот із результатом роботи:
Побудована мною елементарна домашня метеостанція загалом дає змогу підключати більше давачів. Також можна додати незалежне від розетки джерело живлення та розмістити схему в гарному корпусі. Можливо вас також зацікавить Raspberry Pi + GPS-модуль: прогноз погоди за координатами надсилаємо у Telegram і Raspberry Pi та радіочастотна ідентифікація RFID.