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

Датчик углекислого газа CO2, RS485 / Modbus - руководство по использованию

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

Датчик углекислого газа CO2 RS485 / Modbus - является устройством измерения концентрации углекислого газа СО2 в окружающем воздухе, позволяющий получать количественное значение в ppm по протоколу Modbus шины RS485.

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

Датчик можно использовать для контроля климата гидропонной установки. Устройство легко подключается к блоку управления гидропонной установки, сетевым кабелем через разъемы RJ45.

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

В соответствии с протоколом Modbus, к одной шине RS485 можно подключить до 247 датчиков. Адрес устройства (по умолчанию 0x06) назначается программно и хранится в энергонезависимой памяти. Все устройства на шине должны иметь уникальный адрес.

Видео:

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

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

  • Напряжение питания: от 12 до 24 В постоянного тока (разъем RJ45).
  • Ток потребляемый модулем: до 50 мА (пиковый ток до 150 мА).
  • Интерфейс: RS485 / Modbus.
  • Скорость шины: 4800 / 9600 / 19200 / 38400 / 57600 / 115200 бит/с.
  • Настройки шины: 8N1 (8 бит данных, без проверки чётности, 1 стоп-бит).
  • Адрес на шине: устанавливается программно (по умолчанию 0x06).
  • Тип датчика CO2: Фотоакустический NDIR-датчик.
  • Технология датчика CO2: Sensirion PASens и CMOSens.
  • Диапазон измерений концентрации СО2: от 0 до 40'000 ppm.
    • Точность ±5% в диапазоне от 400 до 2’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 в диапазоне от +15 до +35°C.
    • Точность: ±1,5 °C в диапазоне от -10 до +60°C.
  • Рабочая температура: от -25 до +80 °С.
  • Габариты: 65 x 45 x 29 мм.
  • Вес: ? г.

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

Важно: Перед подключением устройства к шине RS485 нужно отключить питание.

Так называемое «горячее подключение» может повредить устройство!

Для подключения датчика углекислого газа к шине RS485 используется разъем RJ45.

Назначение выводов разъема RJ45:

  • 1: «A» - Линия данных (неинвертирующая).
  • 2: «B» - Линия данных (инвертирующая).
  • 3: «NC» - Не используется.
  • 4: «PWR» - Вывод питания от +12 до +24В.
  • 5: «PWR» - Вывод питания от +12 до +24В.
  • 6: «NC» - Не используется.
  • 7: «GND» - Общий вывод питания.
  • 8: «GND» - Общий вывод питания.
  • HL-1: «BLINK» - Индикатор включения (мигает если подано питание).
  • HL-2: «DATA» - Индикатор получения запроса и обнаружения устройства.

Назначение индикаторов разъёма RJ45:

  • HL-1 «BLINK» Индикатор включения:
    • Индикатор коротко мигает раз в две секунды -
      значит устройство работает, но не получило ни 1 запроса с подачи питания.
    • Индикатор медленно мигает раз в секунду -
      значит устройство работает, но последний запрос принят более 10 сек. назад.
    • Индикатор часто мигает пять раз в секунду -
      значит устройство работает и последний запрос принят менее 10 сек. назад.
  • HL-2 «DATA» Индикатор получения запроса и обнаружения устройства:
    • Индикатор включается при получении запросов, что позволяет визуально отследить их поступление.
    • Устройству можно отправить команду на постоянное свечение индикатора, что позволит визуально найти устройство с известным адресом среди одинаковых устройств на шине.

Питание:

Входное напряжение питания модуля от 12 до 24В постоянного тока подаётся через разъем PJ45. Модуль сохраняет работоспособность при снижении питания до 5В. Не подавайте питание выше 24В.

Калибровка кнопкой:

Кнопка калибровки «CALIBRATE», а так же светодиоды индикации калибровки «AUTO» и «400» находятся на плате блока. Для доступа к кнопке необходимо снять крышку.

Калибровка позволяет улучшить точность показаний концентрации углекислого газа.

Ниже по тексту будет фигурировать значение концентрации CO2 равное 400 ppm, это средняя концентрация углекислого газа на свежем воздухе.

Автоматическая самокалибровка:

Данный тип калибровки является наиболее простым, так как его алгоритмы не требуют дополнительных действий со стороны пользователя. Не нужно замерять концентрацию углекислого газа сторонними устройствами и отправлять их датчику. Достаточно просто включить автоматическую самокалибровку ASC (Automatic Self Calibration) и датчик будет постоянно корректировать свои показания. По умолчанию автоматическая самокалибровка включена.

Алгоритмы самокалибровки рассчитаны на длительную работу датчика, коррекция показаний занимает несколько дней и предполагает, что концентрация CO2 в воздухе должна снижаться до 400 ppm не реже 1 раза в неделю.

О состоянии автоматической самокалибровки информирует светодиод «AUTO», он светится если автокалибровка включена.

Управлять автоматической самокалибровкой (включать и выключать) можно однократным нажатием на кнопку «CALIBRATE». Стоит учесть, что включение самокалибровки занимает около половины секунды, если запущены периодические измерения. По этому светодиод включается не сразу, а с небольшой задержкой.

Кроме кнопки «CALIBRATE», управлять автоматической самокалибровкой можно при помощи функции setAutoCalib() библиотеки iarduino_MB_CO2.

Принудительная перекалибровка:

Принудительная перекалибровка FRC (Forced ReCalibration) предполагает отправку датчику известного значения концентрации CO2 в воздухе.

Если запускать принудительную перекалибровку функцией setReCalib() библиотеки iarduino_MB_CO2, то в качестве аргумента этой функции нужно указывать то значение, которое было измерено сторонним устройством, от 0 до 2'000 ppm.

Если запускать принудительную перекалибровку кнопкой «CALIBRATE», то концентрация CO2 в воздухе должна равняться 400 ppm.

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

Для запуска принудительной перекалибровки кнопкой «CALIBRATE» нужно её удерживать в течении 5 секунд, пока не включится светодиод «400» который информирует о выполнении принудительной перекалибровки.

После завершения принудительной перекалибровки светодиод «400» отключится на пол секунды, после чего проинформирует о результате перекалибровки:

  • При успехе светодиод один раз включится на две секунды.
  • При провале светодиод коротко мигнёт три раза подряд.

Подробнее о датчике:

Датчик углекислого газа CO2 RS485 / Modbus построен на базе микроконтроллера STM32G030F4 и конвертера SN65HVD3082EDR с цепями защиты шины RS485 и встроенным терминатором, который можно отключать переключателем на плате. В устройстве присутствуют: импульсный DC-DC преобразователь и сборка SCD40 с датчиком углекислого газа. На корпусе блока есть фиксатор позволяющий устанавливать его на DIN-рейку. Датчик углекислого газа в сборке SCD40 основан на базе NDIR (NonDispersive InfraRed) недисперсионного инфракрасного датчика. Воздух попадает через мембрану на корпусе сборки в его рабочую камеру, где облучается периодическими импульсами инфракрасного цвета, определённой интенсивности и длины водны, что приводит к возникновению фотоакустического эффекта - появление очень слабого звука (изменений давления) интенсивность которого зависит от концентрации CО2 в рабочей камере датчика и регистрируется его акустическим детектором.

