Открытая платформа для создания заботливой квартиры
Измерение различных параметров среды обитания, позволяют реализовывать самые разные сценарии:
- Температуру в помещении можно использовать для автоматического включения/отключения нагревателей или теплого пола.
- Атмосферное давление можно использовать для прогнозирования осадков или выявления неблагоприятных условий для метеозависимых людей.
- Уровень газа (например, 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 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