Четыре датчика CO2 в одном устройстве: сверяем показания.


1. MH-Z14A — самый заслуженный, но вполне рабочий датчик. Отличается крупным размером.
2. MH-Z19 — «народный» датчик, бюджетный вариант.
3. MH-Z19В — Это исправленная и дополненная версия MH-Z19.
4. SenseAir S8 — самый дорогой и самый авторитетный.


Я уже делал обзор трех из четырёх сегодняшних датчиков. Там можно найти их технические характеристики. Все они более-менее одинаковы. Так что сегодня остановимся на невошедшим в тот отбор MH-Z19B.

Поставляется я антистатическом пакете:


Внутри сам датчик, ножки уже припаяны:


Корпус датчика такой же, как и у MH-Z19, но платы немного отличаются:


Наклейка сбоку позволяет их не перепутать:



Мое устройство выглядит как новогодняя елка:



В прошлом обзоре его уже довольно обсмеяли, так что я не буду на нем останавливаться подробно.Там просто ардуина, экран, часы, четыре датчика, логгер, записывающий на флешку и блютус адаптер.

Если кому интересен код — вот код:

при нажатии выпадет несколько экранов

/*
© Tykhon, 2019.

MH-Z19
TX: 3<->5 A0
RX: 3<->5 A1
Gnd:      Gnd
Vin:      +5v

MH-Z19b
TX: 3<->5 4
RX: 3<->5 A1
Gnd:      Gnd
Vin:      +5v


MH-Z14A
1_+5v:    +5v
2_Gnd:    Gnd
11_RX: 3<->5 7
10_TX: 3<->5 6


S8:
G+:       +5v
G0:       Gnd
Rx: 3<->5 A3
Tx: 3<->5 A2

DS3231
SCL:      A5
SDA:      A4
Gnd:      Gnd
VDD:      5v


TFT
Led: -> 150 Ohm -> 5v
SCK: -> 1 KOhm -> 13
SDA: -> 1 KOhm -> 11
A0:  -> 1 KOhm -> 8
Reset: -> 1 KOhm ->  9
CS:  -> 1 KOhm -> 10
Gnd:      Gnd
Vcc:      5v

*/

#include "Adafruit_GFX.h"                 // for LCD Core graphics library
#include <Adafruit_ST7735.h>              // for LCD  Hardware-specific library
#include <SoftwareSerial.h>
#include "Wire.h"

/////////////////////// for LCD //////////////////////////////

#define TFT_CS     10
#define TFT_RST    9  // you can also connect this to the Arduino reset in which case, set this #define pin to -1!
#define TFT_DC     8

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);  //for LCD 

#define DS1307_ADDR 0x68                     // RTC address

int s8_co2;
int z14_co2;
int z19_co2;
int z19b_co2;
int z19_t;
int z19_ss;
int z19b_t;
int z19b_ss;
int s8_co2_last;
int z14_co2_last;
int z19_co2_last;
int z19b_co2_last;
int s8_co2_mean_last;
int z14_co2_mean_last;
int z19_co2_mean_last;
int z19b_co2_mean_last;
int s8_co2_mean;
int z14_co2_mean;
int z19_co2_mean;
int z19b_co2_mean;
int s8_co2_mean2;
int z14_co2_mean2;
int z19_co2_mean2;
int z19b_co2_mean2;


SoftwareSerial mySerial_z19(A0, A1);
SoftwareSerial mySerial_z19b(4, 5);
SoftwareSerial mySerial_s8(A2, A3);
SoftwareSerial mySerial_z14(7, 6);



byte cmd_z14[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
unsigned char response_z14[9]; 
String ppmString = " ";


byte cmd_z19[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
byte cmd_s8[7] = {0xFE,0x44,0x00,0x08,0x02,0x9F,0x25}; 
unsigned char response_z19[9];
unsigned char response_z19b[9];
byte response_s8[] = {0,0,0,0,0,0,0};

unsigned int current_minute, lastminute;
int second_delay = 30000;                     // delay between measurements, ms
int work_period = 2;                          // period for recording data, min
float smoothing_factor = 0.5;                 // coefficient for Kalman filter
float smoothing_factor2 = 0.15;               // coefficient for Kalman filter

////////////////////////////////////////   functions    //////////////////////////////////////////////


byte bcdToDec(byte val)  {
  return ( (val/16*10) + (val%16) );
}


String getdate(){
  Wire.beginTransmission(DS1307_ADDR);      // Reset the register pointer
  byte zero = 0x00;
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDR, 7);
  int secondint = bcdToDec(Wire.read());
  int minuteint = bcdToDec(Wire.read());
  current_minute = minuteint;
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  String second = String(secondint); if (secondint < 10) {second ="0"+second;};
  String minute = String(minuteint); if (minuteint < 10) {minute ="0"+minute;};
  return String(hour)+":"+minute+":"+second+" "+String(monthDay)+"/"+String(month)+"/"+String(year);
}



void sendRequest_s8(byte packet[]){ 
 mySerial_s8.begin(9600);
 while(!mySerial_s8.available()){                       //keep sending request until we start to get a response 
    mySerial_s8.write(cmd_s8,7); 
    delay(50); 
 }
 int timeout=0;                                         //set a timeout counter 
  while(mySerial_s8.available() < 7 ) {                 //Wait to get a 7 byte response 
    timeout++; 
    if(timeout > 10) {                                  //if it takes to long there was probably an error 
        while(mySerial_s8.available())                  //flush whatever we have 
        mySerial_s8.read(); 
        break;                                          //exit and try again 
    } 
    delay(50); 
  } 
 for (int i=0; i < 7; i++) { 
      response_s8[i] = mySerial_s8.read(); 
 }
  mySerial_s8.end();
}                      



unsigned long getValue_s8(byte packet[]) 
{ 
 int high = packet[3];                                   //high byte for value is 4th byte in packet in the packet 
 int low = packet[4];                                    //low byte for value is 5th byte in the packet 
 unsigned long val = high*256 + low;                     //Combine high byte and low byte with this formula to get value 
 return val; 
}


void sendRequest_z14(){
  mySerial_z14.begin(9600);
  mySerial_z14.write(cmd_z14, 9);
  memset(response_z14, 0, 9);
  mySerial_z14.readBytes(response_z14, 9);

  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response_z14[i];
  crc = 255 - crc;
  crc++;
  if ( !(response_z14[0] == 0xFF && response_z14[1] == 0x86 && response_z14[8] == crc) ) {
    Serial.println("CRC error z14: " + String(crc) + " / "+ String(response_z14[8]));
  } else { 
    unsigned int responseHigh = (unsigned int) response_z14[2];
    unsigned int responseLow = (unsigned int) response_z14[3];
  z14_co2 = (256*responseHigh) + responseLow;
  };
  mySerial_z14.end();
}



void sendRequest_z19(){
  mySerial_z19.begin(9600);
  mySerial_z19.write(cmd_z19, 9);
  memset(response_z19, 0, 9);
  mySerial_z19.readBytes(response_z19, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response_z19[i];
  crc = 255 - crc;
  crc++;
  if (response_z19[0] != 0xFF) {Serial.println("CRC error z19: response_z19[0] != 0xFF: " + String(response_z19[0]));};
  if (response_z19[1] != 0x86) {Serial.println("CRC error z19: response_z19[1] != 0x86: " + String(response_z19[1]));};
  if (response_z19[8] != crc) {Serial.println("CRC error z19: response_z19[8] != crc: " + String(response_z19[8]) + " / "+ String(crc));};
  
  if ( !(response_z19[0] == 0xFF && response_z19[1] == 0x86 && response_z19[8] == crc) ) {
    Serial.println("CRC error z19: " + String(crc) + " / "+ String(response_z19[8]));
  } else { 
    unsigned int responseHigh = (unsigned int) response_z19[2];
    unsigned int responseLow = (unsigned int) response_z19[3];
    unsigned int responseTT = (unsigned int) response_z19[4];
    unsigned int responseSS = (unsigned int) response_z19[5];
    z19_t = responseTT-40;
    z19_ss =  responseSS;
    z19_co2 = (256*responseHigh) + responseLow;
   };
  mySerial_z19.end();
}

void sendRequest_z19b(){
  mySerial_z19b.begin(9600);
  mySerial_z19b.write(cmd_z19, 9);
  memset(response_z19b, 0, 9);
  mySerial_z19b.readBytes(response_z19b, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response_z19b[i];
  crc = 255 - crc;
  crc++;
  if (response_z19b[0] != 0xFF) {Serial.println("CRC error z19b: response_z19b[0] != 0xFF: " + String(response_z19b[0]));};
  if (response_z19b[1] != 0x86) {Serial.println("CRC error z19b: response_z19b[1] != 0x86: " + String(response_z19b[1]));};
  if (response_z19b[8] != crc) {Serial.println("CRC error z19b: response_z19b[8] != crc: " + String(response_z19b[8]) + " / "+ String(crc));};
  
  if ( !(response_z19b[0] == 0xFF && response_z19b[1] == 0x86 && response_z19b[8] == crc) ) {
    Serial.println("CRC error z19b: " + String(crc) + " / "+ String(response_z19b[8]));
  } else { 
    unsigned int responseHigh = (unsigned int) response_z19b[2];
    unsigned int responseLow = (unsigned int) response_z19b[3];
    unsigned int responseTT = (unsigned int) response_z19b[4];
    unsigned int responseSS = (unsigned int) response_z19b[5];
    z19b_t = responseTT-40;
    z19b_ss =  responseSS;
    z19b_co2 = (256*responseHigh) + responseLow;
   };
  mySerial_z19b.end();
}


void tft_form(){
  tft.setTextSize(2);
  tft.setTextColor(0x177F);

  tft.setCursor(2, 4);
  tft.print("z14");
  tft.setCursor(2, 33);
  tft.print("z19");
  tft.setCursor(2, 62);
  tft.print("z19b");
  tft.setCursor(2, 91);
  tft.print("s8");
  
}


void tft_output(){

  tft.setTextSize(2);

  tft.setCursor(56, 4);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z14_co2_mean_last));

  tft.setCursor(56, 4);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z14_co2_mean));
  z14_co2_mean_last = z14_co2_mean;

  tft.setCursor(56, 33);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z19_co2_mean_last));

  tft.setCursor(56, 33);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z19_co2_mean));
  z19_co2_mean_last = z19_co2_mean;

  tft.setCursor(56, 62);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z19b_co2_mean_last));

  tft.setCursor(56, 62);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z19b_co2_mean));
  z19b_co2_mean_last = z19b_co2_mean;

  tft.setCursor(56, 91);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(s8_co2_mean_last));

  tft.setCursor(56, 91);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(s8_co2_mean));
  s8_co2_mean_last = s8_co2_mean;


  
  tft.setTextSize(1);
  tft.setCursor(110, 4);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z14_co2_last));

  tft.setCursor(110, 4);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z14_co2));
  z14_co2_last = z14_co2;

  tft.setCursor(110, 33);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z19_co2_last));

  tft.setCursor(110, 33);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z19_co2));
  z19_co2_last = z19_co2;

  tft.setCursor(110, 62);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(z19b_co2_last));

  tft.setCursor(110, 62);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(z19b_co2));
  z19b_co2_last = z19b_co2;

  tft.setCursor(110, 91);
  tft.setTextColor(ST7735_BLACK);
  tft.print(String(s8_co2_last));

  tft.setCursor(110, 91);
  tft.setTextColor(ST7735_WHITE);
  tft.print(String(s8_co2));
  s8_co2_last = s8_co2;


  
  tft.setTextSize(1);
  tft.fillRect(0, 117, 160, 120, ST7735_BLACK);
  tft.setCursor(0, 117);
  tft.print(String(getdate()));

}



void z19setup() {

/*  2     3    6    7
  {0x86,0x00,0x00,0x00},   // mhz_cmnd_read_ppm
  {0x79,0xA0,0x00,0x00},   // mhz_cmnd_abc_enable
  {0x79,0x00,0x00,0x00},   // mhz_cmnd_abc_disable
  {0x87,0x00,0x00,0x00},   // mhz_cmnd_zeropoint
  {0x8D,0x00,0x00,0x00},   // mhz_cmnd_reset
  {0x99,0x00,0x03,0xE8},   // mhz_cmnd_set_range_1000
  {0x99,0x00,0x07,0xD0},   // mhz_cmnd_set_range_2000
  {0x99,0x00,0x0B,0xB8},   // mhz_cmnd_set_range_3000
  {0x99,0x00,0x13,0x88}};  // mhz_cmnd_set_range_5000
*/

//  byte setrangeA_cmd[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x8F};     // set range 0 - 2000ppm
  byte setrangeA_cmd[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB};     // set range 0 - 5000ppm
//  byte setrangeA_cmd[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86},     // mhz_cmnd_abc_disable
//  byte setrangeA_cmd[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6};     // mhz_cmnd_abc_enable
//  byte setrangeA_cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};     // data request
  unsigned char setrangeA_response[9]; 

  mySerial_z19.begin(9600);

  mySerial_z19.write(setrangeA_cmd,9);
  mySerial_z19.readBytes(setrangeA_response, 9);
  int setrangeA_i;
  byte setrangeA_crc = 0;
  for (setrangeA_i = 1; setrangeA_i < 8; setrangeA_i++) setrangeA_crc+=setrangeA_response[setrangeA_i];
  setrangeA_crc = 255 - setrangeA_crc;
  setrangeA_crc += 1;
  if ( !(setrangeA_response[0] == 0xFF && setrangeA_response[1] == 0x99 && setrangeA_response[8] == setrangeA_crc) ) {
    Serial.println("Range CRC error: " + String(setrangeA_crc) + " / "+ String(setrangeA_response[8]) + " (bytes 6 and 7)");
  } else {
    Serial.println("Range was set! (bytes 6 and 7)");
  }
  delay(1000);
  mySerial_z19.end();
}

///////////////////////////////////////  setup   /////////////////////////////////////////

void setup(void) {
  Serial.begin(38400);
  Wire.begin();
//  z19setup();
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  Serial.println("init");
    
  tft.setTextWrap(false); // Allow text to run off right edge
  tft.setRotation(3);
  tft.fillScreen(ST7735_BLACK);
  tft_form();
 
}

////////////////////////////////////////////////   loop    /////////////////////////////////////////////////////

void loop() {

  sendRequest_z14();
  sendRequest_z19();
  sendRequest_z19b();
  sendRequest_s8(cmd_s8); 
  s8_co2 = getValue_s8(response_s8); 

  if (!s8_co2_mean) s8_co2_mean = s8_co2;
  if (!z14_co2_mean) z14_co2_mean = z14_co2;
  if (!z19_co2_mean) z19_co2_mean = z19_co2;
  if (!z19b_co2_mean) z19b_co2_mean = z19b_co2;

  s8_co2_mean = s8_co2_mean - smoothing_factor*(s8_co2_mean - s8_co2);
  z14_co2_mean = z14_co2_mean - smoothing_factor*(z14_co2_mean - z14_co2);
  z19_co2_mean = z19_co2_mean - smoothing_factor*(z19_co2_mean - z19_co2);
  z19b_co2_mean = z19b_co2_mean - smoothing_factor*(z19b_co2_mean - z19b_co2);

  if (!s8_co2_mean2) s8_co2_mean2 = s8_co2;
  if (!z14_co2_mean2) z14_co2_mean2 = z14_co2;
  if (!z19_co2_mean2) z19_co2_mean2 = z19_co2;
  if (!z19b_co2_mean2) z19b_co2_mean2 = z19b_co2;

  s8_co2_mean2 = s8_co2_mean2 - smoothing_factor2*(s8_co2_mean2 - s8_co2);
  z14_co2_mean2 = z14_co2_mean2 - smoothing_factor2*(z14_co2_mean2 - z14_co2);
  z19_co2_mean2 = z19_co2_mean2 - smoothing_factor2*(z19_co2_mean2 - z19_co2);
  z19b_co2_mean2 = z19b_co2_mean2 - smoothing_factor2*(z19b_co2_mean2 - z19b_co2);

  
  getdate();
  tft_output();
//  if (((current_minute)%work_period == 0)&&(lastminute != current_minute)) {

String dataString = getdate()+"  s8~~:  "+String(s8_co2_mean2)+"  s8~:  "+String(s8_co2_mean)+"  s8:  "+String(s8_co2)+"  z14~~:  "+String(z14_co2_mean2)+"  z14~:  "+String(z14_co2_mean)+"  z14:  "+String(z14_co2)+"  z19~~:  "+String(z19_co2_mean2)+"  z19~:  "+String(z19_co2_mean)+"  z19:  "+String(z19_co2)+"  z19b~~:  "+String(z19b_co2_mean2)+"  z19b~:  "+String(z19b_co2_mean)+"  z19b:  "+String(z19b_co2);
// +"  z19_t:  "+String(z19_t)+"  z19b_t:  "+String(z19b_t);
    dataString.replace(".",",");
    dataString.replace("  ","\t");
    Serial.println(dataString);
  lastminute = current_minute;
//  };

  delay(second_delay);
}



Что же я увидел как только подключил датчик и показания прибора устаканились? Датчик завышал уровень CO2 примерно на 200-250 ppm. Это много, этого нельзя не заметить. Я выставил свою елку на улицу и она там простояла ночь.



На улице должно быть порядка 400 ppm, а никак не 650.

И я решил откалибровать датчик. В этом одно из главных преимуществ этой модели датчика относительно Z19 без «B»: она калибруется не по 0ppm, а по 400ppm. Т.е. вместо азотной камеры этот датчик для калибровки достаточно просто вынести на улицу.

Вообще, в датчике предусмотрена автоматическая калибровка. Время от времени датчик смотрит на свои показания за несколько прошедших дней и находит в них минимальное значение. Исходя из презумпции, что периодически помещение с датчиком проветривается и там оказывается 400 ppm CO2, датчик меняет свои внутренние коэффициенты с тем, чтобы отснятый минимум соответствовал как раз этому уровню. Так что самый простой вариант — подождать, пока калибровка произойдет автоматически.

Второй вариант — использовать специальную команду. Подать ее в порт и все произойдет.
Третий вариант — замкнуть один из выводов датчика на землю и продержать 7 секунд. Именно такой способ я и выбрал.

Показания сразу стали равны 400 ppm и вскоре я внес датчик домой.



Как говорится, «взяли вилку». Был перелет, теперь недолет. На те же 250 ppm теперь меньше. Ну что ж, придется ждать, пока сработает автокорректировка.
А пока посмотрим на совпадение показаний других датчиков. MH-Z14A все больше завышает. MH-Z19 путается в показаниях и график выглядит как кардиограмма инфарктника. Но она все-таки больше совпадает с S8, нежели график MH-Z14A. В прошлом тесте все было наоборот. Так что некоторый дрейф присутствует у всех.
Для сглаживания локальных всплесков и провалов снятых значений я применил фильтр Кальмана. Это простой и эффективный способ отбросить лишнее и сконцентрироваться на важном в показаниях приборов. Для настройки фильтра требуется определить его коэффициент, для чего я добавил в выводимую программой таблицу несколько колонок, а потом построил по ним графики.





Как по мне, 0,15 — отличный выбор.Если прибор нужен в основном для принятия решений уровня «открывать форточку или нет» — то такая точность вполне достаточна, а визуально такой график воспринимается легче.

Еще я захотел сравнить показания встроенных в датчики термометров.



Нельзя однозначно сказать, что рассматриваемый датчик завышает температуру. Термометр — недокументированная фича, и используется он только для выстраивания внутренних коэффициентов датчика. Так что он измеряет свою температуру, а не окружающую.

Пожалуй, надо проверить работу ШИМ- выхода датчика. В некоторых случаях неудобно опрашивать датчик, посылая байты в компорт. Тогда есть альтернатива: на pwm выходе присутствует прямоугольный сигнал с частотой порядка 1 Гц и со скважностью, пропорциональной концентрации СО2. Его довольно легко анализировать и такой способ весьма защищен от помех.



Работает. Впрочем, pwm выход есть и на старой версии этого датчика.

А вот аналоговый выход есть только на «B». Напряжение на нем пропорционально концентрации углекислого газа. Проверим:



Тоже работает. Такой выход позволяет мастерить совсем простые устройства. Буквально из транзистора, пары резисторов и светодиода можно собрать устройство уровня «загорелся красный светодиод — открой окно». Так что это очень полезное новшество.

Конечно, все подробности отличий MH-Z19B и MH-Z19 можно изучить по pdf.Мои же впечатления такие:
Калибровка по 400 ppm — штука работающая и полезная. Датчик выдает более гладкий сигнал, чем его собрат. Вероятно, внутри показания фильтруются. Датчик при запуске не выдает в порт техническую информацию о себе — предел измерений, точность, что-то еще. Так пожалуй лучше, а то если устройство, которое принимает сигнал, настроено что-то там запускать при превышении СО2, то при приходе «2000» может сработать запуск, а датчик просто информировал о своем пределе измерений.
Что еще сказать. Отслеживается зависимость показаний от качества питания. У MH-Z19B — в меньшей степени, у MH-Z19 — в чуть большей. Но больше всего дуреет S8 при недостаточном питании, тому вообще крышу сносит.

Пока я все это изучал, кажется сработала автокалибровка.



Причем сразу у двух датчиков: MH-Z14А, который завышал, стал слегка занижать. А MH-Z19B, который занижал, стал завышать.

В этом датчике калибровку можно определить по обнулению 6-го байта в ответе датчика на запрос данных. В первый час после запуска датчика у него нулевое значение, потом оно постепенно возрастает и за 24 часа дрходит до 142. На этой отметке происходит автокалибровка, байт сбрасывается на 0 и все начинается сначала. Выглядит это так:



Со временем они наверняка придут к почти совпадающим показаниям. У меня так уже было с тремя датчиками из прошлого обзора.



За неделю тогда они практически спелись в унисон.

Итог: все датчики работают. Все показывают более-менее адекватные цифры. Выбирать я бы стал по удобству применения в конкретном приборе.

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Планирую купить +70 Добавить в избранное +91 +145
+
avatar
  • kvvhost
  • 06 сентября 2019, 08:40
+7
Спасибо! Очень полезная инфа. Про калибровку «улицей» не знал)
+
avatar
  • Berlin
  • 06 сентября 2019, 09:07
0
А можно отключить автокалибровку? Поставить кнопку калибровки и раз в месяц делать в комнате сильный сквозняк на 5 минут? Для всех четверых.
+
avatar
  • batal
  • 06 сентября 2019, 09:15
0
Можно
+
avatar
  • Lithe
  • 06 сентября 2019, 09:41
0
На MH-Z19B автокалибровку можно отключить.
+
avatar
  • VAlm
  • 06 сентября 2019, 09:11
+8
А «улица» у вас в лесу? Какой-то ненадежный метод калибровки. Если рядом с домом автомагистраль, ТЭЦ дымит и прочие варианты подъёма уровня СО2 включая глобальное потепление?
+
avatar
  • batal
  • 06 сентября 2019, 09:18
+2
В этом случае воздух в помещении никак не будет лучше уличного. К сожалению.

Все эти датчики за 400 принимают самое низкое значение которые видели в период автокалибровки. Если у вас на улице (и в помещении соответсвенно) никогда не опускается ниже 500, то через какое-то время датчики примут эти 500 за 400 и будут показывать именно 400.

В таком случае помогут лишь Double NDIR — у них есть «референсный» обьем воздуха с которым происходит сравение.
+
avatar
  • Ammo1
  • 06 сентября 2019, 09:24
0
Это почти не имеет значения. Ну будет на улице не 400, а 450, но не более того.
+
avatar
+2
Уровень СО2 на улице зависит от разных факторов, и может быть и меньше 300 (рядом с лиственными деревьями летом) и днями держаться 500-600-700 (безветренная погода, зима, вы находитесь в «яме» из-за возвышенностей вокруг).
+
avatar
  • Ammo1
  • 09 сентября 2019, 11:21
0
Нет не может.
+
avatar
+1
Пруфа в данный момент предоставить не смогу, но видел это неоднократно своими глазами, и не только на бытовых сенсорах. Сенсоры СО2 использую с 2014 года.
+
avatar
  • Mercury
  • 09 сентября 2019, 13:27
+1
Содержание CO2 в атмосфере в Европе

В африканских джунглях

В лесах на юге Австралии

и тд.

согласно википедии содержание CO2 еще 100 лет назад составляло около 300ppm.
Вам сколько лет? )))
+
avatar
+1
Мне 44, только это к делу не относится.
И ссылками я вас тоже могу завалить. Только я не о средней температуре по больнице, а о конкретных измерениях, собственноручно сделанных калиброванными датчиками.
Я вам даже могу рассказать, как распределяется уровень углекислоты по высоте конкретной пятнадцатиметровой берёзы в берёзовом лесу под окном.
А также про то, с какой скоростью изменяется уровень углекислоты, например, в изолированном помещении, после открытия заслонки на улицу (без принудительной вентиляции). У диффузии есть скорость. И углекислый газ тяжелее воздуха.
+
avatar
  • Mercury
  • 09 сентября 2019, 15:08
0
ссылка не рабочая.
не получилось у вас завалить.
а других нет? ну интересно же почитать не анонима из интернета, а что то более научное
+
avatar
0
Позволю себе исправить чужую ссылку (лишнее http). вот
+
avatar
  • Mercury
  • 09 сентября 2019, 16:47
0
Ваш пруф не засчитан, по ссылке нет статьи про CO2 в 300ppm на верху деревьев. По вашей ссылке статья от 1991 года, и она о том, что в лесу внизу CO2 выше, т.к. там собственно тень, а на верху к середине дня CO2 минимально, и статья без каких либо конкретных цифр.
да и про то, что CO2 тяжелее кислорода в 1,5 раза и собирается в низинах я надеюсь всем известный факт и то что в некоторых таких низинах кислород вообще вытесняется CO2 тоже должны знать.
Это все физика.
А вот то что береза возле дома(надеюсь на солнечной стороне и только днем) работает как насос CO2 и на выхлопе получается О2 слышу впервые.
Какие же конкретно калиброванными датчиками вы измерили этот факт?
+
avatar
+1
Это не статья, а книга 1991 года, и это не пруф, а научное обоснование. По ссылке аннотация. Книга стоит денег. Я её не читал, только ссылки на неё постоянно попадаются и отдельные страницы из неё.Там же ниже есть несколько других релевантных трудов.
Ночью я не измерял. Cамое меньшее, что видел — 290ppm.
Растения все в той или иной степени поглощают углекислоту и выделяют кислород. Это биология.
По поводу низин. Диффузии плюс малейших перемещений воздуха обычно достаточно для равномерного перемешивания углекислоты.
Город, где я живу, находится в кольце гор. Иногда (пару раз за зиму) возникает некая климатическая аномалия, когда на доступных мне высотах несколько дней держится до 800ppm. Я не знаю, почему.
Если вам сильно важны эти факты, попробую в этом году запруфить. Только лето, к сожалению, закончилось.
Конкретно эти измерения делались прибором iCeeO2-700. Датчик внутри их собственный, двухкамерный.
+
avatar
  • Mercury
  • 10 сентября 2019, 11:05
0
del
+
avatar
0
Здравствуйте. Напоминаю, что вы обещали пруф, лето наступило. Очень интересная тема.
+
avatar
  • Ammo1
  • 09 сентября 2019, 23:12
0
Это просто глюки калибровки.
Я тоже с 2014.
+
avatar
0
Дело в том, что двухкамерный сенсор в iCeeO2-700 не требует проветривания для калибровки. Да и другие имеющиеся сенсоры показывали плюс-минус то же самое.
+
avatar
  • Ammo1
  • 10 сентября 2019, 11:10
0
Возможно, у Вас действительно уникальный специфический случай из-за того, что город окружён горами. Это Алма-ата или Абакан?
+
avatar
0
Это Нижний Тагил.
+
avatar
-3
Ставите кислородный баллон, продуваете раз в месяц
+
avatar
  • standov
  • 06 сентября 2019, 12:12
+1
Особо без разницы, больше интересно другое — глобальный уровень co2 за 10 лет заметно подрос и уже не 400, учитывают ли это датчики или все по старинке оптимисты )
+
avatar
+1
Судя по скорости роста, подрос он где-то на 20ppm. Датчик ошибается больше, чем уровень вырос.
+
avatar
  • standov
  • 08 сентября 2019, 01:30
0
Ну у меня больше академический интерес, понятно что *пока* для бытовых задач «температуру кипения считаем 100»
+
avatar
0
Я к тому, что смысла такой небольшой дрейф пока учитывать нет.
+
avatar
  • batal
  • 06 сентября 2019, 09:15
+7
На основе двухлетнего опыта с 19\19B\S8

Если точно уверены что помещение хотя бы раз в сутки проветривается — можно брать 19B. Если нет — лучше все таки доплатить до S8.

На работе рядом стоят S8 и MH-Z19B. Если ночью нормально проветрилось — показания совпадают до 10ppm. Но если вдруг ночью на работе кто-то был или по какой-то причине не проветрили, то MH-Z19B легко может занижать хоть на 200ppm. Вплоть до следующей автокалибровки (раз в сутки).
S8 калибруется по показаниям за 8 дней. Раз в неделю то точно помещение проветривается.
(хоят на форумах встречались случаи когда помещение до «уличного» состояния не проветривалось месяцами, в этом случае и S8 показывал неадекватно низкие показания)

Ну или как вариант — брать MH-Z19B и отключать автокалибровку после одного нормального проветривания.

И да, у всех показания зависят от температуры. По-этому калбировать на улице тоже нужно аккуратно.
+
avatar
+1
Интересный обзор! А автокалибровку ведь можно программно отключить?
+
avatar
  • vkozloff
  • 06 сентября 2019, 09:44
0
Фильтр Калмана тоже на ардуинке реализовывали, иди уже на компе при обработке данных?
+
avatar
  • tykhon
  • 06 сентября 2019, 11:59
+4
На Ардуине. Если без адаптивности и предсказания, то что там реализовывать?
A = A — x *(A-A`)
, где:
А — сглаженное значение
А` — только что измеренное
x — коэффициент сглаживания.
Вот и вся математика. Очень просто и эффективно.
+
avatar
+2
Калманом хорошо показания из разных источников сочетать. Тут хватило бы медианного фильтра.
В любом случае познавательная и отличная работа
+
avatar
  • mooni73
  • 06 сентября 2019, 10:44
+2
В прошивке www.letscontrolit.com/wiki/index.php?title=ESPEasy для esp8266 можно откл/вкл автокалибровку из браузера. Использую уже пару лет, всё стабильно.
+
avatar
  • batal
  • 06 сентября 2019, 11:10
0
Плюсую. Тоже эту прошивку использую давно. И для S8 и для MH-Z19B.
+
avatar
  • futsker
  • 06 сентября 2019, 10:49
0
дежа-вю какое-то. Вроде я уже этот обзор и картинки полгода назад видел…
+
avatar
  • lesha_01
  • 06 сентября 2019, 10:54
0
Пользуюсь уже больше 3 лет MH-Z19, в целом доволен. Последние пару недель и MH-Z19B взял — с автокалибровкой ведёт себя неадекватно, с отключенной автокалибровкой всё куда лучше выглядит, уровень 400 ppm уже совпадет хотя бы (на графике MH-Z19 черного цвета, MH-Z19B — синего):
+
avatar
  • batal
  • 06 сентября 2019, 11:30
0
А с чего вы взяли что именно MH-Z19 у вас показывал правильные данные?

Судя по графику, как раз таки MH-Z19B показывал все верно. В помещении у вас не опускается ниже 500. И вот когда автокалибровка прошла, эти 500 он принял за 400 :)

(по крайне мере по этому одному графику я бы сделал именно такой вывод)

По собственному опыту, MH-Z19B откалиброван правильно если вообще нет показаний 399 и ниже. Даже если он видит показание условно 380, то показывать он все равно будет 399.
+
avatar
  • lesha_01
  • 06 сентября 2019, 12:21
0
Когда в квартире весь день открыты все окна и никого нет дома — 400 может быть легко :)
+
avatar
  • Legalas
  • 06 сентября 2019, 19:20
0
У меня дома в Москве рядом с бот садом, минимум что видел 430. Еще очень зависит ветренный ли день.

От 19B отказался, стоят S8.

По датчикам Co2 система решает в какую комнату гнать воздух.
+
avatar
+1
Спасибо!-очень познавательно и красочно-доступно описано, подкреплено примерами…
Беру на вооружение(-в полезное..).
+
avatar
0
Посоветуйте датчик для автоматического включения вентилятора вытяжки в мастерской, с регулировкой мощности. Чтобы при повышенном загрязнении воздуха (пыль, пары всякой дряни, задымление) включалась вытяжка с изменяемой мощностью в зависимости от степени загрязнения. Вентилятор на DC моторе 24в.
+
avatar
  • tykhon
  • 06 сентября 2019, 12:05
0
Именно для мастерской я бы взял самый дешевый ИК датчик пыли, он как раз для сильных загрязнений больше подходит, и датчик СО, который угарный, а не углекислота. Какой-нибудь промышленный, и желательно не металлооксидный. А уж рулить вентилятором — дело несложное, готовых решений масса.
+
avatar
  • Oksion
  • 06 сентября 2019, 12:34
0
Для мастерской надо два датчика, это как уже тут было сказано датчик пыли, лучше лазерный но можно на ИК светодиодах. И второй обязательно это так называемые air quality sensor типа CCS811 или IAQ-CORE они будут отслеживать всякие пары красок растворителей и просто даже «спертый» воздух. Плюс нужен будет корпус через который прокачивать некоторое количество воздуха. Сенсор качества воздуха можно держать включенным постоянно и он не требует калибровки, а вот сенсор пыли желательно включать чем реже тем лучше, например на минуту каждые 10 минут и принимать решения о том нужно-ли включать вытяжку. Ещё после включения датчика пыли где-то первую минуту другую работы у него будут не правильные показания, так что нужно к примеру включать его, ждать две минуты работы, снимать показания и выключать на 8 минут, и так по кругу
+
avatar
  • Oksion
  • 06 сентября 2019, 12:41
0
И ещё раз в полгода нужно будет разбирать датчик пыли и продувать его основательно, и сделать предфильтр (методом эксперимента подобрать его плотность) чтобы датчик пыли не так быстро забивался более грубой пылью чем 2,5-10PM
+
avatar
  • NevGi
  • 06 сентября 2019, 11:51
0
Сюда бы для сравнения дешевый датчик углекислого газа MQ-135 с Али.
Здесь подключение, документация и апроксимация:
wiki.amperka.ru/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:mq135#%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B
+
avatar
  • vkozloff
  • 06 сентября 2019, 12:11
0
Он вообще не датчик углекислого газа, он датчик TVOC
+
avatar
  • tykhon
  • 06 сентября 2019, 12:12
