вторник, 9 января 2018 г.

Датчик CO2 MH-Z19 – используем просто и полезно


Как сохранять в спальне свежий воздух?
Конечно, лучше всего спится с приоткрытым окном, за которым шумит океан. Но кто как, а я в Москве, и приоткрывать окно не вариант.
Что ж, нет океана, зато есть голова и руки.
Один из показателей качества воздуха – это уровень углекислого газа (СО2). Отследить его нам поможет датчик MH-Z19 от братского китайского народа.
У этого датчика несколько важных преимуществ: 1) довольно дешёвый; 2) не надо колхозить ардуину или ещё что-то – можно подключить прямо к компьютеру (ну, почти. Через переходник UART-USB. А ещё можно через моего любимого Мини-Монстра ).
Поскольку хост для датчика у нас уже есть, будем подключать к компьютеру под управлением Ubuntu.
Вообще, многое уже описано в этой хорошей статье на Гиктаймс. Но когда доходит до практики, всегда есть нюансы. О них и расскажу.
Итак, датчик MH-Z19 можно подключить через USB-UART переходник, и от него же и запитать.
Кое-где пишут, что питания может оказаться мало, а уровни UART у датчика не 5V-tolerant, но у меня всё работает нормально, даже при длине провода около 4 м.
Итак, всё просто: VCC в VCC, GND в GND, RX в TX. Вот и всё, подключили.
Теперь нужно получить данные на наш хост. Я уже привык к полноценному UART и долго не мог понять, почему в терминале закорючки. Скорость, кстати, 9600, все остальные параметры стандартные. А дело в том, что датчик отдаёт неформатированные данные в чистом 16-ричном формате. Придётся конвертировать.
В статье на Гиктаймс есть пример скрипта, но у меня он не заработал.
Работает так:
RESP=$(timeout 1 echo -en '\xff\x01\x86\x00\x00\x00\x00\x00\x79' > /dev/ttyUSB0 & head -c 9 /dev/ttyUSB0 | hexdump -v -e '1/1 "%d" " "');
RA=($RESP);
let CO2=${RA[2]}*256+${RA[3]};
echo "CO2: $CO2";


Команду датчику нужно запускать с таймаутом, иначе она будет висеть. Потом просто читаем данные из порта и конвертим их.
Ну и, соответственно, будем включать или выключать проветривание в зависимости от уровня углекислого газа. Тут есть тонкий момент: датчик ОЧЕНЬ чувствительный. Более адекватными показания будут, если усреднять их за определённый период времени.
Код такой:

#!/bin/bash
count=0;
while [ $count -lt 6 ]; 
do
RESP=$(timeout 1 echo -en '\xff\x01\x86\x00\x00\x00\x00\x00\x79' > /dev/ttyUSB0 & head -c 9 /dev/ttyUSB0 | hexdump -v -e '1/1 "%d" " "');
RA=($RESP);
let CO2tmp=${RA[2]}*256+${RA[3]};
//приводим переменную к типу "число"
CO2tmp=$( printf "%.0f" $CO2tmp );
let count=$count+1;
if [ $CO2tmp -gt 399 ]; 
then
if [ $count -lt 6 ]
then
CO2+=$CO2tmp;
sleep 10;
continue;
fi
let CO2=$CO2/6;
if [ $CO2 -gt 850 ]; 
then
//переключаем "Мини-Монстром" проветривание
wget -q http://192.168.1.12/password/?sw=4-1 --spider
fi
if [ $CO2 -lt 720 ]; 
then
//переключаем "Мини-Монстром" проветривание
wget -q http://192.168.1.12/password/?sw=4-0 --spider
fi
count=0;

fi
sleep 10;
done


Включаем задачу в Cron и радуемся.

Свежих снов!


Комментариев нет:

Отправить комментарий