Большинство людей, кто начинает использовать ESP8266, начинали с построения метеостанции. Меня эта участь тоже постигла). Изначально в моей метеостанции стоял датчик DHT22. Соответственно, он снимал данные температуры и влажности. Точность его конечно не ахти, ну и на улице он работает нестабильно, так как есть требования к стабильности питания. Дальше он был заменен на BME280, также добавил датчик яркости BH1750 и датчик качества воздуха MQ135. С последним пришлось повозиться, и он все равно показывал погоду на марсе. Прошивка была сделана на arduino. Данные передавались в проект Народный мониторинг. Даже был телеграм бот, который по запросу отдавал данные, бота скинул в чат дома, и периодически его валили ddos атакой, когда одновременно куча народа кидала ему запрос. Чаще это происходило по утрам. Потом телеграм заблокировали, и я бота выпилил.
В дальнейшем я заинтересовался умным домом, и изначально я данные со своей метеостанции брал с сайта Народного мониторинга и выводил в Home assistant. Ну а потом я открыл для себя EspHome. Соответственно, все было переписано в ней. На народный мониторинг данные уже отправлял Home assistant.
Позже оказалось, что у датчика 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: 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
Точно подмечено ))