+1
У меня пригоршня таких датчиков есть. Но сюда добавлять не стал — не тот уровень. Точность не та, долговечность. И он на многие газы реагирует. У меня была идея задействовать сразу несколько разных таких датчиков, чтобы более точно находить концентрации газа. Скажем, датчик выдает 0,8В. А мы не знаем, может быть это следовые значения этанола, а может дикий зашкал водорода (к примеру). Чтобы разобраться, мы смотрим на датчик по метану. У него показания не завышены, значит водорода в атмосфере мало, значит это все-таки этил.
Вот так, имея датчиков больше чем газов, можно составить систему линейных уравнений из их графиков чувствительности, и если повезет (если матрица окажется невырожденной), то найти концентрацию всех газов более-менее точно.
Но идея пока не реализована и не уверен, что будет. Все-таки в этих датчиках измерения скачут, их еще прогревать надо, да еще и неэкономичны они, не хочется вкладывать столько сил в такой проект.
+
avatar
  • rvrs
  • 06 сентября 2019, 12:42
0
можно ссылку на SenseAir S8?
+
avatar
  • Siroc-co
  • 06 сентября 2019, 15:04
0
Мне тоже интересно. Их разные модификации есть, разные цены…
+
avatar
  • batal
  • 06 сентября 2019, 17:16
+1
Ищите модификацию 0053
К примеру вот aliexpress.com/item/33030441543.html (первая попавшася, сам у него не покупал)
+
avatar
  • rvrs
  • 07 сентября 2019, 01:25
0
спасибо
+
avatar
  • Tosha
  • 06 сентября 2019, 13:24
+1
У меня какая-то проблема с mh-z19. Похоже он не просто требователен к питанию, а очень требователен к его качеству. Питал от литиевого аккумулятора и повышайки — показания зашкаливали, пока не добавил большой конденсатор. От USB компа тоже в показаниях ерунда.
+
avatar
  • INN36
  • 06 сентября 2019, 14:33
0
а <мысли вслух>
Про калибровку «улицей» в городах и 400 ппм.
Это как бэ прорыв в метрологии.

Я могу представить (кратко, на пальцах) результаты двухсуточных исследований городского воздуха в одном месте, расположенном в городской черте на предмет объемной доли СО2. Городок куда меньше города-героя Ленинграда (откуда ТС) и города-героя Москвы (откуда Надёжин).
У меня только 1 вопрос — на показания сабжевых датчиков как-то влияет концентрация углеводородов в воздухе? Для домохозяек — ключевое слово «метан».
Ежели — да, то все может оказаться еще интереснее…
+
avatar
  • Lvr
  • 06 сентября 2019, 14:40
+1
Как мне кажется, всё от цели зависит. Если нужно измерять уровень CO2, то да, калибровка улицей вариант плохой. Если же нужно получить какие-то цифры, на основании которых решать, проветривать или нет — то можно и по улице калибровать.
+
avatar
  • INN36
  • 06 сентября 2019, 16:32
-3
Все верно, +.

Если нужно измерять уровень CO2, то да, калибровка улицей вариант плохой.
Не плохой, а дебильный.

Если же нужно получить какие-то цифры
То можно получить какие-то цифры.
Получены цыфры: 5,6,7,8,9,0,1,2,3,4,5… И, внезапно — 9,4,7,3!!!
Вот это поворот!

получить какие-то цифры, на основании которых решать, проветривать или нет
Надо просто открывать форточку/окно в комнате при любой возможности.
В лаборатории: тоже самое, либо включать имеющеюся приточно-вытяжную вентиляцию.
Это открытие сделано лет 200 тому как. Не благодарите.
+
avatar
  • Oksion
  • 06 сентября 2019, 14:39
+1
Кстати в целом для принятия решения о проветривании воздуха в квартире достаточно использовать датчики качества воздуха, показатели которых в целом хорошо коррелируют с количеством СО2 в помещении, и при этом стоят в несколько раз дешевле, не требуют калибровки и служат дольше
+
avatar
  • DainB
  • 06 сентября 2019, 15:06
+1
А зачем собственно знать уровень CO2 в помещении?
+
avatar
  • INN36
  • 06 сентября 2019, 16:36
0
Думаю, что бы объяснить любителям сахары, что в сахаре «более свежий воздух, детка» + мифические 400 ппм))
+
avatar
+2
Я держал в руках (тестировал — громко сказано) десяток разных NDIR датчиков, в том числе весьма экзотических. Так вот, MH-Z19 (в том числе B) — это один из самых наименее понравившихся мне по совокупности факторов вариант.
MH-Z14 — хороший, но старый (много потребляет, капризен по питанию, горячий). SenseAir S8 — ОЕМ китайская штуковина, ничего общего с легендарными К30 и К33 не имеющая.
Мы сейчас в своих изделиях используем Т6703.
И да, альтернативы NDIR датчикам для целей вентиляции помещений нет (они быстрее и точнее). Все эти eCO2 (например, CCS811) — маркетинговый шлак, показывающий погоду на Марсе. Есть ещё древние датчики накаливания (например, MQ-135) — тоже убожество (очень долго выходит на режим, отравляется разными парами, часто врёт).
+
avatar
  • batal
  • 06 сентября 2019, 17:18
0
А можно поподробнее про S8? Графики хотя бы (сравнение с T6703 к примеру)

Ну и про Т6703 тоже, благо цена у него вполне адекватная (на али по крайне мере).
+
avatar
+1
Графики сравнения S8 и T6703 ничего не дадут, так как они в значительной степени совпадут. Вот у MH-Z19 несколько более «нервный» график, но это, ИМХО, не очень важно. Важнее нагрев, импульсное потребление тока, алгоритм АВС, стабильность показаний без калибровки, а также интерфейсы. Ну и цена, а также доступность.
Я бы не сказал, что S8 плохой датчик. Просто он «среднекитайский», и по критериям цена-качество несколько проигрывает Т6703.
Преимущества Т6703:
— дешевле,
— штатная версия 5000ppm (S8 теперь тоже показывает, после обновления прошивки, но на PWM только 2000ppm осталось),
— наличие интерфейса I2C,
— лучше работает АВС (тут надо сказать, что этот алгоритм, видимо, самая большая тайна производителей этих датчиков, подробно не расскажу, но Т6703 может обходиться без проветривания минимум две-три недели).
+
avatar
0
посмотрел T6703 на Али… они в два раза дороже MH-Z19B к тому же нет аналогового выхода. А по цифре у MH-Z19B элементарно отключается калибровка (либо включается тогда, когда нужно) Так что нет, по цене 2х MH-Z19B я 1 T6703 не возьму. К тому же с паспортной точностью у него проблемы — он менее точен.
+
avatar
0
Насчёт двух раз вы горячитесь, процентов на 30-40 дешевле.
MH-Z19B — это довольно неудачный датчик, как я уже сказал. Хотите дёшево и аналоговый выход — купите лучше MH-Z14A.
Зачем вам, кстати, геморрой и танцы с бубном при разнице в 500 рублей с Т6703?
+
avatar
+1
Либо Вы не умеете искать, либо толсто троллите.
Вверху мой заказ и цена за которую я его купил, внизу страница поиска, причем я выбрал кусочек с самой дешевой ценой+доставка
+
avatar
0
И то, и другое;) И троллю толсто, и искать не умею. Минимум за MH-Z19B — 65 злотых, включая доставку. Минимум за Т6703 — 111 злотых, включая доставку. Разница — 41,5%.
Только за минимальную цену я бы покупать не стал, это часто отбраковка из отбраковки.
+
avatar
0
с математикой тоже не очень :DDDD

А 103.03 + 9.04 = таки 112.07
что уже дает нам 56.6% от цены такого же точно «отбракованного» (самого дешевого) Т6703
Если вы считаете что 56.6% и 100% это не близкое к «в два раза» — то хз, вам виднее…
Да, и в рублях это не 500, а 800 разница, ну так, на всяк случай.
За сим откланиваюсь, надоело уже вас поправлять в каждой фразе.
+
avatar
  • Mercury
  • 06 сентября 2019, 22:38
0


Цена T6703 выше цены MH-Z19B на 35%
или
цена MH-Z19B ниже цены T6703 на 26%

Да и в рублях на текущий момент разница следующая 1702,11 — 1259,56 = 442,55.

ну и добавлю ссылки что бы каждый мог проверить для своей страны
T6703
MH-Z19B
+
avatar
0
а вы специально выбирали дорогой лот с MH-Z19B? и чем вас не устроил мой вариант, который дешевле? за 16.76$ с доставкой в РФ против вашего за 18.5?
хосспади… сплошные фейспалмы…
PS, но хотя бы T6703 нашли дешевле, уже плюс
+
avatar
  • Mercury
  • 07 сентября 2019, 10:59
0
вот вы всех поливаете фейспалмом, а от вас ссылок кроме скриншота с замазанной ценой не было.

