Сенсоры углекислого газа (CO₂)

 
+
-
edit
 

Balancer

администратор
★★★★★
Придавил, таки, жабу и вот, почта доставила сенсор CO₂:

1PCS module MH Z19 infrared co2 sensor for co2 monitor Free shipping new stock best quality-in Sensors from Electronic Components & Supplies on Aliexpress.com | Alibaba Group

Cheap sensor tap, Buy Quality sensor oximeter directly from China sensor monitor Suppliers:   ≡≡≡≡≡ Welcome to our Store & // www.aliexpress.com
 

Припаять ноги — 5 минут. Ещё 5 минут — воткнуть в Arduino через софтовый последовательный порт. Раза в три времени больше потратил, пока всё своё радиобарахло по углам нашёл, а то с осени, вроде, ничем таким не занимался :)

Скетч очень простой:
code cpp
  1. #include <SoftwareSerial.h>;
  2.  
  3. SoftwareSerial mySerial(8,9); // RX,TX
  4. byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
  5. unsigned char response[9];
  6.  
  7. void setup() {
  8.   Serial.begin(9600);
  9.   mySerial.begin(9600);
  10. }
  11.  
  12. void loop()
  13. {
  14.   mySerial.write(cmd, 9);
  15.   memset(response, 0, 9);
  16.   mySerial.readBytes(response, 9);
  17.   int i;
  18.   byte crc = 0;
  19.   for (i = 1; i < 8; i++) crc+=response[i];
  20.   crc = 255 - crc;
  21.   crc++;
  22.  
  23.   if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
  24.     Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
  25.   } else {
  26.     unsigned int responseHigh = (unsigned int) response[2];
  27.     unsigned int responseLow = (unsigned int) response[3];
  28.     unsigned int ppm = (256*responseHigh) + responseLow;
  29.     Serial.println(ppm);
  30.   }
  31.   delay(10000);
  32. }


Всё это дело слегка обдувается кулером (12В, работающий от 5В).



Первые цифры после прогрева пошли порядка 860..870 ppm! Немедленное проветривание! :D (при 600 начинаются первые проблемы с работоспособностью и усталостью, при 800 — уже совсем тяжёлая атмосфера). Открыл окно, пошёл в магазин. Вернулся — было 399/400 ppm. Это уровень чистого, даже не городского воздуха :) То ли за окном воздух, действительно, чист, то ли показания немного занижаются. Пока сидел, показания подросли где-то до 440..460 ppm. Надышал. Ветер захлопнул окно и началось: 500..560..590... Сейчас, правда, почему-то до 530-540 упало :)

В общем, надо цеплять это дело к нормальной ноде, собирать значения, сигнализировать о превышении. И надо купить второй датчик для второй комнаты :) Выберу другую модель, чтобы показания можно было сравнивать...
 44
+
-
edit
 

Balancer

администратор
★★★★★

Измеряем концентрацию CO2 в квартире с помощью MH-Z19

Практически любая метеостанция, включая дешевые китайские модели за несколько долларов, умеет измерять основные параметры воздуха — температуру и влажность. С... // geektimes.ru
 

Рассказ о том как маленький датчик углекислого газа(co2) MH-Z19, расширил мое понимание об окружающем мире

Все началось с того что я работаю в офисе, где как водится нет нормальной вентиляции, зато есть много народу половине которого все время жарко, а второй половине отчаянно дует. Понятно ... // mysku.ru
 



Блин, у него дурацкая схемотехника :) Питание от 3.6В до 5.5В, но при этом логические уровни — 3.3В. Я подключал по обезьяньи, последовательный порт на Ардуино — и оно работает. Но, по хорошему, надо ставить конвертер уровней при питании от 5В и работе с 5В схемами. А вот 3.3В от той же ESP8266 уже может не хватить. Хотя тоже кто-то подключает и оно работает...
 44
+
-
edit
 

Balancer

администратор
★★★★★
Balancer> В общем, надо цеплять это дело к нормальной ноде

Очень долго руки не доходили. ESP8266 имеет только один UART. И в NodeMCU управляется им. Т.е. MH-Z19 по последовательному порту одновременно с компом не подключишь. Долго эту проблему не брался решить, хотя даже макетку ещё в начале лета или конце весны спаял :)

А на днях попался тут «IDE в браузере» — по сути просто ide.lua, позволяющий редактировать файлы по воздуху через браузер. Ну и сегодня собрался, подключил, собрал, настроил...

Теперь сенсор гонит показания концентрации углекислоты в MQTT и его забирают все домашние желающие :)

Первый аттач — так оно выглядит сейчас в железе. С другой стороны ещё есть гребёнка под дисплейчик, но пока не подключал.

Второй — показания MQTT в Андроиде

Третий — график в Home Assistant. В 22:00 хорошо видно изменение концентрации, когда я окно открыл для проветривания :)

Надо ещё сглаживание добавить и можно попробовать настроить включение вентилятора по Sonoff :)
Прикреплённые файлы:
 
 44
+
-
edit
 

Balancer

администратор
★★★★★
На ночь, чтобы не жужжал, отключил кулер возле датчика. А то он крошечный и потому высокооборотный. Через некоторое время ночью показания твёрдо «залипли» на 398..399..400 ppm. Включил кулер — сразу скакнули до 560..570. В общем, циркуляцию воздуха сенсору надо организовывать. Или на сквозняк где-то, или кулером, вот. Надо будет кулер попробовать от 3.3В запитать. Если не заведётся (номинал — 5В) или всё равно шуметь будет, то поставлю большой и тихий :)
 44
+
-
edit
 

Balancer

администратор
★★★★★
Интересный глюк. Вчера отрубал питание ноды-измерителя CO2. Сегодня смотрю — а обновления данных нет. Ну, думаю, глюк, зависло... Перезагружаю, ресеты шлю — пофиг. Нода запускается, а данных по концентрации с неё нет. Остальное — OK, данные — NOK.

