Датчик качества воздуха DSM501A: http://alii.pub/6danbt
Esp32: http://alii.pub/6c9kzh
Arduino: http://alii.pub/6ahstu
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Измерение качества воздуха довольно актуальная тема. Особенно в мегаполисах, где постоянно катаются машины, работают заводы.
Но измерение качества воздуха – еще обычно довольно дорогое удовольствие. И даже когда я собирал метеостанцию с полным спектром датчиков анализаторов воздуха у меня вышло около 5 тысяч рублей по цене. Об этом можете почитать тут:
Монитор качества воздуха и универсальный информер на ESP32 в ESPHome и Home Assistant.
И в этой статье поговорим об измерении PM2.5 частиц.
PM2.5 это воздушный загрязнитель, в состав которого входят как твердые микрочастицы, так и мельчайшие капельки жидкостей. И те, и другие размером примерно от 10 нм до 2,5 мкм. Другие обозначения и названия частиц РМ2.5: FSP (fine suspended particles), fine particles, fine particulate matter, мелкодисперсные взвешенные частицы, тонкодисперсная пыль.
Таблица загрязнения выглядит следующим образом:
Для измерения частиц PM2.5 я использовал в своей метеостанции датчик PMS7003 http://alii.pub/5z0s55 . Как его подключить к ESP32 и Home Assitant описано тут:
Это классный датчик, но он дорогой. А у меня задумка сделать метеостанцию домашнюю как можно дешевле. И вот наткнулся на датчик пыли DSM501A (Dust sensor module) http://alii.pub/6danbt.
Технические характеристики датчика:
Мощность потребления: 0.5 Вт
Рабочее напряжение: 5 В
Рабочий ток: 100 мА
Ток открытой цепи: 106 мА
Диапазон рабочих температур: -20…85С
Интенсивность светового излучения: 1000 В/кВ.м, 25 град.
Этот датчик оптический. Своей оптикой он обнаруживает частицы от 2.5 um и ниже.
Когда обнаруживается частица, то отправляется импульс. Да, датчик импульсный. И чтоб снимать показания, нам нужно считать импульсы на выходе датчика ну и собственно по формуле их высчитывать.
Конечно могут быть и ложные срабатывания. И так как на импульсы могут влиять разные наводки по питанию, то и питание должно быть с фильтрами, чтоб не давало наводок ( но это в идеале конечно). По этому данный датчик и дешевле в 10 раз по сравнению с датчиком PMS7001. Но 10 раз – это ощутимая разница, особенно если нам особо нет разницы показывает один 15 um, а другой 20um. Ведь эталонных значений мы все равно не узнаем.
Даташит на датчик DSM501A: https://roboparts.ru/upload/iblock/408/4086b1c01d3596e2d0060434d28a074b.pdf
Габариты датчика DSM501A следующие:
Распиновка датчика:
На цвет проводов не обращайте внимания. Так, как у меня цвета не совпадали с этой схемой. А порядок верный конечно же.
Не знаю по какой причине, но данный модуль не распространённый. Возможно из-за того, что он придирчивый к питанию и показывает немного отличающиеся значения.
Но для бюджетной метеостанции самое то ;-).
Для работы с датчиком я использую библиотеку: https://github.com/karser/KarserDSM501
Так-же продублирую ссылку на библиотеку у меня на диске, вдруг пропадет с githubа. https://disk.yandex.ru/d/JNU4kjjfVA7FvQ
Вот собственно пример из библиотеки, для работы с датчиком:
#define DUST_SENSOR_PIN_PM10 3 //Must be the pins that
#define DUST_SENSOR_PIN_PM25 2 //support interrupts
#define INTERVAL_COUNTDOWN 1000
#define INTERVAL_READ 30000
#include
// ISRs forward declaration
void pm10_handleInterrupt();
void pm25_handleInterrupt();
// init pm10 and pm25 instances
KarserDSM501 pm10(DUST_SENSOR_PIN_PM10, pm10_handleInterrupt);
KarserDSM501 pm25(DUST_SENSOR_PIN_PM25, pm25_handleInterrupt);
// handle ISRs
void pm10_handleInterrupt() { pm10.handleInterrupt(); }
void pm25_handleInterrupt() { pm25.handleInterrupt(); }
unsigned long timer = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (!pm10.isReady() && (millis() >= timer + INTERVAL_COUNTDOWN)) {
Serial.println("DSM501 warm up: " + String(pm10.getReadyCountdown()));
timer += INTERVAL_COUNTDOWN;
} else if (millis() >= timer + INTERVAL_READ) {
timer += INTERVAL_READ;
Serial.println("pm10: "+String(pm10.readPM())+" pm2.5: "+String(pm25.readPM()));
}
}
Так-же его скачать можно готовый тут (на случай, если при копировании выдает ошибку): https://disk.yandex.ru/d/c5l7k6LfrvVXQg
Тут их программы самое главное это пины к которым подключены выводы 10 и 2.5. Они должны поддерживать прерывание, иначе у Вас будут не верные показания.
После загрузки скетча, программа в мониторе порта будет отсчитывать 60 секунд и после этого будет присылать показания с датчика:
18:53:40.791 -> DSM501 warm up: 59
…
18:54:36.845 -> DSM501 warm up: 3
18:54:37.841 -> DSM501 warm up: 2
18:54:38.837 -> DSM501 warm up: 1
18:54:39.832 -> DSM501 warm up: 0
18:55:09.855 -> pm10: 21.39 pm2.5: 6.65
18:55:39.872 -> pm10: 20.31 pm2.5: 5.57
18:56:09.897 -> pm10: 28.64 pm2.5: 7.07
18:56:39.920 -> pm10: 17.89 pm2.5: 6.92
18:57:09.940 -> pm10: 25.84 pm2.5: 7.86
18:57:39.937 -> pm10: 23.35 pm2.5: 6.83
18:58:09.959 -> pm10: 29.80 pm2.5: 6.84
18:58:39.980 -> pm10: 18.68 pm2.5: 6.98
18:59:10.003 -> pm10: 27.84 pm2.5: 7.54
Итак, с этим вроде разобрались. Датчик все показывает, все хорошо. Но зачем нам этот датчик, если мы не можем смотреть график показаний и делать автоматизации на его значениях. По этому давайте его подружим с Home Assistant.
В ESPHome датчик не поддерживается ( наверное из-за того, что он не обрел популярность, а зря на мой взгляд). По этому будем отправлять данные по mqtt.
У меня есть мой дежурный скетч отправки показаний по mqtt. Я его беру и редактирую под разные датчики. Собственно его я взял и отредактировал под DSM501A. Он работает на ESP32.
Скачать скетч можно тут: https://disk.yandex.ru/d/TjsZSUx3lwR2tQ
Тут из Важных параметров -это:
#define WIFI_SSID "NETGEAR" #define WIFI_PASSWORD "1214141141" #define MQTT_HOST IPAddress(192, 168, 31, 145) #define MQTT_PORT 1883 mqttClient.setCredentials("mqtt", "mqtt"); #define MQTT_PUB_TEMP "esp32/dsm501a/pm25"
Где:#define WIFI_SSID "NETGEAR" #define WIFI_PASSWORD "1214141141"
Это SSID и пароль от Wi-Fi сети.
#define MQTT_HOST IPAddress(192, 168, 31, 145)
#define MQTT_PORT 1883
Это ip адрес mqtt сервера и порт .
mqttClient.setCredentials("mqtt", "mqtt");
Это учетные данные к mqtt серверу у меня логин и пароль mqtt.
#define MQTT_PUB_TEMP "esp32/dsm501a/pm25"
Это топик куда будут отправляться данные.
Далее на самом сервере Home Assitsant в Configuration.yaml в блоке Sensor, добавим следующий блок:
sensor:
- platform: "mqtt"
name: "DSM501A"
state_topic: "esp32/dsm501a/pm25"
value_template: "{{ value }}"
unit_of_measurement: "um"
icon: "mdi:radiator"
Собственно тут изменить только топик, из которого будем брать данные. Ну или оставить так как у меня.
После добавления этого блока в Configuration.yaml, нужно перезагрузить Home Assistant. И после перезагрузки у Нас появится сенсор с именем DSM501A.
И вот что получилось:
Это второй уже датчик в мою планируемую бюджетную метеостанцию домашнюю. Первый кандидат был AGS02MA и о нем можно прочесть тут:
Отправка данных в Home Assistant от датчика TVOC AGS02MA на ESP32.
Сonnecting DSM501A to ESP32 and Home Assitant