ну ок, давайте вашу цену возьмем за основу, а это к моей -$1,74, специально возьму вчерашний курс $ — 68.08руб. Получается в рублях ваш лот дешевле моего на 118,45руб, итого разница в рублях 561.
Ну и проценты
Цена T6703 выше цены MH-Z19B на 49%
или
цена MH-Z19B ниже цены T6703 на 33%

Получается на разницу в цене максимум можно купить только половину MH-Z19B, но ни как не два. Т.е. при покупке двух T6703 можно купить три MH-Z19B. И в рублях разница не 800 рублей, ну так, на всякий случай.
+
avatar
  • Mercury
  • 07 сентября 2019, 11:20
0
нашел ваш лот — aliexpress.com/item/32706795833.html
Цена двух шт в РФ — $31,20
$15,6 каждый.
Ну и проценты
Цена T6703 выше цены MH-Z19B на 60%
или
цена MH-Z19B ниже цены T6703 на 37,6%
Ну и в рублях.
1702,11 — 1062,115 = 640



Что и требовалось доказать — два MH-Z19B на цену T6703 в $25 купить не возможно. Как и разницы в цене в 800 рублей тут нет.
зы: ссылка на лот с ценой в $16 с бесплатной доставкой в РФ — aliexpress.com/item/33012363245.html
+
avatar
+2
Господа, что же вы так убиваетесь, вы же так не убьетесь.
Правд много, на всех хватит.
+
avatar
  • batal
  • 07 сентября 2019, 16:52
+1
Спасибо!

По ABC достаточно мануалы посмотреть :)

T6703 — период 21 день
S8 — период 8 дней.
19B — период один день (это вообще за гранью разумного)
+
avatar
  • batal
  • 07 сентября 2019, 16:54
+1
Спасибо!

То есть если не важны 5000 (мои S8 кстати показывают, 2600 точно) и i2C то вполне себе и S8 неплох (с учетом использования дома где раз в неделю таки проветриваем).

По ABC достаточно мануалы посмотреть :)

T6703 — период 21 день
S8 — период 8 дней.
19B — период один день (это вообще за гранью разумного)
+
avatar
+1
Тут важен вопрос о ваших целях и задачах.
Для показометра лучше иметь предел 5000ppm, чтобы не зашкаливало. А для целей управления вентиляцией лучше 2000ppm, так как у такого сенсора разрешение в целевом диапазоне в два раза выше (и, соответственно, он быстрее и точнее работает).
По поводу I2C. Это сейчас стандарт для всех видов сенсоров. И, если делать комбинированный датчик (как в нашем случае), то I2C однозначно удобнее. Опять же, если у вас уже есть сеть Модбас, то вам это неважно.
С периодом ABC не всё так просто, как в мануале. S8\K30\T6703 тоньше подходят к вопросу. Если ошибка (несоответствие неким ожидаемым профилям показаний) большая, то могут перекалиброваться раньше. Если ошибки по профилям нет, но уровень в 400ppm за указанный период они не видели, то будут дрейфовать понемногу, но сразу на несколько сотен не скакнут, как MH-Z19.
Кстати, MH-Z14 — это копия T6613, вплоть до мельчайших подробностей. Есть версия, что Winsen был производителем T6613\T6603 для Telaire. А потом что-то у них не срослось. Но вот MH-Z19 — это их собственная разработка, а это совсем другое дело.
Ещё хочу сказать, что и S8, и T6703 в цивилизованных странах стоят сильно других денег. Так что то, что все покупают на Али, это либо «третья смена», либо неплохая подделка. Есть и хуже варианты, например, все продающиеся на Али датчики Бош Сенсортек (ie BME280) — довольно плохая подделка, которую использовать нереально.
+
avatar
0
все продающиеся на Али датчики Бош Сенсортек (ie BME280) — довольно плохая подделка, которую использовать нереально.
Да что вы говорите?
использую BME280 с Али уже полгода. Да, самый дешевый лот :D
Температура совпадает с 3мя DS18B20 (в пределах документированных погрешностей естественно), влажность в калибровочной среде показывает с точностью до 1% (хотя ДЩ регламентирует 3%) Альтиметр показывает адекватную моей географической местности высоту над уровнем моря. Давление проверить не могу, но по скольку оно присутствует основным параметром в формуле расчета альтиметра, результат которого совпадает с данными для моей местности, нету оснований сомневаться в этом измерении.
Специально «убивал» датчик — мочил в ИПА, использовал в среде предельной влажности (90-100%), заливал водой, замораживал, создавал условия конденсата — работает гад такой «поддельный» и кажет от 74.5 до 75.6% влажности в «солевой» калибровочной среде.

(длительность теста, и соответственно «ширина» графика — 6 часов)
Так что, «святой отец, или крестик снимите, или штаны оденьте» ©… Ну или с руками у вас что-то не так…
+
avatar
-1
Насчёт своих рук ничего исключить не могу, скорее всего, какие-то аномалии есть.
А вот по поводу сенсора ВМЕ280 могу рассказать следующее.
Сначала измерьте его потребление и сравните с Бошевским даташитом. Увидите, что у подделки оно больше в разы.
Затем возьмите тепловизор и посмотрите температуру сенсора. Высокое потребление приводит к разогреву. И тот факт, что создатели учли это при калибровке температуры/влажности, никак не помогает в целом ряде практических случаев.
Ну и наконец, сравните показания датчика давления (тут-то Бош непревзойдённым должен быть) на высоте земли и, скажем. второго этажа. И опять же сравните с даташитом.
DS18B20 также очень много неоригинальных, но это отдельная история.
Если вы используете такие сенсоры для поделок на фанерке при помощи соплемёта, ещё не значит, что их можно ставить в изделия и продавать людям. Как-то так.
Очередной вброс: не менее 100% силовых компонентов некитайских марок, которые продаются на Алиэкспресс — подделка. А также много популярных микросхем, например, микроконтроллеров Атмел.
+
avatar
+3
Знаете, если «подделка» выглядит как «оригинал», работает как «оригинал», и стоит кратно меньше «оригинала» — то мне все-равно на то, что анонимус из интернета говорит, что это «подделка» :D
Все мои ардуины с Али работают отлично, датчики — отлично, БМЕ280 отслеживает и определяет высоту на столе и на уровне пола (перепад чуть более 0.7м).
Силовые мосфеты — соглашусь, тут все грустно. Но во-первых есть и другие способы, во-вторых арбитраж Али. К тому же феты относительно легко проверить и сравнить с ДЩ. Остальная силовуха — очень грустная песня. Для любителей пощекотать нервы, это факт.
Для коммерческих проектов народ заказывает непосредственно у производителя или на специализированных площадках, за цену, часто, х10 от цены на Али\Тао. И это оправдано! Для «домашнего хобби» — кому как, у каждого свои критерии рентабельности и свои коэффициенты конвертации время\деньги.
+
avatar
0
Проверить мосфет в домашних условиях тоже довольно непросто. Подделать сопротивление в открытом состоянии можно при размерах кристалла, на порядок меньших, чем нужно. Характериограф у вас дома вряд ли найдётся, а стенд на полное напряжение и мощность собирать под каждый транзистор — явно дороже, чем купить заведомо настоящие.
+
avatar
0
Выход, на мой взгляд, такой — покупать в Китае китайские компоненты, в Европе — европейские, в США — американские.
+
avatar
  • Ivan374
  • 23 сентября 2019, 17:40
0
А где гарантия, что в Европе и США не китайское продают? Ещё в середине 90-х на чисто лондонских сувенирах, привезённых прямиком из Лондона, было без стеснения написано «Made in China».
+
avatar
+1
Вот те места, где есть обещания отсутствия подделок:
digikey и mouser — из США,
farnell — из Европы,
lcsc — из Китая.
Правильных магазинов на самом деле больше, я указал наиболее крупные. Кроме того, некоторые российские поставщики также проверяют то, что продают. И, если контрафакт, так прямо и пишут. Например — Промэлектроника.
Ещё мы иногда заказываем прямо на сайте производителя компонентов. Например — Микрочип.
+
avatar
  • batal
  • 11 сентября 2019, 10:43
0
Да, про BME280 вкурсе :) У самого такой лежит без дела. Стабильно врет на 1 градус по температуре и процентов на 10 по влажности.

За остальную ифну спасибо. Полезно.
+
avatar
  • Legalas
  • 06 сентября 2019, 19:23
0
Да используйте сколько угодно. Вы конкретику можете озвучить — чем Т6703 лучше S8?
+
avatar
  • Rost
  • 27 апреля 2021, 14:42