Полез дебажить. Благо, с ide.lua это относительно просто :D

Обнаружил, что вместо цепочки


0000: FF 86 cc cc xx xx xx xx
0008: ss


где cccc = концентрация, xxxxxxxx - какая-то фигня и ss = контрольная сумма, стало приходить:


0000: 86 cc cc xx xx xx xx ss
0008: FF



Т.е. старший байт приходит в конце. Так и не понял, почему так, просто поправил код, чтобы понимал оба варианта :-/
 44
+
-
edit
 

Sandro
AXT

инженер вольнодумец
★☆
Balancer> Т.е. старший байт приходит в конце. Так и не понял, почему так, просто поправил код, чтобы понимал оба варианта :-/

А с чего ты решил, что это старший байт? ;)

Тут один умелец замучил его до того, что он переключился на протокол MODBUS, наличие которого в китайской документации не отражено: Тёмная сторона MH-Z19 / Geektimes

Вполне возможно, что если его помучить ещё, то там и протокол SPI обнаружится, а у него 0xff как раз типовой байт-заглушка для случаев, когда передавать нечего. Если его просто читать, не подавая команды, он случаем не 0xff 0xff по кругу передаёт? Или молчит?
... так пускай наступает на нас холодным рассветом новый день ...  43.043.0
+
-
edit
 

Balancer

администратор
★★★★★
Sandro> А с чего ты решил, что это старший байт? ;)

Ну, не старший, а первый :) Смысл-то в том, что должен приходить первым, а стал (внезапно) приходить последним. Последовательность остальных байт осталась прежней.

Sandro> Тут один умелец замучил его до того, что он переключился на протокол MODBUS

Он его замучил. А я использую штатно и не экспериментировал :)

Sandro> Вполне возможно, что если его помучить ещё, то там и протокол SPI обнаружится, а у него 0xff как раз типовой байт-заглушка для случаев, когда передавать нечего. Если его просто читать, не подавая команды, он случаем не 0xff 0xff по кругу передаёт? Или молчит?

Так в том-то и дело, что данные идут нормальные. Только первый байт переместился в конец :)
 44
+
-
edit
 

Balancer

администратор
★★★★★
Вчера, наконец, повесил второй MH-Z19 в другой комнате. Прицепил его и ещё пару сенсоров к старенькому Arduino Nano на 168-м чипе и скармливаю данные в Orange Pi по USB.

Сразу после включения два разных MH-Z19 показывают 100ppm разницы, через день работы — практически одинаково.

Концентрация CO2 в соседних комнатах при открытой двери весьма близка, хотя обычно и отличается, так что ставить несколько датчиков в разных частях комнаты в расчёте на неравномерность концентрации смысла нет, диффузия и конвекция перемешивают воздух хорошо.

Вчера поставил пиццу в духовку, концентрация CO2 в ближней к кухне комнате сразу взлетела до 1940ppm, в дальней — до 1450ppm. Пришлось экстренно проветривать :) Надо добавить голосовое сообщение о необходимости проветривания от умного дома «откройте окно, мне душно!» :) Только нужно вводить ограничение, чтобы повторялось не чаще, скажем, раза в 5..10 минут. Понятно, что такое реализовать можно и в bash'е на файл-флагах в пару строчек кода, но задача на самом деле весьма частая. Надо сделать общее решение. Может, велосипедить смысла нет и есть уже что-то готовое для ограничения частоты числа вызовов? Впрочем, ещё удобно добавить и проверку, чтобы, предупреждения не было, если концентрация уже итак падает. Так что, наверное, придётся велосипедить. Вообще, чую, нужно делать Bash-Forth. В Форте такие вещи очень удобно реализуются :)
Прикреплённые файлы:
mqtt_hbr_co2-day.png (скачать) [497x280, 26 кБ]
 
mqtt_neron_co2-day.png (скачать) [497x280, 21 кБ]
 
 
 44
+
-
edit
 

Balancer

администратор
★★★★★
В копилку. Как на NodeMCU / Lua читать показания сенсора по serial.

-- https://github.com/asantoni/brewbot/blob/master/brewbot.lua

uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)

uart.on("data", 9, function(data) 
    -- raw_data = data
    trace = data

    if string.byte(data, 1) == 0xFF and
       string.byte(data, 2) == 0x86 then
         local high_level_conc = string.byte(data, 3)
         local low_level_conc = string.byte(data, 4)
         co2 = high_level_conc * 256 + low_level_conc
         co2_norm = math.floor((co2_norm or co2) * 9/10 + co2/10 + 0.5)
    end

    if string.byte(data, 1) == 0x86 and
       string.byte(data, 9) == 0xFF then
         local high_level_conc = string.byte(data, 2)
         local low_level_conc = string.byte(data, 3)
         co2 = high_level_conc * 256 + low_level_conc
         co2_norm = math.floor((co2_norm or co2) * 9/10 + co2/10 + 0.5)
    end


--    foo = data
end, 0)
    
function sendData()
    uart.write(0, 0xFF, 0x01, 0x86,0x00,0x00,0x00,0x00,0x00, 0x79)
end

-- Рекомендуют дёргать не чаще раза в 10 секунд.
tmr.alarm(2, 10000, 1, function()
    sendData()
    loadfile("print.lua")("CO2="..(co2 or "nil").."| ", 100)
end)


Это вариант, учитывающий описанный у меня выше в теме глюк, когда поменялся порядок байт :)

Результат складывается в глобальные переменные co2 и co2_norm. Вторая — усреднённое значение с предыдущими измерениями для фильтрации выбросов. В общем, оказалась практически бесполезной.
 44

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru