КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Датчик углекислого газа (CO2), SCD40 (Trema-модуль)

Общие сведения:

Trema-модуль датчик углекислого газа SCD40 — это модуль построенный на базе NDIR-датчика работающего на основе фотоакустического эффекта, способного определять концентрацию углекислого газа CO2 в воздухе. Для компенсации показаний в корпус датчика встроен датчик влажности и температуры SHT4x, показания которого так же доступны пользователю.

Видео:

Редактируется...

Спецификация:

  • Тип датчика: Фотоакустический NDIR-датчик
  • Технология датчика: Sensirion PASens и CMOSens.
  • Диапазон напряжения питания (Vcc): 2,4 – 5,5 В (номинально 3,3 или 5,0 В).
    • Пороговое напряжение включения Vcc >= 2,25 В.
    • Допустимые пульсации (VRPP): 30 мВ.
    • Уровень 1 на входе (VIH): >= 0,65 Vcc (но не выше Vcc).
    • Уровень 0 на входе (VIL): <= 0,3 Vcc.
    • Уровень 0 на выходе (VOL): < 0,66 В (при токе 3 мА).
  • Потребляемый ток:
    • Пиковый (Ipeak) < 137 мА (при Vcc=5,0В).
    • Периодические измерения: < 13 мА (при Vcc=5,0В).
    • Периодические измерения малой мощности: < 3,0 мА (при Vcc=5,0В).
    • Однократные измерения: < 0,4 мА (при Vcc=5,0В).
  • Диапазон измерения CO2: 0 – 40’000 ppm.
    • Точность SCD40: ±5% (при CO2=400...2’000 ppm).
    • Точность SCD41: ±5% (при CO2=400...5’000 ppm).
  • Диапазон измерения влажности: 0-100% RH.
    • Точность: ±6% RH (при t=15...35°C, RH=20...65%).
    • Точность: ±9% RH (при t=-10...+60°C, RH=0...100%).
  • Диапазон измерения температуры: -10+60 °C.
    • Точность: ±0,8 °C (при t=15...35°C).
    • Точность: ±1,5 °C (при t=-10...+60°C).
  • Цифровой интерфейс: I2C.
    • Частота тактирования: 0-100 кГц.
    • Адрес на шине: 0x62.
  • Время включения (до перехода в состояние ожидания):
    • После аппаратного сброса: 1000 мс.
    • После повторной инициализации: 1000 мс.
  • Рабочая температура: 0 ... +50 °C
  • Габариты: 30x30 мм

Все модули линейки "Trema" выполнены в одном формате

Подключение:

Trema-модуль датчик углекислого газа SCD40 подключается к аппаратной или программной шине I2C Arduino.

В комплекте имеется кабель для быстрого и удобного подключения модуля к колодке I2C на Trema Shield. Если на шине I2C уже имеется другое устройство, то для подключения модуля, предлагаем воспользоваться I2C Hub.

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1: Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.

Способ - 2: Используя Trema Set Shield

Модуль можно подключить к любому из I2C входов Trema Set Shield.

Способ - 3: Используя проводной шлейф и Shield

Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Способ - 4: Подключение к программной шине I2C

При использовании программной шины I2C, модуль можно подключить к любым выводам Arduino, но потребуется дополнительно установить библиотеку iarduino_I2C_Software.h, для создания программной шины I2C, указав номера выбранных вами выводов. О том как это сделать читайте ниже в разделе «Подключение библиотеки», а так же на странице Wiki - Расширенные возможности библиотек iarduino для шины I2C.

Питание:

Входное напряжение питания 3,3 В, или 5 В постоянного тока, подаётся на выводы Vcc и GND модуля.

Подробнее о модуле:

Trema-модуль датчик углекислого газа SCD40 основан на базе NDIR (NonDispersive InfraRed) недисперсионного инфракрасного датчика. Воздух попадает через мембрану датчика в его рабочую камеру, где облучается периодическими импульсами инфракрасного цвета, определённой интенсивности и длины водны, что приводит к возникновению фотоакустического эффекта - появление очень слабого звука (изменений давления) интенсивность которого зависит от CO2 в рабочей камере датчика и регистрируется его акустическим детектором.

Во время работы модуля, датчик газа SCD40 незначительно нагревается (примерно на 4°С) и эта температура влияет на его показания. Для компенсации самонагрева внутри корпуса интегрирован датчик влажности и температуры SHT4x (на фото в правом нижнем углу) который измеряет температуру внутри камеры. Модулю можно отправить самостоятельно измеренное смещение температуры (по умолчанию 4°С), ту самую величину самонагрева, после чего получать скомпенсированные значения, которое будет соответствовать температуре и влажности окружающей среды. Стоит учесть, что отправляемые пользователем значения смещения температуры будут влиять только на читаемые показания температуры и влажности, но не будут влиять на показания концентрации CO2.

На интенсивность фотоакустического эффекта, а следовательно и на показания концентрации CO2, влияет величина атмосферного давления, по этому, модулю, при инициализации, рекомендуется отправить информацию о его высоте над уровнем моря (по умолчанию 0 м), по которой датчик примерно рассчитает значение атмосферного давления. Для модулей испытывающих значительные изменения атмосферного давления в процессе работы, например, постоянное изменение высоты, или работа в герметичных помещениях, рекомендуется периодически отправлять измеренные значения атмосферного давления, а не высоту модуля над уровнем моря.

В процессе тестирования модулей сотрудниками компании iarduino, несколько модулей были помещены в герметичные стеклянные камеры с известной концентрацией CO2 на несколько дней. По результатам тестов, показания концентрации CO2 в ночное время были на 100-150 ppm ниже чем показания в дневное время. Как оказалось, датчики компенсировали перепады температуры в ночные и дневные часы, но эта температура влияла и на давление газов внутри герметичных камер, что привело к искажению данных о концентрации CO2, так как показания давления в камерах не отправлялись модулям.

Показания концентрации CO2 можно улучшить выполнив принудительную перекалибровку FRC (Forced ReCalibration) или разрешив модулю выполнять автоматическую самокалибровку ASC (Automatic Self Calibration). Для принудительной перекалибровки модулю отправляется эталонное (известное) значение текущей концентрации углекислого газа в воздухе, что позволяет точно настроить модуль. Если нет возможности узнать и отправить модулю текущую концентрацию углекислого газа в воздухе, то можно включить автоматическую самокалибровку, алгоритмы которой не требует дополнительных действий со стороны пользователя, но для корректной работы самокалибровки нужно чтоб концентрация CO2 падала до 400 ppm не реже 1 раза в неделю. По умолчанию автоматическая самокалибровка модуля включена.

Датчик оснащен энергонезависимой областью памяти EEPROM в которую можно сохранить его текущие настройки, а именно: смещение температуры, высота модуля над уровнем моря и состояние автоматической самокалибровки (включена/выключена). При каждой подаче питания, или переинициализации, настройки конфигурации будут загружаться из EEPROM, а значит модулю не прийдётся постоянно отправлять одни и те же данные. Так же у модуля имеется возможность сбросить текущую конфигурацию и данные записанные в EEPROM к заводским настройкам. Стоит учесть, что EEPROM датчика рассчитана на 2000 циклов записи до отказа.

Модуль определяет концентрацию CO2, скомпенсированную температуру и относительную влажность, только в процессе измерений. Для датчика SCD40 можно запустить режим периодических измерений, при котором данные обновляются каждые 5 секунд, или режим периодических измерений с низким энергопотреблением, при котором данные обновляются каждые 30 секунд, но значительно снижается потребление питания и самонагрев. Пока запущен любой из режимов периодических измерений, модуль позволяет только проверять наличие свежих данных в буфере, читать данные из буфера, записывать атмосферное давление и, разумеется, отключить режим периодических измерений. Для всех остальных команд необходимо сначала отключить режим периодических измерений и только потом выполнить требуемую команду.

Специально для Trema-модуля датчик углекислого газа SCD40 нами разработана библиотека iarduino_CO2_SCD4x, которая позволяет реализовать все функции модуля.

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

В данном разделе раскрыты примеры получения данных от модуля по шине I2C с использованием библиотеки iarduino_CO2_SCD4x. Сама библиотека содержит больше примеров, доступных из меню Arduino IDE: Файл / Примеры / iarduino_CO2_SCD4x.

Постоянное чтение данных модуля:

В данном примере используются две библиотеки: Wire.h и iarduino_CO2_SCD4x.h. Первая библиотека позволяет работать с аппаратной шиной I2C на которой находится модуль, а вторая позволяет работать с самим модулем.

#include <Wire.h>                               // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_CO2_SCD4x.
#include <iarduino_CO2_SCD4x.h>                 // Подключаем библиотеку iarduino_CO2_SCD4x.
iarduino_CO2_SCD4x sensor;                      // Создаём объект sensor для работы с датчиком CO<sub>2</sub>.
                                                //
void setup(){                                   //
     Serial.begin( 9600 );                      // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
//   Инициируем работу с модулем:               //
     sensor.begin( &Wire );                     // В качестве параметра указываем ссылку на объект для работы с шиной I2C на которой находится датчик.
//   Останавливаемся если модуль не обнаружен:  //
     if( !sensor.getType() ){ while(1); }       // Если модуль не идентифицирован, то входим в бесконечный цикл.
//   Получаем название и серийный номер:        //
     //  int   type = sensor.getType();         // type: 0-нет, SENSOR_SCD40, SENSOR_SCD41, SENSOR_SCD42.
     //  String  sn = sensor.getSN();           // Получаем строку из 12 символов серийного номера + символ конца строки.
//   Получаем настройки модуля:                 //
     //  bool calib = sensor.getCalibAuto();    // Получаем состояние автокалибровки (вкл/выкл).
     //  bool  calc = sensor.getCalcPeriodic(); // Получаем состояние периодических измерений (вкл/выкл).
     //  float temp = sensor.getTemOffset();    // Получаем смещение температуры в °С.
     //  int  altit = sensor.getAltitude();     // Получаем высоту датчика над уровнем моря в м.
//   Настраиваем модуль:                        //
     //  sensor.setCalibAuto  ( false );        // Управляем автокалибровкой (true-вкл, false-выкл)
     //  sensor.setTemOffset  ( 4.0 );          // Указываем смещение температуры в °С.
     //  sensor.setAltitude   ( 140 );          // Указываем высоту датчика над уровнем моря в м.
     //  sensor.setPressure   ( 101325.0f );    // Указываем атмосферное давление в Па. Если указано давление, то указанная ранее высота игнорируется.
     //  sensor.saveSettings  ();               // Сохранить настройки в EEPROM.
     //  sensor.clearSettings ();               // Сбросить  настройки до заводских значений.
//   Запускаем периодические измерения:         // SCD4X_STOP         - отключить периодические измерения.
     sensor.setCalcPeriodic( SCD4X_START );     // SCD4X_START        - включить, данные обновляются каждые 5 секунд.
}                                               // SCD4X_START_LOWPWR - включить в режиме энергосбережения, данные обновляются каждые 30 секунд.
void loop(){                                    //
     uint16_t co2 = sensor.getCO2();            // Функция getCO2() автоматически запрашивает свежие данные CO2, если они устарели.
     float    rh  = sensor.getHum();            // Функция getHum() автоматически запрашивает свежие данные RH%, если они устарели.
     float    t   = sensor.getTem();            // Функция getTem() автоматически запрашивает свежие данные T°C, если они устарели.
//   Выводим данные:                            //
     Serial.println( (String) "CO2 = " + co2 + "ppm\tRH = " + rh + "%\t" + t + "°C" );
     delay(1000);                               // Задержка, чтоб не захламлять монитор последовательного порта.
}                                               //

В коде setup() имеются несколько функций, большинство из которых закомментировано и приведено только для примера, а основными функциями являются sensor.begin() и sensor.setCalcPeriodic(), первая инициирует работу с модулем указывая объект для работы с шиной I2C на которой находится модуль (&Wire), а вторая запускает периодические измерения (SCD4X_START).

В коде loop() данные читаются функциями getCO2(), getHum() и getTem(), после чего выводятся в монитор последовательного порта Serial.println().

Обратите внимание на то что в режиме периодических измерений (SCD4X_START), данные обновляются каждые 5 секунд, а в режиме периодических измерений с низким энергопотреблением (SCD4X_START_LOWPWR) данные обновляются каждые 30 секунд. Если периодические измерения не запускать или остановить, то данные будут сброшены в 0. После запуска любых периодических измерений можно обращаться только к следующим функциям: setCalcPeriodic(), getCalcPeriodic(), getReadyData(), getCO2(), getHum(), getTem(), getType() и setPressure(). Перед обращением к остальным функциям библиотеки нужно сначала остановить периодические измерения, если этого не сделать, то библиотека будет сама отключать периодические измерения, перед выполнением каждой функции и заново запускать те периодические измерения которые били изначально запущены, после выполнения каждой функции. Это существенно замедлит выполнение программы, т.к. остановка периодических измерений занимает 500 мс.

Подключение двух модулей:

Для некоторых проектов требуется несколько модулей углекислого газа, но у модулей на базе датчиков SCD40 и SCD41 фиксированный адрес 0x62, а значит на одной шине I2C может находиться только 1 модуль. По этому нужно подключить каждый модуль к отдельной шине I2C. Для плат Arduino UNO R3, MINI, NANO, MEGA, MICRO, LEONARDO и т.д., у которых всего одна аппаратная шина I2C можно воспользоваться библиотекой iarduino_I2C_Software.h и создать несколько программных шин I2C на любых выводах поддерживающих цифровой вход и выход, подключив к каждой шине по одному модулю, как в примере ниже.

#include <iarduino_I2C_Software.h>              // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_CO2_SCD4x.
SoftTwoWire sWire[2]={ {3,4}, {5,6} };          // Создаём массив sWire из двух объектов для работы с программными шинами I2C.
                                                // Указав выводы: SDA, SCL первой шины {3,4} и SDA, SCL второй шины {5,6}.
#include <iarduino_CO2_SCD4x.h>                 // Подключаем библиотеку iarduino_CO2_SCD4x.
iarduino_CO2_SCD4x sensor[2];                   // Создаём массив sensor из двух объектов для работы с датчиками CO2.
                                                //
void setup(){                                   //
     Serial.begin(9600);                        // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
//   Выполняем действия для двух модулей:       //
     for(uint8_t i=0; i<2; i++){                //
     // Инициируем работу с модулем i:          //
        sensor[i].begin( &sWire[i] );           // В качестве параметра указываем ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
     // Запускаем периодические измерения:      //
        sensor[i].setCalcPeriodic(SCD4X_START); // SCD4X_STOP - отключить, SCD4X_START - включить, SCD4X_START_LOWPWR - включить в режиме энергосбережения.
     }                                          //
}                                               //
                                                //
void loop(){                                    //
//   Выполняем действия для двух модулей:       //
     for(uint8_t i=0; i<2; i++){                //
        uint16_t co2 = sensor[i].getCO2();      // Функция getCO2() автоматически запрашивает свежие данные CO2, если они устарели.
        float    rh  = sensor[i].getHum();      // Функция getHum() автоматически запрашивает свежие данные RH%, если они устарели.
        float    t   = sensor[i].getTem();      // Функция getTem() автоматически запрашивает свежие данные T°C, если они устарели.
     // Выводим данные:                         //
        Serial.println( (String) "Датчик " + i + "\tCO2 = " + co2 + "ppm\tRH = " + rh + "%\t" + t + "°C" );
     }                                          //
     delay(1000);                               // Задержка, чтоб не захламлять монитор последовательного порта.
}                                               //

В этом примере используются те же функции, что и в предыдущем примере, но вместо библиотеки Wire.h, которая позволяет работать с аппаратными шинами I2C, используется библиотека iarduino_I2C_Software.h, которая позволяет работать с программными шинами I2C. Вместо объектов Wire и sensor в данном примере создаются массивы sWire и sensor, каждый элемент которых является объектом:

  • sWire[0] - объект работы с первой программной шиной I2C на выводах SDA=3, SCL=4.
  • sWire[1] - объект работы с второй программной шиной I2C на выводах SDA=5, SCL=6.
  • sensor[0] - объект работы с датчиком на шине указанной функцией begin();.
  • sensor[1] - объект работы с датчиком на шине указанной функцией begin();.

Пример работы с двумя аппаратными шинами I2C похож на данный пример и доступен из меню Arduino IDE: Файл / Примеры / iarduino_CO2_SCD4x / HardwareWire / twoSensors.

Описание основных функций библиотеки:

В данном разделе описаны функции библиотеки iarduino_CO2_SCD4x для работы с Trema-модулем датчик углекислого газа SCD40.

Библиотека iarduino_CO2_SCD4x может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано ниже в разделе «Подключение библиотеки», а так же на странице Wiki - расширенные возможности библиотек iarduino для шины I2C.

Подключение библиотеки:

  • Если используется аппаратная шина I2C:
#include <Wire.h>                      // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_Position_BMX055.h
                                       //
#include <iarduino_CO2_SCD4x.h>        // Подключаем библиотеку для работы с модулем.
iarduino_CO2_SCD4x sensor;             // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_CO2_SCD4x.
// iarduino_CO2_SCD4x sensor(0x63);    // Можно создать объект указав адрес модуля на шине I2C, если адрес отличается от 0x62.
                                       //
void setup(){                          //
     ...                               //
     sensor.begin(&Wire);              // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
     ...                               // Доступны объекты: &Wire, &Wire1, &Wire2...
}                                      //
  • Если используется программная шина I2C:
#include <iarduino_I2C_Software.h>     // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_CO2_SCD4x.h
SoftTwoWire sWire(3,4);                // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL.
                                       //
#include <iarduino_CO2_SCD4x.h>        // Подключаем библиотеку для работы с модулем.
iarduino_CO2_SCD4x sensor;             // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_CO2_SCD4x.
// iarduino_CO2_SCD4x sensor(0x63);    // Можно создать объект указав адрес модуля на шине I2C, если адрес отличается от 0x62.
                                       //
void setup(){                          //
     ...                               //
     sensor.begin(&sWire);             // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
     ...                               //
}                                      //
  • В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека Wire.h (предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы (3-SDA, 4-SCL).
  • Далее подключается библиотека и создаётся объект для работы с модулем.
  • В коде Setup(), при инициализации работы с модулем указывается ссылка на объект работы с выбранной шиной I2C begin(&ШИНА). Остальные строки кода одинаковы для любой шины I2C.

Функция begin();

  • Назначение: Инициализация работы с модулем.
  • Синтаксис: begin( [&ШИНА] );
  • Параметры:
    • &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
      • Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
      • Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
      • Параметр является не обязательным, по умолчанию используется ссылка &Wire.
  • Возвращаемые значения: bool - результат инициализации модуля (true или false).
  • Примечание:
    • Функцию необходимо вызывать до обращения к остальным функциям и методам объекта.
    • Функцию достаточно вызвать 1 раз в коде setup.
    • По результату инициализации можно определить наличие модуля на шине.
  • Пример:
if( sensor.begin( &Wire ) ){ Serial.print( "Модуль найден и инициирован!" ); }
else                       { Serial.print( "Модуль не найден на шине I2C" ); }

Функция setCalcPeriodic();

  • Назначение: Управление периодическими измерениями.
  • Синтаксис: setCalcPeriodic( ДЕЙСТВИЕ );
  • Параметры:
    • uint8_t ДЕЙСТВИЕ - может принимать одно из следующих значений:
      • SCD4X_STOP - Остановить периодические измерения. Выполняется 500 мс.
      • SCD4X_START - Запустить периодические измерения. В процессе выполнения периодических измерений, данные будут обновляться каждые 5 секунд.
      • SCD4X_START_LOWPWR - Запустить периодические измерения с низким энергопотреблением. Данные будут обновляться каждые 30 секунд.
  • Возвращаемые значения: bool - результат выполнения функции (true или false).
  • Примечание:
    • Данные модуля обновляются только в процессе измерений.
    • После запуска периодических измерений можно обращаться только к функциям: setCalcPeriodic(), getCalcPeriodic(), getReadyData(), getCO2(), getHum(), getTem(), getType() и setPressure(). Перед обращением к остальным функциям, нужно сначала остановить периодические измерения.
    • Если обратиться к функции которую нельзя выполнять во время выполнения периодических измерений, то библиотека сначала отключит периодические измерения, потом выполнит функцию, а затем восстановит выполнение периодических измерений.
  • Пример:
if( sensor.setCalcPeriodic( SCD4X_START ) ){ Serial.print( "Периодические измерения запущены" ); }
else                                       { Serial.print( "Ошибка запуска" ); }

Функция getCalcPeriodic();

  • Назначение: Проверка выполнения периодических измерений.
  • Синтаксис: getCalcPeriodic();
  • Параметры: Нет
  • Возвращаемые значения: bool - флаг выполнения периодических измерений (true или false).
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • Ответ функции хранится в библиотеке, а не запрашивается из модуля.
  • Пример:
if( sensor.getCalcPeriodic() ){ Serial.print( "Периодические измерения выполняются" ); }
else                          { Serial.print( "Периодические измерения остановлены" ); }

Функция setCalcSingle();

  • Назначение: Запуск однократного измерения.
  • Синтаксис: setCalcSingle( ДЕЙСТВИЕ );
  • Параметры:
    • uint8_t ДЕЙСТВИЕ - может принимать одно из следующих значений:
      • SCD4X_ALL - Выполнить все измерения. Данные будут доступны через 5 сек.
      • SCD4X_RHT - Выполнить измерения температуры и влажности. Данные будут доступны через 50 мс.
  • Возвращаемые значения: bool - результат запуска однократного измерения (true или false).
  • Примечание:
    • Функция доступна только для модулей SCD41 и SCD42.
    • Если обратиться к функции во время выполнения периодических измерений, то периодические измерения будут автоматически остановлены.
    • Рекомендуемый интервал обращения к функции - каждые 5 минут. Именно под этот интервал адаптирована автоматическая самокалибровка.
    • Первый результат после подачи питания нужно отбросить, как некорректный.
    • Функцию можно выполнить несколько раз подряд (с учётом ожидания готовности данных 5 сек) для усреднения концентрации CO2, а потом ждать рекомендованный интервал 5 мин.
    • Если до истечения времени готовности данных (5 секунд или 50 мс) после запуска однократного измерения, обратится к любой другой функции, то эти функции сначала дождутся истечение времени готовности данных. Исключением являются функции: setPressure(), getReadyData(), getCalcPeriodic(), getType().
  • Пример:
if( sensor.setCalcSingle( SCD4X_ALL ) ){ Serial.print( "Измерение запущено"  ); }
else                                   { Serial.print( "Измерение отклонено" ); }

Функция getReadyData();

  • Назначение: Проверка наличия доступных данных в буфере датчика.
  • Синтаксис: getReadyData();
  • Параметры: Нет
  • Возвращаемые значения: bool - флаг наличия доступных для чтения данных (true или false).
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений, но именно в этом режиме данная функция бесполезна, так как в режиме периодических измерений функции чтения данных getCO2(), getHum() и getTem() выполняются без ожиданий, автоматически запрашивая свежие данные, если они устарели.
    • Функция может быть полезна в режиме однократного измерения, так как в этом режиме функции чтения данных getCO2(), getHum(), getTem() ожидают готовность данных, что может занять до 5 секунд.
  • Пример:
if( sensor.getReadyData() ){ Serial.print( "Есть данные для чтения" ); }
else                       { Serial.print( "Нет доступных данных"   ); }

Функция getCO2();

  • Назначение: Получить концентрацию CO2 в воздухе.
  • Синтаксис: getCO2();
  • Параметры: Нет
  • Возвращаемые значения: uint16_t - концентрация CO2 в ppm.
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • В режиме периодических измерений функция выполняется без задержек, возвращая последние полученные данные, автоматически запрашивая свежие, если они устарели.
    • В режиме одиночного измерения функция ждёт готовность данных.
  • Пример:
uint16_t i = sensor.getCO2(); // Получаем концентрацию CO2 в воздухе.

Функция getHum();

  • Назначение: Получить относительную влажность воздуха.
  • Синтаксис: getHum();
  • Параметры: Нет
  • Возвращаемые значения: float - относительная влажность воздуха в %.
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • В режиме периодических измерений функция выполняется без задержек, возвращая последние полученные данные, автоматически запрашивая свежие, если они устарели.
    • В режиме одиночного измерения функция ждёт готовность данных.
    • Показания датчика SHT4x измеряющего температуру и влажность зависят от используемого значения смещения температуры в результате самонагрева, см. функцию setTemOffset().
    • Показания влажности зависят от температуры, так как датчик измеряет абсолютную влажность, которую преобразует в относительную через измеренную температуру с учётом смещения.
  • Пример:
float i = sensor.getHum(); // Получаем относительную влажность воздуха.

Функция getTem();

  • Назначение: Получить температуру окружающей среды.
  • Синтаксис: getTem( [ФЛАГ] );
  • Параметры:
    • bool ФЛАГ учёта смещения температуры (по умолчанию true - учитывать).
  • Возвращаемые значения: float - температура окружающей среды в °С.
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • В режиме периодических измерений функция выполняется без задержек, возвращая последние полученные данные, автоматически запрашивая свежие, если они устарели.
    • В режиме одиночного измерения функция ждёт готовность данных.
    • Если вызвать функцию без параметра, то она вернёт температуру полученную от модуля.
    • Модуль измеряет температуру в камере датчика и вычитает из неё смещение температуры (по умолчанию 4°С). Смещение температуры это значение на которое модуль нагревается в процессе работы, его можно указать функцией setTemOffset().
    • Если вызвать функцию с параметром false, то библиотека прибавит к возвращаемой модулем температуре значение смещения температуры используемое модулем. Таким образом функция вернёт реально измеренную температуру внутри камеры датчика, без учёта используемого модулем смещения. Эту температуру удобно использовать в расчётах смещения для отправки модулю функцией setTemOffset().
  • Пример:
float i = sensor.getTem(); // Получаем температуру окружающей среды (скомпенсированную).

Функция getSN();

  • Назначение: Получить серийный номер модуля.
  • Синтаксис: getSN();
  • Параметры: Нет
  • Возвращаемые значения: char* - серийный номер из 12 символов + символ конца строки.
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Функцию можно использовать для идентификации модуля и проверки связи с ним.
    • Если модуль не отвечает, то функция вернёт пустую строку.
  • Пример:
String i = sensor.getSN(); // Получаем серийный номер датчика.

Функция getType();

  • Назначение: Получить тип модуля.
  • Синтаксис: getType();
  • Параметры: Нет
  • Возвращаемые значения:
    • uint8_t - ТИП МОДУЛЯ - может принимать одно из следующих значений:
      • SENSOR_SCD40 - Модуль на базе датчика SCD40.
      • SENSOR_SCD41 - Модуль на базе датчика SCD41.
      • SENSOR_SCD42 - Модуль на базе датчика SCD42.
      • 0 - Тип модуля не определён.
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • Тип модуля определяется при его инициализации функцией begin().
    • Ответ функции хранится в библиотеке, а не запрашивается из модуля.
  • Пример:
if( sensor.getType()==SENSOR_SCD40 ){ Serial.print( "Модуль SCD40" ); }

Описание функции компенсации выходных данных:

Функция setTemOffset();

  • Назначение: Указать смещение температуры.
  • Синтаксис: setTemOffset( СМЕЩЕНИЕ );
  • Параметры:
    • float СМЕЩЕНИЕ температуры в результате самонагрева во время работы в °С.
  • Возвращаемые значения: bool - результат отправки смещения модулю (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Указанное модулю смещение температуры не влияет на показания CO2, но влияет на получаемые показания температуры и влажности.
    • Смещение температуры компенсирует самонагрев датчика и рассчитывается как разница реальной температуры внутри камеры и известной температуры окружающей среды:
      СМЕЩЕНИЕ = getTem( false ) - t°C.
      • getTem( false ) - нескомпенсированная температура измеренная датчиком.
      • t°C - известная температура окружающей среды.
    • После указания смещения температуры, датчик будет возвращать температуру меньше измеренной на указанное значение смещения и именно эта температура будет использоваться датчиком при преобразовании измеренной абсолютной влажности воздуха в относительную влажность возвращаемую функцией getHum().
    • Смещение температуры можно сохранить в EEPROM память модуля функцией saveSettings(), после чего модуль будет самостоятельно её загружать при каждой подаче питания или перезагрузке.
  • Пример:
if( sensor.setTemOffset( 5.3f ) ){ Serial.print( "Указали смещение 5.3 °С"     ); }
else                             { Serial.print( "Не удалось указать смещение" ); }

Функция getTemOffset();

  • Назначение: Получить используемое смещение температуры.
  • Синтаксис: getTemOffset();
  • Параметры: Нет
  • Возвращаемые значения: float - используемое модулем смещение температуры в °С.
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • По умолчанию смещение температуры равно 4°С.
    • Смещение температуры это разница между реально измеренной температурой и температурой которую возвращает модуль.
    • Если смещение температуры равно температуре самонагрева датчика, то температура возвращаемая модулем будет равна температуре окружающей среды.
  • Пример:
float i = sensor.getTemOffset(); // Получаем используемое модулем смещение температуры.

Функция setAltitude();

  • Назначение: Указать высоту модуля над уровнем моря.
  • Синтаксис: setAltitude( ВЫСОТА );
  • Параметры:
    • uint16_t ВЫСОТА модуля над уровнем моря в м.
  • Возвращаемые значения: bool - результат отправки высоты модулю (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Высота модуля над уровнем моря позволяет модулю примерно определить атмосферное
      давление, которое влияет на точность показаний CO2.
    • Данная функция актуальна для модулей которые используется стационарно. Высоту можно указывать однократно после подачи питания или перезагрузки.
    • Высоту модуля над уровнем моря можно сохранить в EEPROM память модуля функцией saveSettings(), после чего модуль будет самостоятельно её загружать при каждой подаче питания или перезагрузке.
    • Для датчиков испытывающих значительные изменения атмосферного давления в процессе работы, например, постоянное изменение высоты, или работа в герметичных помещениях со значительными перепадами температур, рекомендуется периодически отправлять измеренные значения атмосферного давления, а не высоту модуля над уровнем моря.
  • Пример:
if( sensor.setAltitude( 140 ) ){ Serial.print( "Указана высота 140 м над уровнем моря" ); }
else                           { Serial.print( "Не удалось указать высоту модуля"      ); }

Функция getAltitude();

  • Назначение: Получить используемую модулем высоту над уровнем моря.
  • Синтаксис: getAltitude();
  • Параметры: Нет
  • Возвращаемые значения: uint16_t - используемая модуля высота над уровнем моря в м.
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • По умолчанию высота модуля над уровнем моря равна 0 м.
    • Высота используется модулем для примерного определения атмосферного давления, которое влияет на расчёты концентрации CO2.
  • Пример:
uint16_t i = sensor.getAltitude(); // Получаем используемую модулем высоту над уровнем моря.

Функция setPressure();

  • Назначение: Указать текущее атмосферное давление.
  • Синтаксис: setPressure( ДАВЛЕНИЕ );
  • Параметры:
    • float ДАВЛЕНИЕ - атмосферное давление в Па.
  • Возвращаемые значения: bool - результат отправки давления модулю (true или false).
  • Примечание:
    • Функцию можно запускать во время выполнения периодических измерений.
    • Атмосферное давление влияет на точность показаний CO2.
    • Указание атмосферного давления имеет приоритет перед указанием высоты модуля над уровнем моря, значит модуль будет использовать указанное атмосферное давление, вместо расчёта давления из указанной высоты.
    • Настоятельно рекомендуется использовать данную функцию для модулей испытывающих значительные изменения атмосферного давления.
  • Пример:
if( sensor.setPressure( 101325.0f ) ){ Serial.print( "Указано давление 101325 Па"  ); }
else                                 { Serial.print( "Не удалось указать давление" ); }

Описание функций калибровки:

Функция setCalibForced();

  • Назначение: Принудительная перекалибровка (FRC) Forced ReCalibration.
  • Синтаксис: setCalibForced( CO2 [, &КОРРЕКЦИЯ] );
  • Параметры:
    • uint16_t CO2 - известная концентрация CO2 в ppm.
    • int16_t &КОРРЕКЦИЯ - переменная для получения значения коррекции в ppm.
  • Возвращаемые значения: bool - результат выполнения перекалибровки (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Принудительная перекалибровка позволяет точно настроить модуль.
    • Перед запуском функции, модуль должен проработать не менее 3 минут при постоянной и известной концентрации CO2 в любом из режимов измерений.
    • Первым параметром указывается известная (эталонная) концентрация CO2 в ppm.
    • Второй параметр является не обязательным, если указать ссылку на переменную, то в неё будет возвращено значение коррекции концентрации CO2 в ppm со знаком, применённое в процессе принудительной перекалибровки модуля.
    • Функция выполняется не менее 400 мс.
    • Если текущее значение концентрации CO2 в воздухе неизвестно, то вместо выполнения принудительной перекалибровки, можно включить автоматическую самокалибровку, обратившись к функции setCalibAuto().
  • Пример:
if( sensor.setCalibForced( 400 ) ){ Serial.print( "Перекалибровка выполнена" ); }
else                              { Serial.print( "Ошибка перекалибровки"    ); }

Функция setCalibAuto();

  • Назначение: Управление автоматической самокалибровкой (ASC) Automatic Self Calibration.
  • Синтаксис: setCalibAuto( ДЕЙСТВИЕ );
  • Параметры:
    • bool ДЕЙСТВИЕ - принимает одно из двух значений: true - запустить, false - остановить.
  • Возвращаемые значения: bool - результат отправки команды модулю (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Функция позволяет включать и отключать автоматическую самокалибровку ASC (Automatic Self Calibration), алгоритмы которой не требуют действий со стороны пользователя.
    • По умолчанию автоматическая самокалибровка (ASC) включена.
    • Состояние автоматической самокалибровки (включена/отключена) можно сохранить в EEPROM память модуля функцией saveSettings(), после чего модуль будет самостоятельно её загружать при каждой подаче питания или перезагрузке.
    • Для корректной работы автоматической самокалибровки (ASC) нужно чтоб концентрация CO2 падала до 400 ppm не реже 1 раза в неделю.
  • Пример:
if( sensor.setCalibAuto( true  ) ){ Serial.print( "Самокалибровка запущена"  ); }
if( sensor.setCalibAuto( false ) ){ Serial.print( "Самокалибровка отключена" ); }

Функция getCalibAuto();

  • Назначение: Проверка выполнения автоматической самокалибровки (ASC).
  • Синтаксис: getCalibAuto();
  • Параметры: Нет
  • Возвращаемые значения: bool - флаг выполнения самокалибровки (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Функция возвращает true если автоматическая самокалибровка запущена и выполняется.
  • Пример:
if( sensor.getCalibAuto() ){ Serial.print( "Самокалибровка запущена и выполняется" ); }
else                       { Serial.print( "Самокалибровка не запущена"            ); }

Описание дополнительных функций:

Функция reset();

  • Назначение: Перезагрузка модуля.
  • Синтаксис: reset();
  • Параметры: Нет
  • Возвращаемые значения: bool - результат отправки команды модулю (true или false).
  • Примечание:
    • Если обратиться к функции во время выполнения периодических измерений, то периодические измерения будут автоматически остановлены.
    • Функция отправляет команду повторной инициализации датчика с перезагрузкой конфигурации из EEPROM в ОЗУ. Команда выполняется 20 мс.
  • Пример:
if( sensor.reset() ){ Serial.print( "Модуль перезагружен"             ); }
else                { Serial.print( "Не удалось перезагрузить модуль" ); }

Функция selfTest();

  • Назначение: Самотестирование модуля.
  • Синтаксис: selfTest();
  • Параметры: Нет
  • Возвращаемые значения: bool - результат самотестирования (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Функция позволяет проверить работоспособность модуля и корректность его питания.
    • Самотестирование модуля занимает 10 секунд.
  • Пример:
if( sensor.selfTest() ){ Serial.print( "Самотестирование успешно выполнено"     ); }
else                   { Serial.print( "При самотестировании обнаружены ошибки" ); }

Функция sleep();

  • Назначение: Спящий режим.
  • Синтаксис: sleep( ДЕЙСТВИЕ );
  • Параметры:
    • bool ДЕЙСТВИЕ - принимает одно из двух значений: true - уснуть, false - проснуться.
  • Возвращаемые значения: bool - результат отправки команды модулю (true или false).
  • Примечание:
    • Функция доступна только для модулей SCD41 и SCD42.
    • Если обратиться к функции во время выполнения периодических измерений, то периодические измерения будут автоматически остановлены.
    • Спящий режим позволяет значительно сэкономить питание. Его можно использовать между
      однократными измерениями setCalcSingle(), но при этом автоматическая самокалибровка (ASC) выполняться не будет, даже если она запущена.
    • Пробуждение из спящего режима занимает 20 мс, а первый результат вычислений после пробуждения нужно отбросить, как некорректный.
  • Пример:
if( sensor.sleep( true  ) ){ Serial.print( "Модуль перешел в спящий режим"  ); }
if( sensor.sleep( false ) ){ Serial.print( "Модуль вышел из спящего режима" ); }

Функция saveSettings();

  • Назначение: Сохранение настроек в EEPROM.
  • Синтаксис: saveSettings();
  • Параметры: Нет
  • Возвращаемые значения: bool - результат отправки команды модулю (true или false).
  • Примечание:
    • К функции нельзя обращаться во время выполнения периодических измерений.
    • Если обратиться к функции во время выполнения периодических измерений, то библиотека сначала остановит периодические измерения, потом выполнит функцию, а затем восстановит периодические измерения, что увеличит время выполнения на 500 мс.
    • Функция сохраняет текущую конфигурацию модуля в его EEPROM память, эта операция занимает 800 мс.
    • В EEPROM память сохраняются такие параметры как: смещение температуры, высота модуля над уровнем моря и состояние автоматической самокалибровки (ASC).
    • После сохранения настроек, они будут автоматически загружаются из EEPROM при каждой подаче питания или перезагрузке модуля.
    • EEPROM память модуля рассчитана на 2000 циклов записи до отказа. По этому не стоит часто использовать данную функцию.
  • Пример:
if( sensor.saveSettings() ){ Serial.print( "Настройки модуля сохранены в EEPROM"   ); }
else                       { Serial.print( "Не удалось сохранить настройки модуля" ); }

Функция clearSettings();

  • Назначение: Сброс настроек до заводских значений.
  • Синтаксис: clearSettings();
  • Параметры: Нет
  • Возвращаемые значения: bool - результат отправки команды модулю (true или false).
  • Примечание:
    • Если обратиться к функции во время выполнения периодических измерений, то периодические измерения будут автоматически остановлены.
    • Функция сбрасывает текущую конфигурацию в конфигурацию по умолчанию (заводскую) в том числе и настройки сохранённые функцией saveSettings() в EEPROM, а так же стирает историю алгоритмов калибровки FRC и ASC.
    • Сброс настроек занимает 1,2 секунды.
  • Пример:
if( sensor.clearSettings() ){ Serial.print( "Настройки модуля сброшены"     ); }
else                        { Serial.print( "Не удалось сбросить настройки" ); }

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями