Всплески измерений 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);
}
Конечно, я могу фильтровать и не беспокоиться о них, но, тем не менее, мне любопытно, что является причиной этого. Есть какие-нибудь предположения, что может быть причиной этого?
@kamilazdybal, 👍3
Обсуждение3 ответа
Лучший ответ:
У меня есть два таких датчика в долгосрочной настройке, и я очень хорошо знаю эти всплески. Когда-то я приложил много усилий для отладки, и я лично отказался от 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
Я видел аналогичное поведение у 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
Существует библиотека CCS811, которая поддерживает запрос внутренней версии прошивки датчика и прошивку новой прошивки (последняя версия 2.0.1). В старых версиях прошивки использовалась компенсация выгорания, которая, по-видимому, приносила больше вреда, чем пользы (вместо этого новая прошивка требует, чтобы датчики выгорали в течение 48 часов), а также полагалась на внешний датчик для температурной компенсации, который просто отсутствует на большинстве дешевых материнских плат. По иронии судьбы, многие дешевые платы поставляются с прошивкой CCS811 со старой прошивкой, которая периодически проверяет напряжение на плавающем выводе и использует это значение для корректировки расчетов CO2 / TVOC.
Если на вашей плате нет термистора, рассмотрите возможность обновления прошивки датчика до версии 2.0.1. Даже если на платах установлен термистор (например, оригинальный Adafruit), новая прошивка может дать лучшие результаты.
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- SRF04 Ультразвуковой датчик - неточные показания
Два предложения ... у вас есть второй датчик? Если вы запустите два датчика близко друг к другу, и пики совпадут, значит, вокруг датчика что-то происходит. Или... запечатайте датчик внутри контейнера... всплески все равно случаются?, @Jaromanda X
@Jaromanda X, хорошо, у меня их два, так что их будет легко увидеть., @kamilazdybal
Если «всплески» вызваны какой-то «внутренней» ошибкой, согласно ответу, вы всегда можете сделать 5 или около того показаний за такое короткое время, как позволит датчик, удалить любые выбросы, а затем усреднить остальные - код для выполнения это не так уж сложно, @Jaromanda X