Решил я тут прокачать станцию для оценки качества воздуха в спальне, добавив сенсор CJMCU-811 CO2 and Volatile Organic Compound Sensor..
Станция в данный момент состоит из Wemos d1 mini с ESPHome и сенсора MH-Z19B CO2 and Temperature Sensor, подключенная к Home Assistant. Решил я добавить в нее сенсор CCS811, который валялся еще с времен увлечением Arduino. Данный сенсор представляет из себя небольшую плату с датчиком, определяющим значение eCO2 (эквивалент значения концентрации углекислого газа) и значение летучих органических веществ в воздухе (TVOC).
Первое значение (eCO2) мне не очень интересно - его у меня как раз и измеряет сенсор MHZ19B, а в CCS811 это значение рассчитывается по формуле из TVOC. Это не более чем абстрактный показатель того, что нужно проветрить помещение. Данное значение «еСО2» вообще не связано с содержанием СО2 в воздухе.
А вот второе - органика, то ради чего мы его и ставим [
источник]:
Эфиры (Бутилгликоль — используется в авиа и космической промышленности для очистки поверхности) — очень высокая чувствительность.
Перманентный маркер — очень высокая чувствительность.
Спирты — очень высокая чувствительность.
Толуол — очень высокая чувствительность.
Ацетон — очень высокая чувствительность.
Бутанол — чувствует
Бутилацетат — чувствует
Бутан — обнаруживает, но слабо
Хлороформ — практически не чувствует
Дихлорметан — не чувствует
Ацетальдегид — слабо чувствует
Подключение к шине i2c ESP стандартное и описано в
документации, код тоже там приведен.
Правда у них на картинке немного другой датчик - без дополнительных пинов. Я этому не предал значение и поплатился часом своей жизни. Который потратил на разбирательство почему i2c scan не находит датчик, даже пропаял еще раз и прозвонил дорожки и пайку
Датчик из документации:
Оказалось все намного проще. Решение нашел на GitHub-е в
Issues к библиотеки для работы на Ардуино с этим датчиком - нужно просто пин nWAKE (WAK) заземлить. Потому что он используется для активации датчика, если пин не имеет низкий уровень, то датчик не активен.
Кстати, в некоторых лотах на Алиэкспресс эта особенность есть в описании.
Полный код ESPHome
GitHub-еКод:
# -----------------------------------------------------------------------------
# Wemos d1 mini + MH-Z19B + CCS811
#
# DATE: 2021-08-18
#
# MH-Z19B use UART on pins:
# rx_pin: GPIO3
# tx_pin: GPIO1
#
# CCS811 use i2c on pins:
# sda: GPIO4
# scl: GPIO5
# -----------------------------------------------------------------------------
esphome:
name: d1mini-n2
comment: Датчик качества воздуха в спальне
platform: ESP8266
board: d1_mini
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
password: !secret ota_password_n2
# WiFi settings
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: !secret hotspot_wifi_ssid_n2
password: !secret hotspot_wifi_password_n1
# Captive portal резервный механизм для настройки, если подключение к сконфигурированной WiFi сети не удалось
captive_portal:
# включим Web server
web_server:
port: 80
# auth:
# username: admin
# password: !secret web_server_password
# Get the time from Home Assistant to sync the onboard real-time clock.
time:
- platform: homeassistant
id: esptime
# СИСТЕМНЫЕ ШИНЫ
# настроим UART
uart:
rx_pin: GPIO3
tx_pin: GPIO1
baud_rate: 9600
# настроим i2c
i2c:
sda: GPIO4
scl: GPIO5
scan: true # If ESPHome should do a search of the I2C address space on startup. Defaults to true.
# СЕНСОРЫ
sensor:
# MH-Z19 CO_2 and Temperature Sensor
- platform: mhz19
co2:
name: "d1mini-n2 MH-Z19 CO2 Value"
temperature:
name: "d1mini-n2 MH-Z19 Temperature"
update_interval: 60s
automatic_baseline_calibration: false
# CCS811 CO_2 and Volatile Organic Compound Sensor
- platform: ccs811
eco2:
name: "d1mini-n2 CCS811 eCO2 Value"
tvoc:
name: "d1mini-n2 CCS811 Total Volatile Organic Compound"
address: 0x5A
update_interval: 60s
# Static Calibrating Baseline CCS811
# baseline: 0xA483
# системные сенсоры
- platform: uptime
name: "d1mini-n2 Uptime Sensor"
id: uptime_sensor
update_interval: 60s
on_raw_value:
then:
- text_sensor.template.publish:
id: uptime_human
state: !lambda |-
int seconds = round(id(uptime_sensor).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? String(days) + "d " : "") +
(hours ? String(hours) + "h " : "") +
(minutes ? String(minutes) + "m " : "") +
(String(seconds) + "s")
).c_str();
- platform: wifi_signal
name: "d1mini-n2 WiFi Signal"
update_interval: 60s
# ТЕКСТОВЫЕ СЕНСОРЫ
text_sensor:
# Версия
- platform: version
name: "d1mini-n2 Version"
# Human readable Uptime sensor
- platform: template
name: "d1mini-n2 Uptime Human Readable"
id: uptime_human
icon: mdi:clock-start
# ПЕРЕКЛЮЧАТЕЛИ
switch:
# программный переключатель, который позволит нам перезагрузить устройство из Home Assistant (или путем публикации вручную в MQTT или API)
- platform: restart
name: "d1mini-n2 restart"
Станция:
Web-server ESPHome:
Home Assistant: