Статья

Мой опыт создания метеостанции

Большинство людей, кто начинает использовать ESP8266, начинали с построения метеостанции. Меня эта участь тоже постигла). Изначально в моей метеостанции стоял датчик DHT22. Соответственно, он снимал данные температуры и влажности. Точность его конечно не ахти, ну и на улице он работает нестабильно, так как есть требования к стабильности питания. Дальше он был заменен на BME280, также добавил датчик яркости BH1750 и датчик качества воздуха MQ135. С последним пришлось повозиться, и он все равно показывал погоду на марсе. Прошивка была сделана на arduino. Данные передавались в проект Народный мониторинг. Даже был телеграм бот, который по запросу отдавал данные, бота скинул в чат дома, и периодически его валили ddos атакой, когда одновременно куча народа кидала ему запрос. Чаще это происходило по утрам. Потом телеграм заблокировали, и я бота выпилил.

В дальнейшем я заинтересовался умным домом, и изначально я данные со своей метеостанции брал с сайта Народного мониторинга и выводил в Home assistant. Ну а потом я открыл для себя EspHome. Соответственно, все было переписано в ней. На народный мониторинг данные уже отправлял Home assistant.

Был сделан корпус для метеостанции из тарелочек для цветочных горшков. Все это крепилось на полипропиленовую трубу, для исключения влияния нагретых стен дома. Показания стали гораздо лучше, правда при прямом попадании солнечных лучей, температура градуса на 2 все равно повышалась. Ставил вентилятор, он не сильно помогает. В таком виде метеостанция работала почти три года.
Внутренний мир метеостанции был сделан в лучших традициях DIY. При этом, за все время эксплуатации умер только один датчик BME280. Да и то сам датчик не умер, разъелись дорожки на плате датчика. Еспха, DCDC, BH1750 - нормально пережили.
В последнюю зиму на метеостанцию упал большой ком снега, и корпус ее немного не выдержал.
На алике давно заглядывался на такой корпус и то, что корпус старой метеостанции сломался, сподвигло к его покупке.
Наконец корпус пришел. Он оказался гораздо меньше моего старого корпуса, и несколько хлипковат. Чашечки собраны на пластиковых направляющих, они проклеены в верхней чашке. Соответственно, все это было разломано.
Все чашки одинаковые, кроме верхней. Все было собрано на шпильках М4 и затянуто. В верхней чашке внутри есть по центру прилив с отверстием диаметром миллиметра 1,5-2.

Позже оказалось, что у датчика SHT20 нет полноценной поддержки в EspHome. Есть SHT10, SHT21, SHT3x, но ни одна из этих библиотек не заработала корректно с этим датчиком. Стал изыскивать возможность применения датчика. В результате нашел описание применения датчика в составе M5stack air quality sensor. Достаточно было скачать файл sht20.h и подключить библиотеки ArduinoJson и uFire SHT20.

esphome: name: m5stack_air_quality platform: ESP32 board: m5stack-core-esp32 libraries: - "uFire SHT20" - "ArduinoJson" includes: - include/sht20.h

При компиляции, EspHome ругался на эти прикрепляемые библиотеки. Решить удалось, скачав всю папку uFire с исходниками. Ну и соответственно переписав yaml. Файлы закинул в папку include. Прописал ссылки на них. Кстати библиотека вычисляет 4 параметра: собственно влажность и температуру, точку росы и дефицит давления. Последний параметр я так и не понял, для чего он нужен. Ну есть так есть )). В библиотеке заложен опрос датчика каждую секунду. Для метеостанции такая скорость ни к чему, поэтому данный параметр заменен на 60 секунд.

esphome: name: meteostation platform: ESP8266 board: esp12e libraries: - "ArduinoJson" includes: - include/sht20.h - include/ufire/uFire_SHT20.h - include/ufire/uFire_SHT20.cpp wifi: ssid: !secret wifi_ssid password: !secret wifi_password manual_ip: static_ip: 192.168.1.124 gateway: 192.168.1.1 subnet: 255.255.255.0 ap: ssid: "Meteostation Fallback Hotspot" password: "d9qVfCOEK3hN" captive_portal: # Enable logging logger: # Enable Home Assistant API api: password: "meteo123" ota: password: "meteo123" web_server: port: 128 status_led: pin: number: GPIO2 inverted: true i2c: sda: GPIO4 scl: GPIO5 scan: True id: bus_a sensor: - platform: custom lambda: |- auto sht20 = new SHT20(); App.register_component(sht20); return ; sensors: - name: "Temperature" id: sensor_temperature unit_of_measurement: °C accuracy_decimals: 2 device_class: temperature - name: "Humidity" id: sensor_humidity unit_of_measurement: "%" accuracy_decimals: 2 device_class: humidity - name: "Vapour-pressure deficit" id: sensor_vpd unit_of_measurement: "kPa" accuracy_decimals: 2 - name: "Dew point" id: sensor_dew_point unit_of_measurement: °C accuracy_decimals: 2 device_class: temperature - platform: bh1750 name: "BH1750 Illuminance" address: 0x23 id: bh1750_illuminance update_interval: 60s - platform: bme280 temperature: name: "Inside Temperature" oversampling: 16x pressure: name: "BME280 Pressure" humidity: name: "Inside Humidity" address: 0x76 update_interval: 60s - platform: wifi_signal name: "Meteostation WiFi Signal" update_interval: 60s - platform: uptime id: device_uptime internal: true text_sensor: - platform: template name: "Meteostation uptime" lambda: |- uint32_t uptime = (id(device_uptime).state); int minutes = (uptime % 3600) / 60; int hours = (uptime % 86400) / 3600; int days = uptime / 86400; if (days > 0) { return { (String(days) " д." String(hours) " ч." String(minutes) " мин.").c_str() }; } if (hours > 0) { return { (String(hours) " ч. " String(minutes) " мин.").c_str() }; } else { return { (String(minutes) " мин.").c_str() }; } update_interval: 60s icon: mdi:clock-start switch: - platform: restart name: "Meteostation restart"

Датчик BME280 тоже был подключен, но расположился у самого окна. Графики практически совпадают. В общем уже больше месяца полет нормальный. Засуха наконец-то закончилась и пришли дожди. И тут обнаружился интересный факт: датчик показывал влажность воздуха 102%. Пришлось углубляться в код библиотеки и в даташиты. Формула пересчета влажности в даташите указана такая: RH=(SH*125/65536 - 6). И если в регистре SH будет число, например, 65536, то мы получим значение 119. В файле uFire_SHT20.cpp был немного модифицирован код: была добавлена проверка значения RH перед возвратом значения.

float uFire_SHT20::humidity() { _reset(); _i2cPort->beginTransmission(SHT20_I2C); _i2cPort->write(SHT20_HUMID); _i2cPort->endTransmission(); delay(HUMIDITY_DELAY); _i2cPort->requestFrom(SHT20_I2C, 2); uint8_t msb = _i2cPort->read(); uint8_t lsb = _i2cPort->read(); uint16_t value = msb << 8 | lsb; RH = value * (125.0 / 65536.0) - 6.0; if (RH > 100) { return 100; } else { return RH; } }

Исправленные файлы можно взять у меня на гитхабе. Также в папке myConfig можно найти и файл meteostation.yaml

2



https://sprut.ai/static/media/cache/00/12/83/5/10132038/81979/1000x_image.png?1633330189" alt="1000x_image.png?1633330189" />

Точно подмечено ))


Вернуться назад
Вернуться назад