Открытая платформа для создания заботливой квартиры

Измерение различных параметров среды обитания, позволяют реализовывать самые разные сценарии:

  • Температуру в помещении можно использовать для автоматического включения/отключения нагревателей или теплого пола.
  • Атмосферное давление можно использовать для прогнозирования осадков или выявления неблагоприятных условий для метеозависимых людей.
  • Уровень газа (например, CO2) для сигнала о необходимости проветрить комнату и т.д.

Итак, для сборки собственной метеостанции вам потребуются эти компоненты:

Название Назначение Цена, руб.
BLE JDY-08 Радиомодуль Bluetooth LE 140
Arduino Nano Микроконтроллер для снятия показаний датчика и управления реле 180
MPL3115A2 Датчик температуры, давления, высоты 170
MQ-135 Электрохимический датчик CO2 90
Hi-Link HLK PM-01 5V Изолированный модуль питания 5В 150

Устройство питается от сети 220В. Причина этого в приличном потреблении датчиков. К тому же электрохимический датчик нужно прогревать в течение нескольких минут, перед тем как снять с него показания, а эта задачка явно не для батарейки.

Чтобы избавиться от проводов, объедините переходник на 220В и макетную плату, на которой легко разместятся все компоненты и еще останется место для дополнительных датчиков.

Теперь вы можете разместить вашу метеостанцию в любой комнате просто воткнув ее в свободную розетку. Модуль питания изолирован, так что опасное напряжение надежно спрятано с тыльной стороны устройства. Однако, для большей надежности вы можете собрать несложный пластиковый кожух и закрепить его на плате.

Метеостанция arduino в розетке

Программируем микроконтроллер

О том как настроить Arduino IDE и подключить микроконтроллер к ПК читайте в этой коротенькой инструкции. Для компиляции программы необходимо загрузить библиотеки MPL3115A2, JDY8 и MQ135, добавить их в Arduino IDE через меню Sketch - Install library.

#include <jdy8.h>
#include <LowPower.h>
#include <Adafruit_MPL3115A2.h>
#include <MQ135.h>

#define SENSOR_DATA_PIN A6
#define MQ135_RLOAD 1.0
#define MQ135_RZERO 316.0
//#define CALIBRATE

JDY8 ble(11, 7, 10); // RX, TX, Reset
unsigned int pressure = 0;
unsigned int temperature = 0;
unsigned int gaslevel = 0;
int secondsPassed = 0;

void setup() 
{
  #ifdef CALIBRATE
    Serial.begin(9600);
  #else
    measureValues(&pressure, &temperature, &gaslevel);
    ble.configure("Climate-1");
    ble.setData(pressure, gaslevel, 0, temperature, 0);
  #endif
}

void loop() 
{
  #ifdef CALIBRATE
    calibrate();
  #else
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

    // check if a minute has passed
    secondsPassed += 8;
    if ( secondsPassed < 60 ) return;
    secondsPassed = 0;

    // measure sensor value
    measureValues(&pressure, &temperature, &gaslevel);
    ble.setData(pressure, gaslevel, 0, temperature, 0);
  #endif
}

void measureValues(unsigned int * pressure, unsigned int * temperature, unsigned int * gaslevel) 
{
  // read temperature and pressure
  Adafruit_MPL3115A2 sensor;
  sensor.begin();
  float barCoeff = 0.00750063755419211; // millimeter of mercury [0 °C]
  *pressure = sensor.getPressure() * barCoeff;
  *temperature = sensor.getTemperature();
  pinMode(A4, INPUT); // SDA
  pinMode(A5, INPUT); // SCL

  // read gas level  
  pinMode(SENSOR_DATA_PIN, INPUT);
  *gaslevel = (unsigned int) floor(MQ135(SENSOR_DATA_PIN, MQ135_RLOAD, MQ135_RZERO).getPPM());
}

void calibrate()
{
  char value[32] = "";
  dtostrf( MQ135(SENSOR_DATA_PIN, MQ135_RLOAD, MQ135_RZERO).getRZero(), 7, 3, value );
  char data[64] = "";
  sprintf(data, "RZERO=%s", value);
  Serial.println(data);
}

Электрохимический датчик требует предварительной калибровки. Раскомментируйте строчку

#define CALIBRATE

и загрузите код в микроконтроллер, в мониторе последовательного порта будет отображаться калибровочный коэффициент RZERO. Откройте окно для проветривания помещения и через несколько минут запишите последнее значение в константу MQ135_RZERO. Подробнее о калибровке хорошо написано здесь.

Собираем по схеме

Схема умной метеостанции

Программируем HASS

Файл: /config/configuration.yaml

sensor:
  - platform: cutecare
    scan_interval: 60
    mac: 0C:B2:B7:3E:C8:DC
    monitored_conditions:
      - temperature
      - pressure
      - co2
    name: climate_1

Файл: /config/customize.yaml

sensor.climate_1_temperature:
  friendly_name: Температура
  icon: mdi:thermometer

sensor.climate_1_pressure:
  friendly_name: Атмосферное давление
  icon: mdi:nature

sensor.climate_1_co2:
  friendly_name: Уровень CO2
  icon: mdi:nature

Метеостанция в Home Assistant