UPD: Доступно приложение для вывода данных с метеостанции MeteostationV2-app
Документация к проекту метеостанции на базе ESP8266 NodeMCU v3 с использованием датчика BME280. Метеостанция собирает данные о температуре, влажности, давлении и высоте, поддерживает локальный веб-интерфейс и отправку данных на сервер Flask с визуализацией, также включает функцию архивации данных и сброса через кнопку и API.
Метеостанция на базе ESP8266 NodeMCU v3 и датчика BME280 предназначена для мониторинга погодных условий. Она работает в двух режимах:
- Локальный режим (Local Mode): предоставляет веб-интерфейс для настройки и отображения данных.
- API-режим (API Mode): отправляет данные на сервер Flask, где они сохраняются и визуализируются в виде графиков.
Некоторые функции метеостанции:
- Архивация и сброс данных: возможность архивировать текущие данные и графики в папку
archivesс последующей очисткой через API-запрос или кнопку на пине D6. - Кнопка сброса данных: подключена к пину D6, позволяет отправить запрос на архивацию и сброс данных на сервере.
- Wi-Fi:
- Режим точки доступа (AP) с настраиваемым SSID и паролем.
- Подключение к существующей Wi-Fi сети (STA).
- Измеряемые параметры:
- Температура (°C)
- Влажность воздуха (%)
- Давление (гПа и мм рт. ст.)
- Высота над уровнем моря (м)
- Настройка:
- Веб-интерфейс для выбора режима (локальный или API), настройки Wi-Fi, точки доступа и URL сервера.
- Сохранение настроек в EEPROM.
- Кнопки:
- Сброс настроек (D7): сбрасывает настройки до значений по умолчанию при удержании во время включения.
- Сброс данных (D6): отправляет запрос на сервер для архивации и очистки данных.
- Индикация: встроенный светодиод мигает при выполнении операций (например, отправка данных, сохранение настроек).
- Прием данных: POST-запросы на
/data. - Возврат данных: GET-запрос на
/dataвозвращает последние замеры. - Визуализация: автоматическая генерация графиков в формате PNG:
/plot/temperature.png/plot/humidity.png/plot/pressure.png/plot/pressure_mmHg.png/plot/altitude.png
- Архивация и сброс:
- Endpoint
/change-resultsархивирует данные (data.jsonl) и графики (plots) в папкуarchivesс временной меткой, затем очищает текущие данные и графики.
- Endpoint
- ESP8266 NodeMCU v3
- Датчик BME280 (I2C, адрес по умолчанию:
0x76) - Две кнопки (для сброса настроек и данных)
- USB-кабель для прошивки и питания
- Компьютер или сервер для запуска Flask
- Провода и макетная плата (опционально)
- Arduino IDE с поддержкой ESP8266
- Библиотеки Arduino:
Adafruit_BME280ESP8266WiFiESP8266WebServerEEPROMWireESP8266HTTPClient
- Python 3.x
- Библиотеки Python:
flaskpandasmatplotlibshutil
- Код проекта:
weather_station.ino(прошивка ESP8266)server.py(Flask-сервер)
ESP8266_NodeMCU-v3-Meteostation/
├── server.py # Flask-сервер для обработки данных, графиков и архивации
├── data.jsonl # История замеров в формате JSON Lines
├── plots/ # Папка для хранения сгенерированных графиков
│ ├── temperature.png # График температуры
│ ├── humidity.png # График влажности
│ ├── pressure.png # График давления в гПа
│ ├── pressure_mmHg.png # График давления в мм рт. ст.
│ └── altitude.png # График высоты
├── archives/ # Папка для архивов данных и графиков
│ ├── archive_YYYY-MM-DD_HH-MM-SS/ # Папка с архивом по временной метке
│ │ ├── data.jsonl # Архивированный файл данных
│ │ └── plots/ # Архивированные графики
├── weather_station.ino # Код прошивки для ESP8266
└── README.md # Документация проекта
| Пин BME280 | Пин ESP8266 NodeMCU v3 |
|---|---|
| VIN | 3V3 |
| GND | GND |
| SDA | D2 (GPIO4) |
| SCL | D1 (GPIO5) |
| Кнопка | Подключение |
|---|---|
| Сброс настроек | D7 (GPIO13) — GND |
| Сброс данных | D6 (GPIO12) — GND |
Примечание: Убедитесь, что адрес I2C датчика BME280 — 0x76. Если адрес отличается (например, 0x77), измените #define BME_ADDR в коде.
- Подключите датчик BME280 и кнопки к ESP8266 согласно схеме.
- Установите Arduino IDE и добавьте поддержку плат ESP8266.
- Установите библиотеки:
Установите:
Arduino IDE → Sketch → Include Library → Manage Libraries
Adafruit_BME280,ESP8266WiFi,ESP8266WebServer,EEPROM,Wire,ESP8266HTTPClient. - Загрузите файл
weather_station.inoв Arduino IDE. - Подключите ESP8266 через USB и выполните прошивку.
После прошивки устройство создаст точку доступа:
- SSID:
Meteostation - Пароль:
12345678
- Подключитесь к точке доступа с телефона или компьютера.
- Откройте браузер и перейдите по адресу: http://192.168.4.1.
- Настройте параметры:
- Режим:
L(локальный) илиA(API). - Wi-Fi SSID и пароль: для подключения к вашей сети.
- AP SSID и пароль: для настройки точки доступа.
- API URL: адрес сервера (например,
http://192.168.0.129:5000/data).
- Режим:
- Нажмите "Сохранить". Устройство перезагрузится.
- Удерживайте кнопку на пине D7 при включении устройства, чтобы сбросить настройки до значений по умолчанию:
- Режим:
L(локальный) - AP SSID:
Meteostation - AP Пароль:
12345678 - Wi-Fi SSID:
your_SSID - Wi-Fi Пароль:
your_PASSWORD - API URL:
http://192.168.0.129:5000/data
- Режим:
- Установите Python 3.x.
- Установите зависимости:
pip install flask pandas matplotlib
- Поместите
server.pyв папку проекта. - Запустите сервер:
Сервер будет доступен по адресу
python server.py
http://<IP-сервера>:5000.
- Подключитесь к точке доступа устройства (по умолчанию
Valkyrja v1 Meteostation). - Откройте http://192.168.4.1 для настройки.
- Перейдите на http://192.168.4.1/data для просмотра текущих данных:
- Температура (°C)
- Влажность (%)
- Давление (мм рт. ст. и гПа)
- Высота (м)
- Убедитесь, что сервер Flask запущен и доступен.
- Устройство отправляет данные на сервер каждые 3 секунды через POST-запросы.
- Доступные endpoint’ы:
- POST
/data: принимает данные в формате JSON:Ответ:{ "temperature": 24.7, "humidity": 45.1, "pressure": 1010.2, "pressure_mmHg": 757.7, "altitude": 128.3 }{"status": "ok"} - GET
/data: возвращает последние данные:{ "temperature": 24.7, "humidity": 45.1, "pressure": 1010.2, "pressure_mmHg": 757.7, "altitude": 128.3, "timestamp": "2025-07-19T15:57:00" } - GET
/plot/<param>.png: возвращает график для параметра (temperature,humidity,pressure,pressure_mmHg,altitude). - GET
/change-results: архивирует данные и графики, затем очищает их. Ответ:{"status": "archived and reset"}.
- POST
- Нажмите кнопку на пине D6 (подключена с подтяжкой к HIGH), чтобы отправить GET-запрос на
/change-results. Это:- Сохраняет текущий файл
data.jsonlи папкуplotsвarchives/archive_YYYY-MM-DD_HH-MM-SS. - Удаляет текущие
data.jsonlи папкуplots. - Создает новую пустую папку
plots.
- Сохраняет текущий файл
- Встроенный светодиод мигает для подтверждения действия.
-
Архивация и сброс данных:
- На сервере: Endpoint
/change-resultsсоздает архив с временной меткой в папкеarchives(например,archives/archive_2025-07-19_15-57-00). Сюда копируютсяdata.jsonlи папкаplots. После этого текущие данные и графики удаляются, а папкаplotsсоздается заново. - На устройстве: Кнопка на пине D6 отправляет запрос на этот endpoint, инициируя архивацию и сброс.
- На сервере: Endpoint
-
Кнопка сброса данных:
- Подключена к пину D6 (GPIO12) с подтяжкой к HIGH.
- При нажатии отправляет GET-запрос на
/change-results, мигает светодиод для индикации.
| Проблема | Возможная причина | Решение |
|---|---|---|
| Устройство не создает точку доступа | Ошибка в прошивке | Проверьте код, установите библиотеки, перепрошейте. |
| Нет данных от BME280 | Неправильное подключение или адрес | Проверьте провода, убедитесь, что адрес I2C — 0x76. |
| Не подключается к Wi-Fi | Неверный SSID/пароль | Настройте через http://192.168.4.1. |
| Сервер не получает данные | Неверный URL или сервер недоступен | Проверьте URL, убедитесь, что сервер запущен. |
| Графики не обновляются | Ошибка в server.py |
Убедитесь, что pandas и matplotlib установлены, проверьте логи. |
| Архивация не работает | Проблемы с правами или папкой | Проверьте права на запись в папку archives, убедитесь, что shutil установлен. |
| Кнопка сброса данных не работает | Неправильное подключение D6 | Проверьте подключение кнопки, убедитесь, что пин настроен как INPUT_PULLUP. |




