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

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

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

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

На алике также был заказан датчик уличного исполнения, правда при заказе я не придал значения и заказал с датчиком SHT20.

1600x_image.png?1633263031

У датчика верхняя крышка отщелкивается, там было просверлено отверстие и вставлен шуруп, и закреплен капелькой суперклея. Этот шуруп в дальнейшем был вкручен в прилив в верхней крышке корпуса метеостанции.

Позже оказалось, что у датчика 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
1600x_image.png?1633263033

При компиляции, 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 {sht20->temperature_sensor, sht20->humidity_sensor, sht20->vpd_sensor, sht20->dew_point_sensor};
    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

1600x_image.png?1633288395

Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
К списку статей

Устройства в материале

Датчик температуры/влажности DHT22

Производитель: noname
Заказать на:

Датчик освещенности BH1750

Производитель: noname
Заказать на:

Датчик давления/температуры/влажности BME280

Производитель: noname
Заказать на:

ESP8266

Производитель: Espressif Systems
Заказать на:

Тематические чаты

DIY

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
15 октября 2018, 09:05
Прошивка для Sonoff c нативным HomeKit
02 ноября 2018, 12:14
Кнопка звонка с уведомлениями в HomeKit
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
30 августа 2019, 07:28
Несколько нетривиальных способов использования датчика открытия окон/дверей от Xiaomi/Aqara.
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
15 ноября 2018, 09:42
Способы автоматизации механических ворот
27 августа 2018, 10:14
Интегрируем ХА в HomeKit