0
Добрый день.
Имею T6703, заказанный с Али для теста.
Датчик был установлен на макетную плату совместно с esp8266 и экраном, на который выводятся показания.
После первичного включения он показывал порядка 1500ppm, но через сутки показания пришли в норму.
Пару недель он работал нормально, но недавно начались какие-то приколы — то 0ppm показывает, то около 200, то 700-800. Помещение оборудовано вентиляцией и нормально проветривается, за предыдущее время я показаний выше 600ppm не видел. А тут после этих глюков его вообще понесло — неделю показывал 700+ ppm и дальше все хуже и хуже, постепенно и за 1000ppm перевалило.
Прочитал тут, что это может быть из-за нестабильного питания (при срабатывании датчика яркость экрана проседала), установил по питанию доп. конденсаторы, просадки исчезли. Но это никак не повлияло на работу датчика. Он как показывал 1000+ ppm, так и кажет.
Собсно вопрос, в чем тут дело?
Может можно как-то его принудительно заново откалибровать? Выключение питания на сутки не помогает.
+
avatar
0
Конденсаторы обычно не помогают, даже большие (до 360мкФ экспериментировал). Внутри Т6703 лампочка накаливания, импульсные токи довольно высокие, поэтому для работы нужно надёжное питание 5В. Причём, в нашем датчике на входе 12В (дальше импульсный DC-DC до 5В), так вот витой пары сечением 0,4мм2 только-только хватает. Более тонкий провод (или омеднённый вместо медного) или более низкое напряжение (что увеличит ток) приводит к критичным просадкам питания.
У вас либо что-то где-то окислилось, либо датчик повредился такими скачками питания (что маловероятно, но всё-таки возможно).
+
avatar
  • Rost
  • 28 апреля 2021, 08:09
0
В общем, я подал ему по i2c команду на сброс, и он вроде стал приходить в себя.
Похоже, в нем из-за провалов по питанию ABC Logic сошла с ума.
+
avatar
  • Oksion
  • 06 сентября 2019, 17:36
+2
Кстати в следующем году выйдут в свет уже XENSIV PAS210 которые обещают вытеснить существующие датчики СО2 поживем увидим
+
avatar
  • pumv
  • 06 сентября 2019, 17:48
0
Здорово!
Как раз все ходил вокруг да около этих «коробочек», но домой поставил таки CCS811 (CJMCU-8128) — за миниатюрность. Впихнул на платку рядом с D1-mini — все получилось не больше спичечного коробка. Работает.
Правда, выяснилось, что библиотек на CCS811 на lua нет — сам морочился. Но зарабюотало :)
Конечно, это «маркетинговый шлак и игрушки», но чисто по ощущениям вполне себе коррелирует со спертым воздухом и перегаром ;)
Думал уже брать что-то посерьезнее. Но раз такая штука на подходе — подожду. )
+
avatar
  • Oksion
  • 06 сентября 2019, 18:51
+2
Для дома вполне подходит, когда не нужно точных данных а нужно просто проветривать периодически, отлично справляется с ситуациями когда в квартире появляются посторонние летучие вещества, например во время готовки или просто растворитель открыл.
+
avatar
  • Mercury
  • 06 сентября 2019, 21:42
0

Зеленый график — MH-Z19
Синий — CCS811
Датчики находятся в 2 см друг от друга.
Так, для сравнения и сделать вывод.
+
avatar
  • batal
  • 11 сентября 2019, 10:44
0
Подтверждаю. Тоже игрался с CCS811. Показывает погоду на марсе.
+
avatar
+1
Уважаемый tykhon
Есть вопрос по поводу самокалибровки и обхода этой гадости с помощью «простых костылей»
А именно… К сожалению, ЕСЛИ брать ответ от датчика по аналогу или PWM — то нету возможности ему давать по UART команду отключения калибровки (которая должна подаваться при каждом его включении). С другой стороны вроде как период калибровки у него 24ч. В связи с этим вопрос к Вам — можете ли Вы проверить точный интервал времени через которое он калибруется, и, что на много важнее, если незадолго до этого времени его принудительно выкл-вкл (ну скажем сделать ему обесточивание на 30 сек) — начнет ли он отсчет периода для калибровки с нуля или нет.
Т.е. развивая мысль до конца — если приделать ему костыльный таймер на отключение его от питания каждые условно 23ч50м на 30 сек — будет ли он пытаться калибровать себя или нет.
Заранее спасибо, очень надеюсь на Вас (проведение эксперимента и ответ в теме)
+
avatar
+1
Самокалибровка — это не гадость, а необходимость. Другой вопрос, как устроен алгоритм этой калибровки. MH-Z19 и так обладает пониженной стабильностью показаний, а с отключенной калибровкой может уплыть за месяц-два в неведомые дали.
+
avatar
0
Спасибо за мнение, но я задал вполне конкретный вопрос. Меня интересует ответ только на мой конкретный вопрос. Еще раз спасибо.
+
avatar
+1
Мой MH-Z19 больше года работает с отключенной автокалибровкой и показания никуда не уплыли.При отсутствии людей всегда приближается к 400. А вот с MH-Z19B пока не пойму что лучше сделать…
+
avatar
  • Mercury
  • 06 сентября 2019, 21:50
+1
Так же мой MH-Z19 показывает ожидаемые значения. Любой всплеск или провал можно объяснить — наличием людей в помещении, открылось окно, закрылось окно, готовка на газовой плите и тд.
+
avatar
0
Вам повезло с конкрентым экземпляром, но так может повезти не всем.
Дело в том, что источником ИК-излучения внутри датчика является по сути лампа накаливания. Её характеристики со временем неизбежно «уходят». Прошивка датчика, кстати, может учитывать факт старения лампочки по некоторой кривой. Материалы отражателя также стареют и это влияет на показания.
+
avatar
0
Бредядина №1 — ВСЕ NDIR-ы с лампочками!, в т.ч. T6703, за который вы топите (значок фейспалма)
Бредятина №2 — это не нормально вбивать ежесуточную поправку на 1% (минимум, а судя по постам Андрея — вообще на 4%) шкалы, при лайфтайме 5 лет (значок огромного фейспалма)
Бредятина №3 — ЧТО может стареть в лампочке накаливания, которая работает в режиме недокала (для смещения в ИК диапазон) да еще и в импульсном режиме?! (значок тройного фейспалма)
+
avatar
0
Лайфтайм сейчас 15 лет.
А про лампочку — так вы откройте, посмотрите. Она, конечно, не простая, но спираль вполне себе видна.
Про старение ламп накаливания вот так сходу не нашёл документов. Но был такой прибор — спектрофотометр ГретагМакбет Спектролино. И производитель довольно доходчиво обосновывал сроки калибровки и скорость ухода параметров этой самой лампочкой накаливания, работающей в недокале.
Про какие 4% вы пишете — не очень понял.
+
avatar
+1
Несколькими сообщениями ниже Андрей писал:
Так вот новейший во время автокалибровки забрасывает на 200 ppm вверх после 24 часов,
200ппм=4% от 5000ппм шкалы.
в доках я встречал о максимально 50ппм ежедневной калибровке, т.е. 1% полной шкалы.
В любом случае калибровка на такие огромные величины без серьёзных причин каждые 24 часа — это бред и вредительство.
+
avatar
0
С последним утверждением безусловно согласен.
+
avatar
0
Посмотрим, что он покажет через сутки… ;) До этого, то отключал, то включал автокалибровку, то нули пытался выставлять. Но почему то долговременно вровень они не хотят идти. Сейчас попытаюсь недельку понаблюдать с автокалибровкой. Если электричество не пропадет.
ЗЫ Важный совет: датчик должен быть поближе к блоку питания и желательно припаян. Любые потери питания в цепи — неадекватность показаний. Из опыта должно быть стабильное напряжение.
+
avatar
0
угу, причем желательно прямо на датчик припаять тантал+керамику
+
avatar
0
Про питание.
Это всё-таки сенсоры, и обеспечить в точке их обычной установки (на стене, на высоте 1,7-2,5 метра от пола) наличие близости к блоку питания — несколько затруднительно.
Правильно — до датчика вести 12-24 вольта, а возле него устанавливать импульсный преобразователь. Дроссель и конденсаторы преобразователя должны иметь достаточные номиналы, чтобы сенсор работал нормально.
+
avatar
+1
У моих двух датчиков алгоритм такой (см картинку в другом моем сообщении ниже) у одного через 62 минуты, а у другого через 72 запускается таймер и каждые последующие 10 минут значение 6байт+256*7байт увеличивается на 1. Ровно через сутки видно по состоянию этих байтов происходит автокалибровка. Если питание отключить до автокалибровки, то все начинается сначала.
+
avatar
0
оо! Я чувствовал :)
Спасибо!
Еще момент — ровно через 24 часа после старта «таймера», т.е. после 62/72 минут, или включительно с этим «предразогревом»?
+
avatar
+1
Последняя цифра у датчика который сбрасывается на 0 — 142. Т.е. 1420 минут прошло после первого часа после включения.
Можете понаблюдать, а то я уже начинаю путаться в них. Сегодня была первая автокалибровка после сброса и выставления «нуля». ссылка
+
avatar
0
ага, 23ч40м + «разогрев».
Короче надо его тушить раз в 20-23 часа для гарантированного обнуления таймера.
еще раз спасибо!
+
avatar
  • tykhon
  • 08 сентября 2019, 03:26