На интенсивность фотоакустического эффекта, а следовательно и на показания концентрации CO2, влияет величина атмосферного давления, которую можно измерять отдельно и передавать блоку по протоколу Modbus шины RS485. А можно просто указать высоту блока над уровнем моря (по умолчанию 140 м), по которой блок сам рассчитает среднее значение атмосферного давления.

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

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

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

Датчик позволяет:

  • Менять свой адрес на шине.
  • Менять тип протокола Modbus (RTU/ASCII).
  • Менять скорость передачи данных.
  • Сохранять одно двухбайтное слово в энергонезависимую память и читать его.
  • Читать напряжение питания поступившее с разъема RJ45.
  • Управлять светодиодом обнаружения устройства на разъеме RJ45.
  • Читать показания:
    • Концентрация CO2, в частях на миллион (ppm).
    • Скомпенсированная температура, в °С.
    • Относительная (%) и абсолютная (г/м3) влажность воздуха.
  • Задавать и узнавать период обновления показаний чипа SCD40.
  • Выполнять перекалибровку.
  • Управлять автокалибровкой.
  • Управлять периодическими измерениями.
  • Указывать смещение температуры в °С.
  • Указывать высоту датчика над уровнем моря в м.
  • Указывать атмосферное давление в гПа.
  • Выполнять самотестирование датчика.

