Категорії
Блог Мої проекти

Проста домашня метеостанція на ESP8266 NodeMCU

Spread the love

Проста домашня метеостанція на ESP8266 NodeMCU, прогноз погоди і доступ через Інтернет – для початку поясню, що саме я реалізував у проекті, описаному в даній публікації. Елементарна домашня погодна станція, яка відображає поточну температуру і вологість повітря, атмосферний тиск і висоту (дуже приблизну) над рівнем моря, а також доступна через локальну Wi-Fi мережу і навіть з Інтернету, може бути без проблем реалізована за допомогою мікроконтролера ESP8266 NodeMCU. Одними з найбільших плюсів даного мікроконтролер є наявність вбудованого Wi-Fi модуля, що дає змогу бавитися в Інтернет Речей не виходячи з дому. Також в рамках даного проекту ми будемо діставати інформацію про прогноз погоди і відображати її разом із показами давачів на веб-сервері реалізованому на ESP8266.

Використане обладнання:

  1. Мікроконтролер ESP8266 (модель ESP-12E NODEMCU);
  2. Давач тиску і температури BMP280;
  3. Цифровий термометр DS18B20;
  4. Давач температури і вологості DHT11;
  5. Макетна плата, провідники.

Налаштування і програмування мікроконтролера ESP8266 тут розглядати не буду, адже Інтернет переповнений різного роду інструкціями як це робити. Свій NODEMCU я програмував через Arduino IDE. Також не буду детально зупинятися над підключенням необхідних бібліотек. Дана публікація є лише компіляцією кількох цікавих статей, посилання на які можна знайти внизу, із певним допрацюванням, а головне з додаванням деяких доволі корисних цікавих функціональних можливостей таких як доступ до показів підключених давачів із Інтернету та прогнозування погоди за допомогою API викликів до сервісу, який надає доступ до метео даних з усього світу.

Розділимо процес побудови метеостанції на кілька етапів: 

  1. Підключення давачів до мікроконтролера;
  2. Програмування мікроконтролера;
  3. Підключення мікроконтролера до локальної Wi-Fi мережі і відображення показів давачів за зверненням до ESP8266 по IP адресі;
  4. Відкриття доступу до показів давачів із мережі Інтернет;
  5. Відображення прогнозу погоди.

1. Підключення давачів до мікроконтролера

Загалом і 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;

2. Програмування мікроконтролера 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"

Повний вихідний код програми можна знайти за посиланням на GitHub в кінці публікації. Код готовий до використання, але не забудьте замінити назву та пароль мережі 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

3. Підключення мікроконтролера ESP8266 до локальної Wi-Fi мережі і відображення показів по IP адресі

Після підключення усіх давачів і завантаженням програмного коду в пам’ять мікроконтролера, метеостанція повинна автоматично під’єднатися до вказаної в ssid мережі Wi-Fi. В більшості випадків роутер динамічно видасть для мікроконтролера певну локальну IP адресу за допомогою DHCP сервера. Дізнатися її можна двома способами: відкрити Serial Monitor (якщо використовуєте Arduino IDE) або переглянути перелік клієнтів в адмін консолі вашого роутера.
Serial Monitor у Arduino IDE:

IP адреса мікроконтролера у налаштуваннях Wi-Fi роутера:

Якщо все зроблено правильно, перейшовши по даній адресі з будь-якого девайсу, що підключений до нашої локальної Wi-Fi мережі, ми побачимо щось подібне:

4. Відкриття доступу до показів давачів із мережі Інтернет