0
Что-то у меня чепуху датчики выдают по этим байтам. Точно 6й + 256*7й? Не наоборот — 6й*256 + 7й?
+
avatar
+1
Вот пакет:
255 134 2 30 65 0 27 3 251
Отсчет слева направо с нулевого байта. В данном случае 27+256*3=795.
Тройка на 7-й позиции показывает количество «сбросов» 6-го байта.
Это для датчика 2019 года. В датчике 2018 года 7-й байт всегда 0.
+
avatar
  • tykhon
  • 06 сентября 2019, 23:42
0
Я попробую, но не обещаю. Не всегда удается обеспечить длительную непрерывную работу устройства.

С моей точки зрения логично ориентироватсья по критерию наполнения статистики. Сделал столько-то измерений — калибровка. Потому что иначе нужно либо встраивать в датчик часы реального времени и их питание, либо вовсе лишить датчик возможности калибровки при эпизодической его работе, когда статистика сбрасывается при отключении питания. Но это мои домыслы.

Точно могу прислать таблицу показаний датчика, если нужно. Когда накопится достаточно данных.
+
avatar
+1
У меня 2 датчика MH-Z19B уже 2 месяца лежат рядом с датой выпуска апрель 2019 и декабрь 2018. Так вот новейший во время автокалибровки забрасывает на 200 ppm вверх после 24 часов, а постарше вполне адекватен (или может не происходит автокалибровка?). На картинке графики с моментом автокалибровки и внизу графики с 6 и 7 байтами ответа по которым виден момент автокалибровки. Не могли бы записать графики 6 и 7 байта пакета ответа, посмотреть на форму графиков. У меня у того что поновее число (6, 7 байт) растет, потом сбрасывается через сутки на 0, а у другого это число всегда растет с пиками в момент автокалибровки.
+
avatar
  • tykhon
  • 06 сентября 2019, 23:29
0
Интересное наблюдение, добавлю эти байты в таблицу, которая сбрасывается на флешку. Сообщу о результатах.
+
avatar
  • tykhon
  • 13 сентября 2019, 15:52
+1
Значит так. Докладываю. В МН-Z19b меняется только 6й байт — от 0 до 142. На значении 142 происходит калибровка и все начинается сначала. На полный цикл уходит 24 часа 2 минуты. При этом после холодного старта датчика счет этого байта начинается только через час.
Дата выпуска датчика 05.08.2019
+
avatar
0
Мой датчик 2019 года после установки нуля вручную при первой автокалибровке подпрыгивает на 195 ppm и дальше на эти 195 ppm и завышает. На 400 ppm никогда не опускается сколько не проветривай. А 2018 года ведет адекватно. В общем какой то глючный датчик.
Но смотрю и у Вас на второй калибровке тоже подпрыгнуло на 400 и после этого ниже 600 за 2,5 суток не опустилось ни разу…
+
avatar
  • kusav74
  • 06 сентября 2019, 23:59
0
подключил датчик, питание +3вольта. При включении показывал 5000. После калибровки стал показывать 395 и значение не меняется.
Если подключить к питанию +5вольт, то перестает совсем отвечать.
Может кто подскажет что может быть?
+
avatar
  • FAlVik
  • 07 сентября 2019, 07:27
+1
Датчику нужно питание 5.5В.
А сделав калибровку ты загубил все.
Если у тебя версия В, то дай нормальное питание и откалибруй.
+
avatar
0
5.5 это максимум. Так что лучше ориентироваться на средние 5 вольт.
+
avatar
0
Каккой датчик? Может без «B»?
+
avatar
0
У вас проблема, скорее всего, в слабом источнике питания 5 вольт. А от 3 вольт датчик нормально работать не может.
+
avatar
  • kusav74
  • 07 сентября 2019, 16:58
0
Питаю от USB.
Переключил снова питание датчика на +5.
Датчик не отвечает. Причем при питании +3 датчик мигает, а на +5 не мигает совсем.
Может дело в несовпадении уровня питания и уровня Tx и Rx?
Но везде подключают напрямую.
+
avatar
  • kusav74
  • 07 сентября 2019, 17:30
0
нашел, что на esp нет +5 на контакте Vin.
Подключил напрямую, датчик вроде ожил, но данные читаются через раз. Иногда выдает ошибку контрольной суммы.
+
avatar
0
если это NodeMCU, то пять вольт находятся на ноге VU
+
avatar
0
Вот ссылка, существенно дополняющая информацию по датчику MH-Z19B: habr.com/ru/post/401363/
Однако, повторюсь, MH-Z19B — не самый лучший вариант.
+
avatar
0
И вот ещё ссылка про команды: revspace.nl/MHZ19
А вот разборка: forum.mysensors.org/topic/7761/mh-z19-teardown
+
avatar
0
Это для MH-Z19. БЕЗ «B»! MH-Z19B — немного не так отвечает.
+
avatar
0
Да, вы правы, извиняюсь за неточность.
+
avatar
  • Aksakal
  • 07 сентября 2019, 17:10
+1
Единственный обзор который плюсанул за последние несколько месяцев. Автору СПАСИБО!!!
+
avatar
0
Очень качественный обзор! Спасибо!
Подскажите чем заменить защитный фильтр для датчика MH-Z14, у меня он пришел в негодность после чистки. Почему -то при измерениях без фильтра датчик стал более резвым.
+
avatar
0
Подскажите, если использовать выход UART, показания будут более качественными, по сравнению с использованием аналогового выхода у датчиках MH-Z14 и MH-Z19B?
+
avatar
0
Кто-то пробовал датчик DS-CO2-20?
+
avatar
  • AlexZa
  • 28 ноября 2020, 23:47
0
Здравствуйте! Подскажите пожалуйста, как на базе одного из датчиков S8 или MH-Z19В собрать устройство, чтобы на экранчике показывалось значение CO2 и по факту превышения значения CO2 выше допустим 650 датчик давал на выход некое напряжение чтобы могла открыться заслонка Gruner 227-024-05 (0-10В). Буду рад, если кто-то поделится инструкцией как это сделать!
Спасибо!
+
avatar
  • tykhon
  • 31 декабря 2020, 07:22
0
Подробную инструкцию «включить паяльник в розетку, установить на плату контроллер...» вряд ли кто-то напишет. А кратко
— примерно так:
Подсоединить датчик к контроллеру, программой отслеживать его показания. При благоприятной помеховой обстановке достаточно анализировать аналоговый выход датчика. При длинных проводах от датчика к контроллеру лучше цепляться к выходу ШИМ. При необходимости крутить настройки датчика, снимать с него температуру — коммуницироваться через последовательный порт. Показания датчика сравнивать с пороговыми значениями, При превышении подать сигнал на реле или мосфет для исполнительного устройства. Если нужна плавная регулировка — то только мосфет, а регулировать ШИМом. Для более стабильной работы ввести гистерезис, чтоб прибор не дергал почем зря вентилятор или заслонку.
Если есть конкретные вопросы по какому-нибудь из этапов — задавайте, отвечу. Но если вообще ничего не понятно, то лучше доверить эту работу кому-нибудь.
+
avatar
  • Fakel63
  • 21 февраля 2021, 09:32
0
самое простое решение, не требующее знаний в программировании и особых навыков пайки:
взять D1 mini, или NodeMcu, датчик S8 (дороже) или MH-Z19В и поставить прошивку ESP EASY
как прошить, мануалов полно

для отображения значений датчика CO2 я использовал семисегментный tm1637
0,56 достаточно крупный и яркий (доступно 5 цветов, зеленый самый тусклый почему то)
пример кода для отображения на дисплее
On s8#ppm do
7dn,[s8#ppm]
endon

заслонки у меня нет) просто открывал окно пошире, когда загорался красным трехцветныйсветодиод
пример кода для срабатывания
On s8#ppm do
if [s8#ppm] > 600 and s8#ppm] < 900
gpio,15,1 // горит желтый светофор
else
gpio,15,0
endif
endon

On s8#ppm do
if [s8#ppm] > 900
gpio,14,1 // горит красный светофор — срочно проветрить
else
gpio,14,0
endif
endon

On s8#ppm do
if [s8#ppm] < 600
gpio,12,1 // горит зеленый светофор
else
gpio,12,0
endif
endon

соответственно на срабатывание GPIO можно повесить реле заслонки — электромеханическое или твердотельное
зы на идеальность кода не претендую
+
avatar
0
как у MH-Z19В отключить автокалибровку?
+
avatar
  • AndryG
  • 09 января 2021, 02:39
0
Вопрос про адресацию Senseair S8.
В примерах даташита обращение идет по адресу «любой сенсор», хотя в том же даташите пишут, что это значение не должно использоваться в продакшине. И как быть с адресом датчика?