Для работы с датчиком углекислого газа CO2 RS485 / Modbus предлагаем воспользоваться разработанными нами библиотеками iarduino_Modbus и iarduino_MB_CO2. Первая позволяет работать по протоколу Modbus на шине RS485, а вторая предназначена для работы с датчиком углекислого газа.

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

    Примеры:

      Предложенные библиотеки содержат больше примеров, доступных из меню Arduino IDE:
    • Файл / Примеры / iarduino Modbus (протокол) / ModbusClient / HardwareSerial.
    • Файл / Примеры / iarduino Modbus (протокол) / ModbusClient / SoftwareSerial.
    • Файл / Примеры / iarduino Modbus CO2 (датчик CO2) / HardwareSerial.
    • Файл / Примеры / iarduino Modbus CO2 (датчик CO2) / SoftwareSerial.

    Так как у большинства плат Arduino и ESP нет шины RS485, то библиотека iarduino_Modbus использует аппаратную или программную шину UART, сигналы которой преобразуются в сигналы шины RS485 при помощи конвертирующего модуля UART-RS485, например, на базе микросхемы MAX485. Конвертер подключается к выводам TX и RX шины UART, а так же назначается вывод разрешающий работу передатчика DE.

    Для более удобного подключения, можно воспользоваться Trema конвертером UART-RS485, как показано на картинке ниже. У этого конвертера имеется порт RJ-45, который позволяет подключать датчик при помощи стандартного 8-жильного кабеля витой пары патч-корд.

    Обратите внимание на то, что вывод TX конвертера подключается к выводу RX Arduino, вывод RX конвертера к выводу TX Arduino, вывод разрешения работы передатчика D (DE) подключается к любому выводу Arduino (назначается в скетче).

    В примерах ниже, для создания шины RS485, будет использована аппаратная шина UART1 (класс Serial1). Если у вашей платы Arduino нет свободных аппаратных шин UART, используйте программную шину UART при помощи входящей в состав Arduino IDE библиотеки SoftwareSerial.

    Смена адреса блока на шине:

    Пример меняет текущий адрес блока (nowAddress) на новый (newAddress) и сохраняет его в энергонезависимую память блока, значит адрес сохранится и после отключения питания.

    uint8_t nowAddress = 6;                     // Текущий адрес датчика углекислого газа ( 1 - 247 ).
    uint8_t newAddress = 10;                    // Новый адрес датчика углекислого газа ( 1 - 247 ).
    uint8_t pinDE      = 2;                     // Вывод DE конвертера UART-RS485.
                                                //
    #include <iarduino_Modbus.h>                // Подключаем библиотеку для работы по протоколу Modbus.
    #include <iarduino_MB_CO2.h>                // Подключаем библиотеку для работы с датчиком углекислого газа.
                                                //
    ModbusClient modbus(Serial1, pinDE);        // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE.
    iarduino_MB_CO2 sensor(modbus);             // Создаём объект для работы с датчиком углекислого газа указав объект протокола Modbus.
                                                //
    void setup(){                               //
         int f;                                 //
         Serial.begin(9600); while(!Serial);    // Инициируем передачу данных в монитор последовательного порта, указав его скорость.
         Serial1.begin(9600); while(!Serial1);  // Инициируем работу с шиной UART подключённой к конвертеру UART-RS485.
         modbus.begin();                        // Инициируем работу по протоколу Modbus.
    //   modbus.setTimeout(10);                 // Указываем максимальное время ожидания ответа по протоколу Modbus.
    //   modbus.setDelay(4);                    // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus.
    //   modbus.setTypeMB( MODBUS_RTU );        // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII.
         Serial.print("Инициализация ");        //
         f =    sensor.begin(nowAddress);       // Инициируем работу с датчиком углекислого газа, указав его текущий адрес nowAddress.
         if(f){ Serial.println("OK");  }        // Если f=true значит инициализация пройдена успешно.
         else { Serial.println("ERR"); }        // Если f=false значит инициализация не пройдена.
         Serial.print("Смена адреса ");         //
         f =    sensor.changeID(newAddress);    // Меняем адрес датчика углекислого газа на новый newAddress.
         if(f){ Serial.println("OK");  }        // Если f=true значит адрес изменён.
         else { Serial.println("ERR"); }        // Если f=false значит адрес не изменён.
         Serial.print("Текущий адрес ");        //
         Serial.println(sensor.getID());        // Выводим текущий адрес датчика углекислого газа.
         Serial.print("Версия прошивки ");      //
         Serial.println(sensor.getVersion());   // Выводим версию прошивки датчика углекислого газа.
    }                                           //
                                                //
    void loop(){                                // Визуально показываем у какого устройства был изменён адрес.
         sensor.setIDLED(true ); delay(1000);   // Включаем светодиодом обнаружения устройства (на разъёме RJ45).
         sensor.setIDLED(false); delay(1000);   // Выключаем светодиодом обнаружения устройства (на разъёме RJ45).
    }                                           //
    

    Пример будет более коротким, если убрать вывод данных в монитор последовательного порта и обращаться к функциям sensor.begin(), sensor.changeID() без проверки f. Если при обращении к функции sensor.begin() не указывать текущий адрес блока nowAddress, то он будет найден автоматически, но это займёт некоторое время.

    Чтение концентрации углекислого газа:

    Пример выводит показания с проверкой корректности чтения.

    uint8_t pinDE = 2;                          // Вывод DE конвертера UART-RS485.
                                                //
    #include <iarduino_Modbus.h>                // Подключаем библиотеку для работы по протоколу Modbus.
    #include <iarduino_MB_CO2.h>                // Подключаем библиотеку для работы с датчиком углекислого газа.
                                                //
    ModbusClient modbus(Serial1, pinDE);        // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE.
    iarduino_MB_CO2 sensor(modbus);             // Создаём объект для работы с датчиком углекислого газа указав объект протокола Modbus.
                                                //
    void setup(){                               //
         Serial.begin(9600); while(!Serial);    // Инициируем передачу данных в монитор последовательного порта, указав его скорость.
         Serial1.begin(9600); while(!Serial1);  // Инициируем работу с шиной UART подключённой к конвертеру UART-RS485.
         modbus.begin();                        // Инициируем работу по протоколу Modbus.
    //   modbus.setTimeout(10);                 // Указываем максимальное время ожидания ответа по протоколу Modbus.
    //   modbus.setDelay(4);                    // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus.
    //   modbus.setTypeMB( MODBUS_RTU );        // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII.
         int f = sensor.begin(6);               // Инициируем работу с датчиком углекислого газа, указав его адрес. Если адрес не указан sensor.begin(), то он будет найден, но это займёт некоторое время.
         if( !f ){                              // Если функция begin() вернула false, значит датчик с адресом 6 не найден.
             Serial.print("Блок не найден");    //
             while(1);                          // Запрещаем дальнейшее выполнение скетча.
         }                                      //
    //   sensor.reset();                        // Перезагрузить модуль, сбросив регистры настроек.
    //   sensor.setPeriod( 5.0f );              // Указываем обновлять данные датчика 5 секунд. Рекомендуется 5сек для SCD40_NORMAL, или 30 сек для SCD40_LOWPWR.
    //   sensor.setAutoCalib(true);             // Указываем включить автокалибровку (true-включить/false-отключить).
    //   sensor.setAutoCalc(SCD40_NORMAL);      // Указываем включить периодические измерения в нормальном режиме (SCD40_STOP/SCD40_NORMAL/SCD40_LOWPWR).
    //   sensor.setAltitude(140);               // Указываем модулю его высоту над уровнем моря в метрах. Высота влияет на показания CO2 если не указано атмосферное давление.
    //   sensor.setPressure(1003);              // Указываем атмосферное давление в гПа. Влияет на показания CO2. Имеет приоритет над указанием высоты.
    //   sensor.setOffsetTEM(4.0f);             // Указываем занижать измеренную температуру на указанное количество градусов. Не влияет на показания CO2.
    //   sensor.setReCalib(400);                // Указываем выполнить принудительную перекалибровку по известной концентрации углекислого газа.
    //   sensor.setSelfTest();                  // Указываем выполнить самотестирование. Результат самотестирования читается функцией getSelfTest().
    }                                           // У каждой функции set...() есть функция get...() для получения настроек или результата действий.
                                                //
    void loop(){                                //
         float i=sensor.getCO2();               // Читаем концентрацию СО2.
                       Serial.print("CO2=" );   //
         if( i< 0 )  { Serial.print("ERROR"); } // Сообщаем об ошибке чтения.
         else        { Serial.print( i , 0 ); } // Выводим данные целочисленно.
                       Serial.println("ppm");   // Выводим единицы измерения.
    //   Задержка (не обязательно):             //
         delay(1000);                           //
    }                                           //
    

    Этот пример кажется большим, но если убрать все проверки и некоторые комментарии, то код будет более компактным.

    Пример без проверок:

    uint8_t pinDE = 2;                          // Вывод DE конвертера UART-RS485.
                                                //
    #include <iarduino_Modbus.h>                // Подключаем библиотеку для работы по протоколу Modbus.
    #include <iarduino_MB_CO2.h>                // Подключаем библиотеку для работы с датчиком углекислого газа.
                                                //
    ModbusClient modbus(Serial1, pinDE);        // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE.
    iarduino_MB_CO2 sensor(modbus);             // Создаём объект для работы с датчиком углекислого газа указав объект протокола Modbus.
                                                //
    void setup(){                               //
         Serial.begin(9600); while(!Serial);    // Инициируем передачу данных в монитор последовательного порта, указав его скорость.
         Serial1.begin(9600); while(!Serial1);  // Инициируем работу с шиной UART подключённой к конвертеру UART-RS485.
         modbus.begin();                        // Инициируем работу по протоколу Modbus.
         sensor.begin(6);                       // Инициируем работу с датчиком углекислого газа, указав его адрес.
    }                                           //
                                                //
    void loop(){                                //
         float i=sensor.getCO2();               // Читаем концентрацию СО2.
         Serial.println((String)"CO2="+i+"ppm");// Выводим концентрацию СО2.
         delay(1000);                           //
    }                                           //
    

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

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

    В данном разделе описаны функции библиотеки iarduino_MB_CO2 для работы с датчиком углекислого газа RS485 / Modbus. Эта библиотека работает совместно с библиотекой iarduino_Modbus, описание функций которой доступно по ссылке Wiki - Работа с протоколом Modbus RTU/ASCI по шине RS485.

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

    В примерах вход DE конвертера UART-RS485 подключён к выводу D2 Arduino. Вместо вывода D2 можно использовать любой выход Arduino, номер выхода указывается при создании объекта для работы по протоколу Modbus.

    • Если используется аппаратная шина UART:
    #include <iarduino_Modbus.h>          // Подключаем библиотеку для работы по протоколу Modbus.
    #include <iarduino_MB_CO2.h>          // Подключаем библиотеку для работы с датчиком углекислого газа.
                                          //
    ModbusClient modbus(Serial, 2);       // Создаём объект для работы по протоколу Modbus указав класс Serial и номер вывода DE конвертера UART-RS485.
    iarduino_MB_CO2 sensor(modbus);       // Создаём объект для работы с датчиком углекислого газа, указав объект протокола Modbus.
                                          //
    void setup(){                         //
         ...                              //
         Serial.begin(9600);              // Указываем скорость шины RS485. Она равна скорости шины UART подключённой к конвертеру UART-RS485.
         while(!Serial);                  //
         sensor.begin(6);                 // Инициируем работу с датчиком углекислого газа, указав его адрес.
         ...                              // Если адрес блока не указан sensor.begin(), то он будет найден автоматически.
    }                                     //
    

    Если используется аппаратная шина UART-1, то вместо класса Serial указываем Serial1, для шины UART2 указываем Serial2 и т.д.

    • Если используется программная реализация шины UART:
    #include <SoftwareSerial.h>           // Подключаем библиотеку для работы с программной шиной UART.
    #include <iarduino_Modbus.h>          // Подключаем библиотеку для работы по протоколу Modbus.
    #include <iarduino_MB_CO2.h>          // Подключаем библиотеку для работы с датчиком углекислого газа.
                                          //
    SoftwareSerial rs485(8, 9);           // Создаём объект для работы с программной шиной UART указывая выводы RX, TX.
    ModbusClient modbus(rs485, 2);        // Создаём объект для работы по протоколу Modbus указав объект программной шины UART и номер вывода DE конвертера UART-RS485.
    iarduino_MB_CO2 sensor(modbus);       // Создаём объект для работы с датчиком углекислого газа, указав объект протокола Modbus.
                                          //
    void setup(){                         //
         ...                              //
         rs485.begin(9600);               // Указываем скорость шины RS485. Она равна скорости программной шины UART подключённой к конвертеру UART-RS485.
         while(!rs485);                   //
         sensor.begin(6);                 // Инициируем работу с датчиком углекислого газа, указав его адрес.
         ...                              // Если адрес блока не указан sensor.begin(), то он будет найден автоматически.
    }                                     //
    

    Для программной реализации шины UART необходимо указать выводы которые будут использоваться как RX и TX, в примере указаны выводы 8, и 9 соответственно. При создании объекта modbus указывается не класс Serial, а объект для работы с программной шиной UART.

    Скорость передачи данных по шине Modbus равна скорости шины UART.

    Функция begin();

    • Назначение: Инициализация работы с датчиком углекислого газа.
    • Синтаксис: begin( [ АДРЕС_МОДУЛЯ ] );
    • Параметр: АДРЕС_МОДУЛЯ uint8_t - значение от 1 до 247.
    • Возвращаемое значение: bool - результат инициализации (true или false).
    • Примечание:
      • Если вызвать функцию без параметра, то адрес датчика углекислого газа будет найден автоматически. На это уйдёт некоторое время и на шине долен быть только один датчик углекислого газа.
      • Функцию достаточно вызвать 1 раз в коде Setup(), до обращения к остальным функциям библиотеки.
      • Датчики углекислого газа поставляются с адресом 6 на шине, но этот адрес можно менять.
    • Пример:
    sensor.begin(6); // Инициируем работу с датчиком углекислого газа, указав его адрес на шине.
    

    Функция reset();

    • Назначение: Программная перезагрузка датчика углекислого газа.
    • Синтаксис: reset();
    • Параметры: Нет.
    • Возвращаемое значение: bool - результат перезагрузки (true или false).
    • Примечание:
      • Выполняется сброс счётчиков журнала событий modbus и временных переменных.
      • Выполняется сброс ошибок регистра диагностики возвращаемых функцией checkSensor().
      • Выполняется перезагрузка настроек датчика.
      • Датчик перезапустит режим периодических измерений и первые данные будут готовы спустя 5 секунд. До этого датчик будет возвращать 0 ppm, 0 °С и 0% влажности.
    • Пример:
    sensor.reset(); // Выполняем программную перезагрузку.
    

    Функция changeID();

    • Назначение: Установка нового адреса на шине.
    • Синтаксис: changeID( АДРЕС_МОДУЛЯ );
    • Параметр: АДРЕС_МОДУЛЯ uint8_t - значение от 1 до 247.
    • Возвращаемое значение: bool - результат изменения адреса (true или false).
    • Примечание:
      • Новый адрес сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
      • Выполнение функции занимает более 120 миллисекунд.
    • Пример:
    sensor.changeID(10); // Изменить адрес модуля на значение 10.
    

    Функция setSpeedMB();

    • Назначение: Установка новой скорости передачи данных.
    • Синтаксис: setSpeedMB( СКОРОСТЬ );
    • Параметр: СКОРОСТЬ uint32_t - может принимать одно из значений:
      4800 / 9600 / 19200 / 38400 / 57600 / 115200.
    • Возвращаемое значение: bool - результат изменения скорости (true или false).
    • Примечание:
      • Новая скорость применяется на 2 секунды, в течении которых её нужно подтвердить.
      • Если скорость не подтвердить в течении 2 секунд, модуль вернёт прежнюю скорость.
      • Скорость подтверждается функцией ackSpeedMB() на новой скорости шины.

    Функция ackSpeedMB();

    • Назначение: Подтверждение смены скорости передачи данных.
    • Синтаксис: ackSpeedMB();
    • Параметры: Нет.
    • Возвращаемое значение: bool - результат подтверждения скорости (true или false).
    • Примечание:
      • Подтверждение скорости выполняется после установки новой скорости модуля функцией setSpeedMB() и установки той же скорости для шины UART-RS485.
      • Если скорость не подтвердить в течении 2 секунд, модуль вернёт прежнюю скорость.
      • Подтверждённая скорость сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
      • Выполнение функции занимает более 50 миллисекунд.
    • Пример:
    sensor.setSpeedMB(9600); // Изменить скорость модуля на 9600 бит/сек.
    Serial.begin(9600);      // Изменить скорость шины UART-RS485 на 9600 бит/сек.
    sensor.ackSpeedMB();     // Подтвердить скорость модуля.
    

    Функция setTypeMB();

    • Назначение: Установка нового типа протокола Modbus.
    • Синтаксис: setTypeMB( ТИП );
    • Параметр: ТИП uint8_t - может принимать значение MODBUS_RTU или MODBUS_ASCII.
    • Возвращаемое значение: bool - результат изменения типа протокола (true или false).
    • Примечание:
      • Новый тип протокола применяется на 2 секунды, в течении которых его нужно подтвердить.
      • Если тип протокола не подтвердить в течении 2 секунд, модуль вернёт прежний тип.
      • Тип протокола подтверждается функцией ackTypeMB() по новому типу протокола на шине.

    Функция ackTypeMB();

    • Назначение: Подтверждение смены типа протокола Modbus.
    • Синтаксис: ackTypeMB();
    • Параметры: Нет.
    • Возвращаемое значение: bool - результат подтверждения типа протокола (true или false).
    • Примечание:
      • Подтверждение типа протокола Modbus выполняется после установки нового типа протокола модуля функцией setTypeMB() и установки того-же типа протокола для передачи данных по шине UART-RS485.
      • Если тип протокола не подтвердить в течении 2 секунд, модуль вернёт прежний тип.
      • Подтверждённый тип протокола Modbus сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
      • Выполнение функции занимает более 50 миллисекунд.
    • Пример:
    sensor.setTypeMB(MODBUS_RTU); // Изменить тип протокола модуля на Modbus RTU.
    modbus.setTypeMB(MODBUS_RTU); // Изменить тип протокола шины UART-RS485 на Modbus RTU.
    sensor.ackTypeMB();           // Подтвердить тип протокола модуля.
    

    Функция writeFlash();

    • Назначение: Запись пользовательского значения в Flash память.
    • Синтаксис: writeFlash( ЧИСЛО );
    • Параметр: ЧИСЛО uint16_t - любое значение от 0 до 65535.
    • Возвращаемое значение: bool - результат записи (true или false).
    • Примечание:
      • Записываемое число сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
      • Выполнение функции занимает более 50 миллисекунд.
      • Для чтения числа из Flash памяти воспользуйтесь функцией readFlash().
      • Число хранится в регистре "Holding Registers" [0x0120] «USER_DATA».
    • Пример:
    sensor.writeFlash(12345); // Записать число в энергонезависимую память.
    

    Функция readFlash();

    • Назначение: Чтение пользовательского значения из Flash памяти.
    • Синтаксис: readFlash();
    • Параметры: Нет.
    • Возвращаемое значение: int32_t - число из памяти (0...65535) , или -1 при провале чтения.
    • Примечание:
      • Для записи числа в Flash память воспользуйтесь функцией writeFlash().
      • Число хранится в регистре "Holding Registers" [0x0120] «USER_DATA».
    • Пример:
    i = sensor.readFlash();         // Читаем число из энергонезависимой памяти.
    if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке.
    else   { Serial.print(  i  ); } // Выводим прочитанное значение.
    

    Функция getID();

    • Назначение: Чтение адреса устройства на шине.
    • Синтаксис: getID();
    • Параметры: Нет.
    • Возвращаемое значение: uint8_t - адрес (1...247), или 0 если устройство не инициировано.
    • Примечание:
      • Данная функция может пригодиться если инициализация устройства выполнена функцией begin() без указания адреса (адрес найден автоматически).
    • Пример:
    i = sensor.getID();              // Читаем адрес устройства на шине.
    if(i==0){ Serial.print("ERR"); } // Сообщаем о ошибке.
    else    { Serial.print(  i  ); } // Выводим адрес устройства на шине.
    

    Функция getVersion();

    • Назначение: Чтение версии прошивки устройства.
    • Синтаксис: getVersion();
    • Параметры: Нет.
    • Возвращаемое значение: uint8_t - версия прошивки, или 0 если устройство не инициировано.
    • Пример:
    i = sensor.getVersion();         // Читаем версию прошивки устройства.
    if(i==0){ Serial.print("ERR"); } // Сообщаем о ошибке.
    else    { Serial.print(  i  ); } // Выводим версию прошивки устройства.
    

    Функция setIDLED();

    • Назначение: Управление индикатором обнаружения устройства.
    • Синтаксис: setIDLED( СОСТОЯНИЕ );
    • Параметр: СОСТОЯНИЕ bool - флаг включения индикатора (true или false).
    • Возвращаемое значение: bool - результат применения состояния индикатора (true или false).
    • Примечание:
      • Индикатор обнаружения устройства - это светодиод на разъеме RJ-45.
      • Если индикатор включён, то светодиод постоянно светится. Так можно визуально определить устройство, если на шине имеются несколько одинаковых устройств.
      • Если индикатор отключен, то светодиод информирует о получении запросов, адресованных этому устройству.
    • Пример:
    sensor.setIDLED(true ); // Включаем  индикатор обнаружения устройства.
    sensor.setIDLED(false); // Отключаем индикатор обнаружения устройства.
    

    Функция getPWR();

    • Назначение: Чтение напряжения питания.
    • Синтаксис: getPWR();
    • Параметры: Нет.
    • Возвращаемое значение: float - напряжение (5,000...24,000 В), или -1 при провале чтения.
    • Примечание:
      • Данная функция позволяет узнать напряжение питания поступившее на разъем RJ45.
      • Функция позволяет возвращать значение за пределами указанного диапазона, но корректная работа устройства при таком питании не гарантируется.
    • Пример:
    i = sensor.getPWR();            // Читаем напряжение поступившее на разъем RJ45.
    if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке.
    else   { Serial.print(  i  ); } // Выводим напряжение питания в вольтах.
    

    Функция checkSensor();

    • Назначение: Проверка датчика углекислого газа.
    • Синтаксис: checkSensor();
    • Параметры: Нет.
    • Возвращаемое значение: int8_t - результат проверки датчика может принимать любую комбинацию из следующих значений:
      • ERROR_CO2_INIT - Ошибка инициализации сборки SCD40.
      • ERROR_CO2_DATA - Ошибка чтения данных сборки SCD40.
      • 0 - Ошибки не выявлены.
      • -1 - Нет ответа от модуля.
    • Примечание:
      • Функция позволяет проверить работу сборки SCD40.
      • Датчик сборки SCD40 инициируется после подачи питания и после перезагрузки.
      • Ошибки чтения информируют, что с момента инициализации была хотя бы одна ошибка.
      • Для сброса ошибок нужно перезагрузить датчик функцией reset().
      • Детальная проверка датчика осуществляется самотестированием setSelfTest().
    • Пример:
    uint8_t err = sensor.checkSensor(); // Проверяем работу датчика углекислого газа.
    if( err < 0              ){ Serial.println("Модуль не отвечает"  ); }
    if( err == 0             ){ Serial.println("Ошибки не выявлены"  ); }
    if( err & ERROR_CO2_INIT ){ Serial.println("Неисправен чип SCD40"); }
    if( err & ERROR_CO2_DATA ){ Serial.println("Ошибка чтения SCD40" ); }
    

    Функция getCO2();

    • Назначение: Чтение концентрации углекислого газа CO2 в частях на миллион.
    • Синтаксис: getCO2();
    • Параметры: Нет.
    • Возвращаемое значение: float - количество от 400 до 60'000 ppm, или -1 при провале чтения.
    • Примечание: Концентрация CO2 возвращается целочисленно.
    • Пример:
    i = sensor.getCO2();            // Читаем концентрацию СО2 в ppm.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print( i,0 ); } // Выводим концентрацию СО2 без знаков после запятой.
    

    Функция getTEM();

    • Назначение: Чтение температуры в °С.
    • Синтаксис: getTEM();
    • Параметры: Нет.
    • Возвращаемое значение: float - температура от -10.0 до +60.0 °С, или -100 при провале чтения.
    • Примечание:
      • Датчик определяет не температуру окружающей среды, а температуру внутри корпуса сборки SCD40, которая примерно на 4 °С выше из-за самонагрева. Но возвращаемая температура автоматически занижается на значение смещения температуры.
      • Например, если датчик определил температуру внутри корпуса сборки 25 °С, а значение смещения температуры равно 4°С (по умолчанию), то функция getTEM() вернёт 21 °С.
      • Значение смещения температуры можно изменить функцией setOffsetTEM().
    • Пример:
    i = sensor.getTEM();               // Читаем температуру в °С.
    if(i<-100){ Serial.print("ERR"); } // Ошибка чтения.
    else      { Serial.print( i,1 ); } // Выводим температуру с одним знаком после запятой.
    

    Функция getHUM();

    • Назначение: Чтение относительной влажности воздуха в %.
    • Синтаксис: getHUM();
    • Параметры: Нет.
    • Возвращаемое значение: float - влажность от 0.0 до 100.0 %, или -1 при провале чтения.
    • Примечание:
      • Датчик измеряет абсолютную влажность воздуха и температуру внутри корпуса сборки SCD40. Далее занижает измеренную температуру на значение смещения температуры (по умолчанию 4°С), после чего преобразует абсолютную влажность в относительную с учётом скомпенсированной температуры.
      • Значит на показание относительной влажности воздуха влияет смещение температуры которое можно изменить функцией setOffsetTEM().
    • Пример:
    i = sensor.getHUM();            // Читаем относительную влажность в %.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print( i,1 ); } // Выводим влажность с одним знаком после запятой.
    

    Функция getHUMA();

    • Назначение: Чтение абсолютной влажности воздуха в г/м3.
    • Синтаксис: getHUMA();
    • Параметры: Нет.
    • Возвращаемое значение: float - влажность от 0.00 до 655.35 г/м3, или -1 при провале чтения.
    • Пример:
    i = sensor.getHUMA();           // Читаем абсолютную влажность в г/м3.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print( i,2 ); } // Выводим влажность с двумя знаками после запятой.
    

    Функция setPeriod();

    • Назначение: Установка периода опроса сборки SCD40 внутри блока.
    • Синтаксис: setPeriod( ВРЕМЯ );
    • Параметр:
      • float ВРЕМЯ - количество секунд с одним знаком после запятой (от 0,1 до 6'553,5 сек.).
    • Возвращаемое значение: bool - результат применения нового периода (true или false).
    • Примечание:
      • Сборка SCD40 при включенных периодических измерениях обновляет свои данные с периодичностью зависящей от режима измерений, но после чтения данные стираются из буфера сборки SCD40, а перед чтением необходимо проверять их готовность в буфере, что делает невозможным чтение данных из сборки в режиме реального времени.
      • По этому блок постоянно опрашивает сборку SCD40 через определённые промежутки времени, которые и задаются данной функцией, сохраняя результаты в своих регистрах.
      • Период опроса в нормальном режиме периодических измерений рекомендуется устанавливать в значение 5 секунд (задан по умолчанию).
      • Период опроса при периодических измерениях в режиме энергосбережения, рекомендуется устанавливать в значение 30 секунд.
      • При подаче питания и перезагрузке блока он автоматически инициирует работу сборки в нормальном режиме периодических измерений с периодом опроса 5 секунд.
      • Если не менять режим периодических измерений функцией setAutoCalc(), то нет необходимости и менять период опроса сборки функцией setPeriod().
    • Пример:
    sensor.setPeriod(5.0); // Указываем период опроса сборки равный 5 секундам.
    

    Функция getPeriod();

    • Назначение: Чтение установленного периода опроса сборки SCD40 внутри блока.
    • Синтаксис: getPeriod();
    • Параметры: Нет.
    • Возвращаемое значение: float - время в секундах (0,1...6'553,5), или -1 при провале чтения.
    • Примечание:
      • Блок постоянно опрашивает сборку SCD40 через определённые промежутки времени, сохраняя результаты в регистрах. Это позволяет читать значения по шине без задержек.
      • Функция возвращает время в секундах с одним знаком после запятой. Это время является периодом опроса сборки SCD40 внутри блока.
    • Пример:
    i = sensor.getPeriod();         // Читаем период опроса сборки SCD40.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print( i,1 ); } // Выводим время в секундах с одним знаком после запятой.
    

    Функция setAutoCalib();

    • Назначение: Управление автокалибровкой датчика.
    • Синтаксис: setAutoCalib( ФЛАГ );
    • Параметр:
      • bool ФЛАГ - включения автокалибровки (true - включить, false - отключить).
    • Возвращаемое значение: bool - результат отправки команды (true или false).
    • Примечание:
      • По умолчанию автокалибровка включена.
      • Алгоритмы автоматической самокалибровки ASC (Automatic Self Calibration) не требуют дополнительных действий со стороны пользователя, её достаточно просто включить.
      • О работе автокалибровки сигнализирует светодиод AUTO на плате блока.
      • Вместо данной функции можно воспользоваться кнопкой CALIBRATE на плате блока, кратковременное нажатие на которую так же включает и отключает автокалибровку.
      • Согласно datasheet сборки SCD40, для корректной работы автокалибровки, концентрация CО2 должна снижаться до 400 ppm не реже 1 раза в неделю. Тестирование датчиков с включённой автокалибровкой в течении нескольких месяцев, показало, что несоблюдение этого условия не повлияло на корректность показаний концентрации CO2.
      • При обращении к данной функции во время выполнения периодических измерений, все данные будут сброшены в 0 на время опроса сборки SCD40 (по умолчанию 5 секунд).
    • Пример:
    sensor.setAutoCalib(true ); // Включаем  автокалибровку.
    sensor.setAutoCalib(false); // Отключаем автокалибровку.
    

    Функция getAutoCalib();

    • Назначение: Чтение состояния автокалибровки.
    • Синтаксис: getAutoCalib();
    • Параметры: Нет.
    • Возвращаемое значение: int8_t - состояние: 1-вкл, 0-выкл, или -1 при провале чтения.
    • Пример:
    i = sensor.getAutoCalib();           // Читаем состояние автокалибровки.
    if(i<0 ){ Serial.print("ERR"); }else // Ошибка чтения.
    if(i==0){ Serial.print("OFF"); }else // Автокалибровка отключена.
            { Serial.print("ON!"); }     // Автокалибровка включена.
    

    Функция setAutoCalc();

    • Назначение: Управление периодическими измерениями сборки SCD40.
    • Синтаксис: setAutoCalc( РЕЖИМ );
    • Параметр: uint8_t РЕЖИМ - может принимать одно из трёх значений:
      • SCD40_STOP - остановить периодические измерения. Данные будут сброшены.
      • SCD40_NORMAL - включить периодические измерения в нормальном режиме.
      • SCD40_LOWPWR - включить периодические измерения в режиме энергосбережения.
    • Возвращаемое значение: bool - результат применения режима (true или false).
    • Примечание:
      • Сборка SCD40 обновляет данные только при включенных периодических измерениях.
      • При использовании периодических измерений в нормальном режиме (по умолчанию), данные сборки обновляются каждые 5 секунд.
      • При использовании периодических измерений в режиме энергосбережения, данные сборки обновляются каждые 30 секунд, но значительно снижается потребление тока и самонагрев.
      • При изменении режима периодических измерений нужно изменить и период опроса сборки блоком, на 5 или 30 секунд соответственно, выполнив функцию setPeriod().
      • Отключение периодических измерений экономит питание.
    • Пример:
    sensor.setAutoCalc(SCD40_NORMAL); // Запустить периодические измерения в нормальном режиме.
    

    Функция getAutoCalc();

    • Назначение: Чтение состояния периодических измерений сборки SCD40.
    • Синтаксис: getAutoCalc();
    • Параметры: Нет.
    • Возвращаемое значение: int8_t РЕЖИМ - может принимать одно из значений:
      • SCD40_STOP - периодические измерения не запущены.
      • SCD40_NORMAL - периодические измерения выполняются в нормальном режиме.
      • SCD40_LOWPWR - периодические измерения выполняются в режиме энергосбережения.
      • -1 - провал чтения.
    • Пример:
    switch( sensor.getAutoCalc() ){                     // Читаем состояние периодических измерений.
        case SCD40_STOP:   Serial.print("STOP"); break; // Периодические измерения не запущены.
        case SCD40_NORMAL: Serial.print("NORM"); break; // Периодические измерения выполняются в нормальном режиме.
        case SCD40_LOWPWR: Serial.print("LPWR"); break; // Периодические измерения выполняются в режиме энергосбережения.
        default:           Serial.print("ERR!"); break; // Ошибка чтения.
    }
    

    Функция setOffsetTEM();

    • Назначение: Установка смещения температуры в °С.
    • Синтаксис: setOffsetTEM( TEMP );
    • Параметр:
      • float TEMP - смещение температуры (от 0,1 до 175,0 °C ).
    • Возвращаемое значение: bool - результат записи смещения температуры (true или false).
    • Примечание:
      • Смещение температуры по умолчанию равно 4.0 °С.
      • Датчик измеряет не температуру окружающей среды, а температуру внутри корпуса сборки SCD40, которая примерно на 4 °С выше из-за самонагрева.
      • Датчик занижает измеренную температуру на указанное смещение, возвращая полученное значение функцией getTEM(). Получается что функция getTEM() будет возвращать температуру окружающей среды, если указать смещение температуры равное самонагреву.
      • Например, если датчик определил температуру внутри корпуса сборки 25 °С, а значение смещения температуры равно 4°С (по умолчанию), то функция getTEM() вернёт 21 °С.
      • Смещение температуры не влияет на показания концентрации углекислого газа, но влияет на показания температуры и относительной влажности.
      • Рассчитать действительное значение самонагрева можно по формуле:
        самонагрев = getTEM() + getOffsetTEM() - t°C.
        где t°C - это действительная температура окружающей среды (измеренная градусником).
      • При обращении к данной функции во время выполнения периодических измерений, все данные будут сброшены в 0 на время опроса сборки SCD40 (по умолчанию 5 секунд).
    • Пример:
    i = sensor.getTEM() + sensor.getOffsetTEM() - 25.0f // Вычисляем смещение, зная что реальная температура воздуха равна 25°С.
    sensor.setOffsetTEM( i );                           // Указываем смещение температуры.
    

    Функция getOffsetTEM();

    • Назначение: Чтение используемого смещения температуры.
    • Синтаксис: getOffsetTEM();
    • Параметры: Нет.
    • Возвращаемое значение: float - смещение (от 0,1 до 175,0 °C ), или -1 при провале чтения.
    • Примечание:
      • Смещение температуры это значение на которое датчик занижает измеренную им температуру.
      • Для корректных показаний температуры и влажности, смещение температуры должно быть равно значению самонагрева датчика.
    • Пример:
    i = sensor.getOffsetTEM();      // Читаем используемое смещение температуры.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print( i,1 ); } // Выводим смещение в °С с одним знаком после запятой.
    

    Функция setAltitude();

    • Назначение: Указание высоты датчика над уровнем моря.
    • Синтаксис: setAltitude( ВЫСОТА );
    • Параметр:
      • uint16_t ВЫСОТА - датчика над уровнем моря (от 0 до 65'535 м.).
    • Возвращаемое значение: bool - результат применения новой высоты (true или false).
    • Примечание:
      • Высота над уровнем моря по умолчанию 140 м.
      • На показания концентрации CО2 влияет величина атмосферного давления, которая сильно зависит от высоты над уровнем моря. На высотах от 0 до 2км над уровнем моря, каждый метр высоты меняет давление примерно на 11 Па, это почти 0,1 мм. рт. ст.
      • По высоте указанной датчику он рассчитывает среднее атмосферное давление для этой высоты и использует его для коррекции показаний концентрации углекислого газа.
      • Высота не влияет на показания температуры и влажности.
      • Если датчик подвергается постоянным изменениям высоты или давления, то лучше указывать не высоту над уровнем моря, а реальное атмосферное давление используя функцию setPressure(). Указанное давление имеет приоритет перед высотой.
      • В герметичных камерах, которые подвергаются изменению температур (например, в дневное и ночное время) так же меняется и давление. Это стоит учесть если датчик планируется устанавливать в герметичную камеру (например, установку гидропоники с полным замкнутым циклом жидкостей и газов).
      • При обращении к данной функции во время выполнения периодических измерений, все данные будут сброшены в 0 на время опроса сборки SCD40 (по умолчанию 5 секунд).
    • Пример:
    sensor.setAltitude(5.0); // Указываем период опроса сборки равный 5 секундам.
    

    Функция getAltitude();

    • Назначение: Чтение используемой высоты над уровнем моря.
    • Синтаксис: getAltitude();
    • Параметры: Нет.
    • Возвращаемое значение: int32_t - высота (от 0 до 65'535 м.), или -1 при провале чтения.
    • Примечание:
      • Датчик использует высоту над уровнем моря для расчёта среднего атмосферного давления на указанной высоте, что позволяет корректировать концентрацию углекислого газа.
      • Если датчику указано атмосферное давление, то высота над уровнем моря игнорируется.
    • Пример:
    i = sensor.getAltitude();       // Читаем период опроса сборки SCD40.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print(  i  ); } // Выводим используемую высоту над уровнем моря.
    

    Функция setPressure();

    • Назначение: Указание атмосферного давление.
    • Синтаксис: setPressure( ДАВЛЕНИЕ );
    • Параметр:
      • uint16_t ДАВЛЕНИЕ - атмосферное (от 0 до 65'535 гПа).
    • Возвращаемое значение: bool - результат применения нового давления (true или false).
    • Примечание:
      • По умолчанию давление не указано.
      • На интенсивность фотоакустического эффекта, а следовательно и на показания концентрации CО2 влияет величина атмосферного давления.
      • Давление рекомендуется указывать датчикам которые подвергаются постоянным изменениям высоты или давления, в иных случаях достаточно указать его высоту над уровнем моря функцией setAltitude().
      • В герметичных камерах, которые подвергаются изменению температур (например, в дневное и ночное время) так же меняется и давление. Это стоит учесть если датчик планируется устанавливать в герметичную камеру (например, установку гидропоники с полным замкнутым циклом жидкостей и газов).
      • Обращение к функции указания давления не приводит к сбросу данных и не ограничено ни по количеству, ни по времени.
      • 1 гПа = 100 Па ≈ 0.75 мм.рт.ст.
    • Пример:
    sensor.setPressure(1003); // Указываем атмосферное давление 1'003 гПа = 100'300 Па = 752 мм.рт.ст.
    

    Функция getPressure();

    • Назначение: Чтение указанного атмосферного давления.
    • Синтаксис: getPressure();
    • Параметры: Нет.
    • Возвращаемое значение: int32_t - давление (0...65'535 гПа), или -1 при провале чтения.
    • Примечание:
      • Атмосферное давление влияет на показания концентрации CО2.
      • Если давление не было указано функцией setPressure(), то функция getPressure() вернёт 0.
    • Пример:
    i = sensor.getPressure();       // Читаем указанное ранее атмосферное давление.
    if(i<0){ Serial.print("ERR"); } // Ошибка чтения.
    else   { Serial.print(i*100); } // Выводим атмосферное давление в Па.
    

    Функция setReCalib();

    • Назначение: Запуск принудительной перекалибровки.
    • Синтаксис: setReCalib( CO2 );
    • Параметр:
      • uint16_t CO2 - известная концентрация CО2 (от 0 до 65'535 ppm).
    • Возвращаемое значение: bool - результат начала перекалибровки (true или false).
    • Примечание:
      • Принудительная перекалибровка позволяет точно настроить показания концентрации углекислого газа.
      • Производитель сборки SCD40 предлагает альтернативный способ применения перекалибровки, а именно для быстрого восстановления показаний после скачка питания. Дело в том, что при скачке питания показания CО2 могут уйти от истинного значения и медленно вернуться, но зная последний актуальный результат, можно выполнить перекалибровку и быстро вернуть показания к актуальным значениям.
      • Перед выполнением перекалибровки датчик должен проработать не менее 3 минут в любом из режимов периодических измерений (по умолчанию включен нормальный режим периодических измерений), при постоянной концентрации CО2, которая и будет указана в качестве аргумента функции.
      • После завершения перекалибровки, все данные будут сброшены в 0 на время опроса сборки SCD40 (по умолчанию 5 секунд).
      • Вместо данной функции можно воспользоваться кнопкой CALIBRATE на плате блока, удержание которой в течении 5 секунд запускает перекалибровку, при этом датчик должен находиться в атмосфере с концентрацией углекислого газа 400 ppm (средняя концентрация на свежем воздухе).

    Функция getReCalib();

    • Назначение: Чтение результата принудительной перекалибровки.
    • Синтаксис: getReCalib();
    • Параметры: Нет.
    • Возвращаемое значение: int8_t - РЕЗУЛЬТАТ - может принимать одно из значений:
      • SCD40_PROGRESS - Выполняется.
      • SCD40_FAIL - Не выполнена.
      • SCD40_SUCCESS - Выполнена.
      • -1 - Нет ответа от модуля.
    • Примечание: О выполнении перекалибровки можно узнать тне только функцией getReCalib(), но и по свечению светодиода «400» на плате блока.
    • Пример:
    // Запускаем перекалибровку:                                     //
    sensor.setReCalib(400);                                          // Концентрация CO2 = 400 ppm.
    // Ждём завершение перекалибровки:                               //
    while( sensor.getReCalib()==SCD40_PROGRESS ){ delay(100); }      // Калибровка выполняется.
    // Выводим результат перекалибровки:                             //
    if( sensor.getReCalib()==SCD40_SUCCESS ){ Serial.print("OK!"); } // Успех.
    else                                    { Serial.print("ERR"); } // Провал.
    

    Функция setSelfTest();

    • Назначение: Запуск самотестирования датчика.
    • Синтаксис: setSelfTest();
    • Параметры: Нет.
    • Возвращаемое значение: bool - результат запуска самотестирования (true или false).
    • Примечание:
      • Самотестирование осуществляется аппаратными средствами сборки SCD40, при которой в течении нескольких секунд проверяется функциональность и цепи питания датчика, в отличии от проверки датчика функцией checkSensor(), которая возвращает результат инициализации и наличие ошибок чтения.
      • После завершения самотестирования, все данные будут сброшены в 0 на время опроса сборки SCD40 (по умолчанию 5 секунд).
      • Вместо данной функции можно воспользоваться кнопкой CALIBRATE на плате блока, удержание которой дольше 20 секунд запускает самотестирование.

    Функция getSelfTest();

    • Назначение: Чтение результата самотестирования.
    • Синтаксис: getSelfTest();
    • Параметры: Нет.
    • Возвращаемое значение: int8_t - РЕЗУЛЬТАТ - может принимать одно из значений:
      • SCD40_PROGRESS - Выполняется.
      • SCD40_FAIL - Не выполнена.
      • SCD40_SUCCESS - Выполнена.
      • -1 - Нет ответа от модуля.
    • Примечание: О выполнении самотестирования можно узнать тне только функцией getSelfTest(), но и по поочерёдному переключению светодиодов «AUTO» и «400» на плате блока.
    • Пример:
    // Запускаем самотестирование:                                    //
    sensor.setSelfTest();                                             //
    // Ждём завершение самотестирования:                              //
    while( sensor.getSelfTest()==SCD40_PROGRESS ){ delay(100); }      // Калибровка выполняется.
    // Выводим результат перекалибровки:                              //
    if( sensor.getSelfTest()==SCD40_SUCCESS ){ Serial.print("OK!"); } // Успех.
    else                                     { Serial.print("ERR"); } // Провал.
    

    Обработка ошибок:

    Рассмотренные выше функции библиотеки iarduino_MB_CO2 возвращают не только результат чтения, но и ошибки при записи или чтении. Причину ошибок можно выяснить функцией lastError() библиотеки iarduino_Modbus.

    Функция lastError();

    • Назначение: Получение кода причины последней ошибки.
    • Синтаксис: lastError(); // Функция библиотеки iarduino_Modbus.
    • Параметры: Нет.
    • Возвращаемое значение: uint8_t - код причины последней ошибки.
      • ERROR_ILLEGAL_FUNCTION - Команда запроса не поддерживается модулем.
      • ERROR_ILLEGAL_ADDRESS - У модуля отсутствует регистр с указанным адресом.
      • ERROR_ILLEGAL_VALUE - Недопустимое значение в поле данных запроса.
      • ERROR_DEVICE_FAILURE - Любая невосстановимая ошибка кроме первых трёх.
      • ERROR_ACKNOWLEDGE - Модуль принял запрос, но на обработку требуется время.
      • ERROR_DEVICE_BUSY - Ведомый занят, запрос проигнорирован.
      • ERROR_MEMORY_PARITY - Ошибка чтения/записи файла.
      • ERROR_GATEWAY_UNAVAILABLE - Шина перегружена данными или не настроена.
      • ERROR_GATEWAY_NO_DEVICE - Ведомого устройства нет или от него нет ответа.
      • ERROR_SYNTAX - Ошибка синтаксиса.
      • ERROR_ADR_IARDUINO - Ошибка назначения или сортировки адресов устройств iarduino.
      • ERROR_ADR_RESPONSE - Несовпадение адреса регистра в ответе.
      • ERROR_VAL_RESPONSE - Несовпадение данных в ответе.
      • ERROR_CRC_RESPONSE - Несовпадение CRC в принятом ответе.
      • ERROR_LEN_REQUEST - Размер отправляемого запроса превышает размер буфера.
      • ERROR_LEN_RESPONSE - Размер полученного ответа превышает размер буфера.
    • Пример:
    float i = sensor.getCO2();           // Читаем концентрацию СО2 в частях на миллион.
    if(i>=0){                            // Если чтение выполнено без ошибок...
        Serial.print( i,0 );             // Выводим прочитанное значение без знаков после запятой.
    }else{                               // Если чтение не выполнено...
        switch( modbus.lastError() ){    // Получаем код последней ошибки.
            case ERROR_ILLEGAL_FUNCTION:    Serial.println( F("Модуль не поддерживает команду или функцию запроса")           ); break;
            case ERROR_ILLEGAL_ADDRESS:     Serial.println( F("Запрос содержит недопустимый адрес регистра")                  ); break;
            case ERROR_ILLEGAL_VALUE:       Serial.println( F("Запрос содержит недопустимое значение в поле данных")          ); break;
            case ERROR_DEVICE_FAILURE:      Serial.println( F("Ошибка запроса не связана с командой, адресом или данными")    ); break;
            case ERROR_ACKNOWLEDGE:         Serial.println( F("Модуль сообщает что занят и обработает запрос позже")          ); break;
            case ERROR_DEVICE_BUSY:         Serial.println( F("Модуль сообщает что занят и не будет обрабатывать запрос")     ); break;
            case ERROR_MEMORY_PARITY:       Serial.println( F("Модуль сообщает что произошла ошибка чтения/записи файла")     ); break;
            case ERROR_GATEWAY_UNAVAILABLE: Serial.println( F("Шлюз неправильно настроен или перегружен запросами")           ); break;
            case ERROR_GATEWAY_NO_DEVICE:   Serial.println( F("Модуль которому адресован запрос не отвечает")                 ); break;
            case ERROR_SYNTAX:              Serial.println( F("Ошибка синтаксиса")                                            ); break;
            case ERROR_ADR_IARDUINO:        Serial.println( F("Ошибка назначения или сортировки адресов устройств iarduino")  ); break;
            case ERROR_ADR_RESPONSE:        Serial.println( F("Ответ от модуля содержит недопустимый адрес регистра")         ); break;
            case ERROR_VAL_RESPONSE:        Serial.println( F("Ответ от модуля содержит недопустимое значение в поле данных") ); break;
            case ERROR_CRC_RESPONSE:        Serial.println( F("Несовпадение CRC в ответе модуля")                             ); break;
            case ERROR_LEN_REQUEST:         Serial.println( F("Размер запроса к модулю превышает буфер обмена или ADU")       ); break;
            case ERROR_LEN_RESPONSE:        Serial.println( F("Размер ответа от модуля превышает буфер обмена")               ); break;
            default:                        Serial.println( F("Неизвестная ошибка")                                           ); break;
        }
    }
      Зная причину ошибки, можно принять меры к её устранению:
    • ERROR_GATEWAY_NO_DEVICE - нет ответа от модуля, означает что устройство отсутствует на шине. Причиной данной ошибки может быть, как физическое отключение устройства, так и плохой контакт, или недостаточное питание.
    • ERROR_SYNTAX - ошибка синтаксиса, означает наличие ошибки в коде, например функция вызвавшая данную ошибку была вызвана с некорректными параметрами, или вызвана до инициализации модуля.

    Ссылки:




    Обсуждение

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