Тепер робимо нашу метеостанцію доступною із мережі Інтернет. Якщо у вас немає виділеної статичної IP адресу, а як правило її немає, то доведеться скористатися сервісами типу DynDNS або NoIP. В моєму випадку це NoIP (https://www.noip.com/). Дані сервіси необхідні для того аби закріпити відкритий нами порт роутера на IP адресі метеостанції за статичним доменним іменем. Для початку потрібно відкрити порт 80 для IP адреси мікроконтролера в налаштуваннях роутера. В роутерах різних виробників цей процес може відрізнятися, так само як і можуть відрізнятися назви пунктів меню налаштувань, але як правило, це буде щось типу Port forwarding чи Virtual servers. Можна просто погуглити або заглянути в даташит конкретно вашої моделі мережевого обладнання. У моєму TP-Link це виглядає наступним чином:

Далі реєструємося у сервісіс NoIP та створюємо тестовий домен для нашої метеостанції. У полі IP / Target буде відображатися мережева адреса вашого роутера:

Завдяки виконаним діям тепер ми можемо звернутися за створеним доменним іменем з Інтернету з будь-якої точки світу і отримати покази, які збирає наша проста домашня метеостанція. Виглядає це приблизно так:

5. Відображення прогнозу погоди

Завантаження з Інтернету прогнозу погоди можна легко реалізувати за допомогою сервісів таких як https://openweathermap.org/. Після реєстрації на сайті можна отримати API ключ із яким можливо здійснювати HTTP запити та отримувати від сервера інформацію про поточний стан, а також прогноз погоди. Можна використати ключ, створений за замовчуванням або згенерувати новий:

Детальніше про openweathermap API та параметри запитів можна почитати у їх документації (https://openweathermap.org/api). openweathermap.org дають можливість здійснювати запити до їх API безкоштовно лімітовану кількість разів на добу. Ліміти можна розширювати платною підпискою, але, чесно кажучи, безкоштовної більше ніж  достатньо для домашніх експериментів (60 викликів на хвилину). Також можна діставати як поточну погоду, так і досить детальний прогноз. До речі, існують й інші бібліотеки для роботи з їхнім API, але описаний тут спосіб особисто для мене виявився найпростішим. Якщо ви зробили це інакше, мені було б дуже цікаво прочитати про це у коментарях. Загалом те, як я реалізував діставання прогнозу погоди і відображення його на сервері метеостанції досить гарно видно із коду програми (наголошу тільки на тому, що важливо конвертувати JSON об’єкти після парсингу відповіді API сервера у тип, придатний для обробки і виводу – тут мені в пригоді став метод JSON.stringify() бібліотеки Arduino_JSON), тому тут наведу тільки скріншот із результатом роботи:

Побудована мною елементарна домашня метеостанція показана на фото нижче. Загалом до неї можна під’єднати більше давачів, додати незалежне від розетки джерело живлення та помістити все у гарний корпус. Взагалі, у наступних публікаціях я також планую реалізувати подібні метеостанції (і не тільки їх) на базі мікроконтролерної платформи Arduino і одноплатного міні-комп’ютера Raspberry Pi. Думаю, з Raspberry Pi можна буде суттєво розширити функціональні можливості проекту. А зараз дякую за увагу і прошу вас поділитися своїми думками, ідеями і проектами у коментарях. Також буду вдячний за підписку будь-яким зручним способом, аби не пропускати нових публікацій. Переконаний, деякі з них можуть бути доволі цікавими. Успіхів вам у ваших проектах!

weather-station-academicfox.com

Повний код програми, на якому працює метеостанція, можна знайти на GitHub:
https://github.com/OlehBoreiko/academicfox.com/blob/master/home_weather_station_forecaster_NodeMCU.ino

Корисні посилання на подібні публікації:
https://theiotprojects.com/bme280-based-mini-weather-station-esp8266-esp32/
https://www.circuitschools.com/interfacing-bmp280-with-esp8266-on-i2c-with-errors-and-solutions/
https://randomnerdtutorials.com/esp32-http-get-post-arduino/
https://randomnerdtutorials.com/esp8266-weather-forecaster/
https://randomnerdtutorials.com/esp8266-nodemcu-http-get-post-arduino/#http-post
https://electrosome.com/calling-api-esp8266/

Click to rate this post!
[Total: 5 Average: 5]

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.