Всплески измерений CO2 и TVOC с помощью датчика CJMCU-811

Во-первых, я не уверен, правильно ли задавать этот вопрос. Пожалуйста, не стесняйтесь направлять меня куда-нибудь еще, если это необходимо.

Я наблюдаю большие всплески измерений CO2 и TVOC с помощью датчика CJMCU-811. На графике это выглядит примерно так:

В эти моменты всплесков вокруг датчика не происходит ничего особенного, я не дышу на датчик и т.д.

Я использую Arduino Uno со следующим кодом:

/******************************************************************************
  Read CO2 and TVOCs from CJMCU-811 sensor

  Arduino connection:
  3.3V to 3.3V
  ACC to 3.3V
  GND to GND
  WAK to GND
  SDA to A4
  SCL to A5

******************************************************************************/
#include <Wire.h>

#include "SparkFunCCS811.h"
#define CCS811_ADDR 0x5B

CCS811 mySensor(CCS811_ADDR);

void setup()
{
  Serial.begin(9600);
  Serial.println("CCS811 Basic Example");

  Wire.begin();

  CCS811Core::status returnCode = mySensor.begin();
  if (returnCode != CCS811Core::SENSOR_SUCCESS)
  {
    Serial.println(".begin() returned with an error.");
    while (1);
  }
}

void loop()
{

  if (mySensor.dataAvailable())
  {

    mySensor.readAlgorithmResults();

    delay(1);

    Serial.print("CO2 ");
    Serial.print(mySensor.getCO2());

    Serial.print(", tVOC ");
    Serial.print(mySensor.getTVOC());

    Serial.println();
  }

  delay(2000);
}

Конечно, я могу фильтровать и не беспокоиться о них, но, тем не менее, мне любопытно, что является причиной этого. Есть какие-нибудь предположения, что может быть причиной этого?

, 👍3

Обсуждение

Два предложения ... у вас есть второй датчик? Если вы запустите два датчика близко друг к другу, и пики совпадут, значит, вокруг датчика что-то происходит. Или... запечатайте датчик внутри контейнера... всплески все равно случаются?, @Jaromanda X

@Jaromanda X, хорошо, у меня их два, так что их будет легко увидеть., @kamilazdybal

Если «всплески» вызваны какой-то «внутренней» ошибкой, согласно ответу, вы всегда можете сделать 5 или около того показаний за такое короткое время, как позволит датчик, удалить любые выбросы, а затем усреднить остальные - код для выполнения это не так уж сложно, @Jaromanda X


3 ответа


Лучший ответ:

2

У меня есть два таких датчика в долгосрочной настройке, и я очень хорошо знаю эти всплески. Когда-то я приложил много усилий для отладки, и я лично отказался от ccs811 и теперь использую другой датчик.

Тогда я уже попробовал то, что предлагает Джароманда в своем комментарии. Оба моих датчика показали одинаковое поведение, в то время как пики на обоих датчиках никак не коррелировали. Кроме того, если я правильно помню, эти ошибочные показания, по-видимому, соответствовали определенным значениям. Я попробовал несколько подтягиваний, которые также не имели никакого значения, и на осциллографе все выглядело нормально. Распечатка выходных данных функций, связанных с I2C, показала, что связь всегда была стабильной. Если бы это было связано с I2C, я бы ожидал, что эти ошибочные показания в любом случае будут полностью случайными (чего, по моему опыту, нет).

Моя последняя (расплывчатая) теория заключалась в том, что, возможно, существуют условия гонки между вычислением и интерфейсом I2C или, возможно, АЦП и алгоритмом аппроксимации (это все "внутри" датчика). Однажды я сам создал такую ошибку, которая привела к аналогичному поведению.

По крайней мере, я почти уверен, что вы ничего не можете сделать в своем скетче, чтобы исправить эту проблему, потому что по указанным причинам это вряд ли связано с проблемами связи. Возможно, вы захотите обойти это или поискать обновленную прошивку. Или (мое предпочтительное решение) выберите датчик, который выполняет истинное измерение CO2 (ccs811 возвращает только псевдо-вычисленное приближение эквивалента CO2). Эти датчики более высокого класса используют технологию NDIR и стоят лишь немного дороже (все еще менее 50 долларов), но вы, вероятно, получите гораздо более надежные показания, меньше проблем и более широкий диапазон измерений (до 0-40000 ppm против 400-8192 ppm).

Ps: следовали ли вы рекомендациям, касающимся "времени выгорания"? Потому что, честно говоря, это была моя ошибка: я просто подключил его из любопытства, чтобы проверить связь, а потом прочитал об этом шаге. Но я не верю, что это как-то связано с этой проблемой, потому что есть физические причины, по которым это следует делать, но эти артефакты, похоже, имеют цифровую природу.

,

Какой датчик CO2 вы выбрали?, @Dave W. Smith

@DaveW.Smith Мне лично нравится SCD30 от sensirion, но есть и другие датчики NDIR-CO2 (это не рекомендация продукта)., @Sim Son


1

Я видел аналогичное поведение у 3 датчиков CJMCU-811, которые я купил (в одном заказе, так что, вероятно, одна и та же производственная партия) в середине 2019 года. Два показали показатели с устойчивым, резким, но некоррелированным ростом вверх. Третий периодически поднимался в зону 2000-3000 промилле, а затем возвращался к ~ 450 промилле (в пустой комнате с приличным потоком воздуха). Логический анализатор на линиях I2C не показал проблем (или я их пропустил).

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

Я использую библиотеку AdaFruit ccs811 на ESP8266s (Wemos D1 minis).

Месяцы спустя: замены вышли из строя, иногда выдавая показания в диапазоне 3000 ppm до сброса, после чего они возвращаются к диапазону 400-600 ppm на некоторое время, пока не поднимутся выше. Я рекомендую избегать ccs811.

,

Падение значений после сброса — это то, чего следует ожидать. В техническом описании говорится: «После записи в MEAS_MODE для настройки датчика в режиме 1-4 запустите CCS811 на 20 минут, прежде чем будут получены точные показания», поэтому все, что вы читаете сразу после сброса, является мусором., @Dmitry Grigoryev

Я ожидаю падения, но не с 3000 до 400, потом медленно дрейфует до 800, потом всплеск обратно до 3000 и висит там до сброса. Это помещение с открытым окном, а датчик размещен так, чтобы в него проникал ветерок., @Dave W. Smith


2

Существует библиотека CCS811, которая поддерживает запрос внутренней версии прошивки датчика и прошивку новой прошивки (последняя версия 2.0.1). В старых версиях прошивки использовалась компенсация выгорания, которая, по-видимому, приносила больше вреда, чем пользы (вместо этого новая прошивка требует, чтобы датчики выгорали в течение 48 часов), а также полагалась на внешний датчик для температурной компенсации, который просто отсутствует на большинстве дешевых материнских плат. По иронии судьбы, многие дешевые платы поставляются с прошивкой CCS811 со старой прошивкой, которая периодически проверяет напряжение на плавающем выводе и использует это значение для корректировки расчетов CO2 / TVOC.

Если на вашей плате нет термистора, рассмотрите возможность обновления прошивки датчика до версии 2.0.1. Даже если на платах установлен термистор (например, оригинальный Adafruit), новая прошивка может дать лучшие результаты.

,