Ответственный подход к измерению относительной влажности

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



    Статья посвящена высокоточным датчикам серии HYT. Приводится описание устройства датчика и чувствительного элемента, подробно разбирается порядок сопряжения датчика с микроконтроллером, приводится пример разработки.


    1. Обзор



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



    О других вариантах корпусировки поговорим ниже, а пока приведем основные характеристики датчиков HYT.
      Относительная влажность Температура 
    Диапазон измерений от 0 до 100 % RH  от -40 до +125 °C
    Точность (максимальная погрешность) ± 1.8 % RH (в диапазоне 0… 80 % RH) ± 0.2 °C (в диапазоне 0… 60 °C) 
    Время отклика HYT 271 < 4 сек
    HYT 221 < 12 сек
    HYT 939 < 10 сек
    HYT 271 < 5 сек
    HYT 221 < 12 сек
    HYT 939 < 10 сек
    Повторяемость  ± 0.2 % RH ± 0.1 °C
    Гистерезис  < ± 1 % RH  
    Долговременный дрейф характеристик < ± 0.5 % RH / год < ± 0.05 °C / год
    Напряжение питания 2,7 – 5,5 В
    Потребляемый ток < 22 мкА при частоте опроса 1 Гц, <1 мкА в режиме сна 

    Понятно, что столь высокие точность и стабильность не пригодятся в домашней метеостанциитм. Датчики HYT используются в промышленности — в бытовой технике, в процессах, которые связаны с сушкой, испарением и перегонкой, в анализаторах остаточной влажности различных материалов, в медицинской технике, в системах вентиляции и в других «ответственных приложениях».

    2. Чувствительный элемент



    Как и большинство современных датчиков относительной влажности, датчики HYT имеют емкостный чувствительный элемент. Принципы работы преобразователей «влажность-емкость» и их преимущества описаны в огромном количестве источников, напомню главное.

    • Чувствительный элемент представляет собой конденсатор, емкость которого изменяется пропорционально относительной влажности окружающей среды.
    • В качестве диэлектрика используется слой полимера, диэлектрическая проницаемость которого зависит от количества абсорбированной им влаги.
    • Зависимость влажность-емкость носит линейный характер и позволяет проводить измерения в диапазоне от 0 до 100 % RH.




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

    εo — Электрическая постоянная. Мне лень даже приводить её значение, суть в том что оно является константой
    εr — Диэлектрическая проницаемость полимера, изменяющаяся пропорционально количеству поглощенной влаги
    A — Площадь полимера
    d — Толщина полимера

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

    Например, для метеозондов и некоторых других приложений важным требованием является высокое быстродействие. Сокращение времени отклика чувствительного элемента достигается за счет уменьшения толщины полимера, таким образом у датчика P14 Rapid обеспечивается время отклика менее 1.5 сек. Другой пример — датчики MK33, предназначенные для работы с маслами. Здесь за счет увеличения площади чувствительного элемента увеличивается крутизна выходной характеристики, а значит и разрешение датчика.

    IST выпускает около десятка различных емкостных преобразователей. Интересующихся приглашаю пройти по ссылке на их обзор, а мы возвращаемся к цифровым датчикам HYT.

    3. Структура датчиков HYT



    Использование «голого» чувствительного элемента оправдано в очень немногих случаях. Как правило, проще и выгоднее использовать интегральный модуль, в котором помимо емкостного преобразователя уже предусмотрены датчик температуры, схемы термокомпенсации и обработки сигнала, а также цифровой или аналоговый интерфейс. Такие цифровые датчики имеют заводскую калибровку и не требуют дополнительной настройки.

    Цифровые датчики температуры и относительной влажности производятся в разных ценовых сегментах. Датчик, подходящий под описание из предыдущего абзаца, может стоить и 2 доллара, и 150 долларов. Такая разница между дорогими и дешевыми датчиками объясняется тем, что цифровые датчики различаются не только точностью, быстродействием и повторяемостью результатов измерений, но и другими характеристиками, обеспечить которые не так просто. Это долговременная стабильность работы, возможность применения датчика при очень низкой или очень высокой влажности и устойчивость к воздействиям внешней среды. Чтобы понять, почему перечисленные характеристики оказывают большое влияние на стоимость компонента, обратимся к особенностям производства.

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

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



    За счет уменьшения взаимного влияния ИС и емкостного датчика, использования почти не поглощающих влагу материалов, золотых проводников, а также применения других мер по повышению качества, на цифровом модуле удается добиться точности, близкой к точности отдельного преобразователя «влажность-емкость».

    4. Калибровка датчиков HYT



    Стандартная заводская калибровка проводится по девяти точкам при трех значениях температуры:
    • 0% и 85% RH при 5°C
    • 0%, 15%, 30%, 50%, 85% RH при 30 °C
    • 0% и 85% RH при 45°C

    После калибровки проводятся контрольные измерения. Стандартные контрольные точки:
    • 85% RH при 5°C
    • 20% и 75% RH при 25°C

    Здесь самое время напомнить об одной из главных фишек IST: по запросу заказчика производитель изготавливает самые разные модификации своих датчиков. Поставляются датчики с измененными характеристиками, изделия в нестандартных корпусах и, конечно, датчики с нестандартной калибровкой. Зная специфику условий применения конечного изделия, можно, к примеру, заказать датчик HYT с калибровкой от 0 до 50% RH со сдвигом +2% RH на всем диапазоне.

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

    5. Корпус датчиков HYT



    Приведем описание датчиков серии HYT.

    Самый простой модуль — HYT 271 — имеет размер 5 на 10 мм и состоит из емкостного преобразователя, залитой «кляксой» интегральной схемы и дополнительных конденсаторов. В отсутствии защитного фильтра достигаются максимальное быстродействие и минимальная цена.

    Цифровой датчик HYT 221 имеет ту же начинку, что и HYT 271, но покрыт защитным фильтром, который позволяет использовать датчик в том числе при наличии брызг воды.


    Датчик HYT 939 также отличается только типом защитного фильтра — компоненты помещаются под круглый металлический корпус, на верхней стороне которого расположено закрытое мембраной отверстие. Для заказа доступен модуль HYT 939, устойчивый к давлению до 16 бар.

    В соответствии с требованиями заказчика могут быть изменены и структура, и габаритные размеры датчика. Вместо стандартного интерфейса I2C датчик может быть оснащен 5-выводным SPI, а дополнительно к цифровому интерфейсу могут быть добавлены дополнительные квазианалоговые линии. Выводы датчика могут быть удлинены, оснащены коннектором. Производятся датчики в специализированных корпусах, например как на фото.

    Заказ датчиков с модифицированными размерами или нестандартной конфигурацией возможен в том числе для мелкосерийного производства.


    4. Порядок сопряжения датчика и управляющего контроллера



    Стандартным интерфейсом подключения датчика HYT к управляющему микроконтроллеру является шина I2C. Контроллер является мастером, датчик — ведомым узлом.

    В аппаратных характеристиках интерфейса датчика нет ничего примечательного — поддерживаются скорости от 100 до 400 кГц и стандартный 7-битный адрес на шине. Адрес датчика по умолчанию — 0x28, адрес может быть изменен на значение от 0x00 до 0x7F. Данные передаются в режиме MSB, т.е. сначала идут старшие биты.

    Не вижу смысла приводить описание порядка работы самой шины I2C. Также упускаю описание типовой схемы включения, требований модуля HYT по таймированию на I2C, описание процедуры смены адреса датчика. Всё это можно найти в википедии и документации.

    Остановимся на процедуре сбора данных с датчика HYT — последовательности из двух команд для управления модулем.
    В отсутствии запросов от микроконтроллера, датчик находится в режиме сна. По приходу команды ‚Measuring Request‘ (MR) он просыпается, начинает цикл измерений и формирует посылку с данными для управляющего контроллера. Подготовка данных занимает от 60 до 100 мс, после этого на датчик должна поступить команда ‚Data Fetch‘ (DF), по которой данные из выходного регистра датчика передаются на микроконтроллер.

    Команда ‚Measuring Request‘ не подразумевает ни чтения, ни записи данных. Команда содержит только из заголовочного пакета — адреса ведомого узла и бита RW, выставленного в «0», т.е. на запись.



    Команда ‚Data Fetch‘ (DF) служит для чтения данных. В заголовочном файле содержится адрес датчика и бит RW, установленный в «1», т.е. на чтение.



    Максимальное количество байт, которые должны быть приняты на микроконтроллере — четыре. Первые два байта содержат данные об относительной влажности, третий и четвертый — о температуре.

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

    И на влажность, и на температуру приходится по 14 бит. Посылка Data Fetch также содержит два бита состояния:
    • CMode Bit. Если установлена «1», то датчик находится в command mode — в служебном режиме, который используется для изменения адреса датчика на I2C
    • Stale bit. Если установлена «1», значит после выполнения очередного цикла измерений получены те же значения температуры и влажности, что и после предыдущего цикла


    Обработка принятой посылки состоит в вычислении значений температуры и относительной влажности из входных данных. Сначала маскируются статусные биты, далее из полученных данных вычисляются абсолютные значения температуры и относительной влажности:

    RH [%] = (100 / (214 — 1)) * RHвх
    T [°C] = (165 / (214 — 1)) * Tвх — 40

    5. Пример включения датчика HYT



    От теории к практике. Рассмотрим задачу опроса датчика HYT с отладочной платы EFM32ZG-STK3200 от Silicon Labs, подробнейшее описание которой приводилось в одной из предыдущих статей.

    В этот раз на отладочной плате нам понадобятся встроенный ЖК-дисплей, механическая кнопка и 20-контактный разъем, на котором доступны сигналы I2C, питание и земля.



    Подключение

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

    Для работы шины I2C на обеих её линиях должны быть предусмотрены подтягивающие резисторы. В документации на датчик HYT указаны номиналы 2.2 кОм, и превоначально схема была собрана с использованием двух отдельных сопротивлений. Однако в процессе отладки выяснилось, что для опроса датчика, подключенного на короткие выводы, достаточно использовать встроенные подтягивающие резисторы микроконтроллера EFM32. Их номинал равен 40 кОм.



    В данном случае датчик питается от линии питания МК (3.3 В), но допустимы и пятивольтовые уровни.

    Программирование микроконтроллера

    Для работы с отладочной платой EFM32ZG-STK3200 используется среда Simplicity Studio — платформа, содержащая IDE, примеры программ, документацию и различные утилиты для разработки приложения. Её описание также можно найти в предыдущих статьях, здесь я просто скажу что это бесплатная программа, которую SiLabs распространяет для работы с SiLabs-овскими же контроллерами.

    При создании программы используется готовый драйвер I2C от SiLabs и библиотека glib, предназначенная для работы со встроенным на плану ЖКИ. Для коммуникации с дисплеем используются интерфейс SPI и часы реального времени, однако работа с этим модулями скрыта в недрах glib.

    Программа реализует простейший аглоритм опроса датчика HYT — по нажатию на кнопку PB1 мы получаем от датчика данные о температуре и влажности, пересчитывам полученные значения в градусы Цельсия и проценты и выводим их на экран. В случае, если при приёме данных произвошла ошибка, выводится соответствующее сообщение.

    image image image

    Полные исходники программы доступны наgithub. Ниже разберем лишь ту часть программы, которая имеет отношение к опросу датчика, т.е. к коммуникации по I2C.
    В основном используются стандартные функции библиотек от Silicon Labs — основной пакет em_i2c и его надстройка i2cspm.

    Для коммуникации с датчиком, т.е. реализации команд Measuring Request и Data Fetch, служат одноименные функции.

    Каждая из них содержит операции по формированию пакета для I2C и команду отправки пакета. Для формирования пакета используется структура типа I2C_TransferSeq_TypeDef, содержащая адрес датчика, значение бита RW, и формат регистров для приема (buf[0]) и передачи (buf[1]) данных по I2C.

    /**************************************************************************//**
     * Start a measuring cycle (Measurement Request command)
     *  - [6-bit address] + [W flag]
     *  - w/o data transfer
     *****************************************************************************/
    void performMRCommand(void) {
    	I2C_TransferSeq_TypeDef seq;
    	seq.addr = HYT_ADDR;
    	seq.flags = I2C_FLAG_WRITE;
    	seq.buf[0].len = 0;
    	seq.buf[1].len = 0;
    	I2CSPM_Transfer(I2C0, &seq);
    }
    


    Функция performDFCommand, помимо указания на прием четырехбайтного пакета с записью данных в массив I2CdataToRead, содержит алгоритм обработки принятой посылки. В результате преобразования в переменные temperature и humidity записываются искомые значения.

    /**************************************************************************//**
     * Fetch the last measured value of Humidity / Temperature (Data Fetch command)
     *  - [6-bit address] + [R flag]
     *  - w/ 4-byte data transfer: [CMode bit] + [State bit] + [14 bit humididty] +
     * 								+ [14 bit temeprature] + [2 insignificant bits]
     *****************************************************************************/
    int8_t performDFCommand(void) {
    	I2C_TransferSeq_TypeDef seq;
    	uint8_t I2CdataToRead[4];
    	unsigned int tempRawData, humididtyRawData;
    
    	seq.addr = HYT_ADDR;
    	seq.flags = I2C_FLAG_READ;
    	seq.buf[0].data = I2CdataToRead;
    	seq.buf[0].len = 4;
    	seq.buf[1].len = 0;
    	I2CSPM_Transfer(I2C0, &seq);
    
    	uint8_t sensorCModeBit = (I2CdataToRead[0] & 0x80) >> 7;
    	uint8_t sensorStateBit = (I2CdataToRead[0] & 0x40) >> 6;
    	tempRawData = ((I2CdataToRead[2] << 8) | I2CdataToRead[3]) >> 2;
    	humididtyRawData = ((I2CdataToRead[0] & 0x3F) << 8) | I2CdataToRead[1];
    
    	if (sensorCModeBit == 1) {
    		return HYT_COMMAND_MODE;
    	}
    	if (tempRawData != 0 && humididtyRawData != 0 && tempRawData < 0x3FFF
    			&& humididtyRawData < 0x3FFF) {
    		if (sensorStateBit != 1) {
    			/* temperature as 14bit-value in the range from -40°C to +125°C */
    			temperature = ((float) (tempRawData) * 165.0F / 16383.0F) - 40.0F;
    			/* humidity as 14bit-value in the range from 0%rH to 100%rH */
    			humidity = (float) humididtyRawData * 100.0F / 16383.0F;
    		} else {
    			/* No new value has been created since the last reading */
    		}
    		return HYT_IS_OK;
    	} else {
    		return HYT_ERROR;
    	}
    }


    При работе с готовыми библиотечными функциями для I2C от SiLabs существует два основных способа испортить себе жизнь:

    Способ 1: Посчитать, что в HYT_ADDR следует записывать 0x28, т.е. указанный в документации адрес датчика.
    Напомню, что адрес на шине I2C — это семь бит, т.е. под 0x28 в документации подразумевается 010 1000. Логично было бы дополнить это число старшим битом «0» и всё ещё имееть 0x28, однако библиотечная функция почему-то считает, что адресом являются не младшие, а старшие 7 бит. Таки образом, вместо
    #define 	   HYT_ADDR    0x28
    
    следует указывать
    #define 	   HYT_ADDR    0x50
    
    или
    #define 	   HYT_ADDR    0x51
    

    Способ 2: Посчитать, что I2C_FLAG_READ — это «0», а I2C_FLAG_WRITE — это «1», что предусмотрено протоколом шины. То есть на самом деле всё так и есть, в заголовочном байте посылки I2C предусмотрен один-единственный бит RW, который выставляется в «0» для записи данных и в «1» для чтения данных. Однако в недрах библиотеки em_lib прячутся вот такие коварные дефайны:
    #define 	I2C_FLAG_WRITE    0x0001
    #define 	I2C_FLAG_READ     0x0002
    
    Так что не стоит при формировании структуры I2C_TransferSeq_TypeDef выставлять нули и единицы самостоятельно.

    В остальном претензий к em_i2c и другим пакетам em_*** не возникало.

    Между вызовами функций performMRCommand() и performDFCommand() должна быть предусмотрена задержка, за которую датчик формирует посылку с результатами измерений.

    /**************************************************************************//**
     * Read temperature and humidity from HYT sensor, show result on the display
     *  - Send MR (Measurement Requests) command
     *  - Wait for 100 msec
     *  - Send DF (Data Fetch) command
     *  - Show result OR show error message
     *****************************************************************************/
    void ReceiveDataAndShowIt(void) {
    	performMRCommand();
    	delay100ms();
    	int8_t HYT_result = performDFCommand();
    	if (HYT_result == HYT_IS_OK) {
    		Display_ShowValues(temperature, humidity);
    	} else if (HYT_result == HYT_COMMAND_MODE) {
    		Display_ShowCMode();
    	} else if (HYT_result == HYT_ERROR) {
    		Display_ShowError();
    	}
    }
    


    Функцию ReceiveDataAndShowIt(), выполняющую опрос датчика и вывод результатов измерений, мы вызываем из обработчика прерываний, который приведен ниже.

    /**************************************************************************//**
     * GPIO Interrupt handler (pushbutton # 1)
     *  - Receive HYT data & show results on the display
     *****************************************************************************/
    void GPIO_ODD_IRQHandler(void) {
    	uint32_t interruptMask = GPIO_IntGet();
    
    	if (interruptMask & (1 << BUTTON_PIN)) {
    		Display_WellcomeScreen();
    		ReceiveDataAndShowIt();
    	}
    
    	GPIO_IntClear(interruptMask);
    }
    


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

    Выдающиеся характеристики серии HYT гораздо лучше иллюстрируются в динамике. На приведенном ниже видео показано насколько быстро датчик HYT-271 откликается на изменение влажности воздуха.



    Если вы имели честь когда-нибудь наблюдать с какой скоростью реагирует на изменения влажности условный DHT22, то, конечно, почувствуете разницу.

    P.S. Процессу создания прототипа, который демонстрируется на видео, посвящен цикл статей "Как перестать бояться и полюбить mbed"

    6. Заключение



    В заключении традиционно благодарю читателя за внимание и напоминаю, что вопросы по применению продукции, о которой мы пишем на хабре, можно также задавать на email, указанный в моем профиле.
    ЭФО 48,59
    Поставки электронных компонентов
    Поделиться публикацией
    Комментарии 16
    • +2
      интересует цена таких датчиков
      • 0
        Ха, так себе из меня продажник — главную ссылку забыла))
        Там весь наш склад на датчиков IST.
        • 0
          Ну и раз такое дело, давайте скидку 5% по коду habr сделаем.
          • –1
            дороговато будет, а для мониторинга параметров в квартире подойдут и более дешевые аналоги
            • +1
              Ну причём же тут мониторинг квартиры? Это для совсем других задач. Возьмите себе Si7021, по 2.54 доллара лежат.
      • 0
        в том числе при наличии брызг воды.

        Переживёт регулярную мелкодисперсионную взвесь воды?
        • +4
          Так на моей памяти еще никто не описывал баню :)
          • 0
            Sauna указана производителем как одно из целевых приложений для дискретных емкостных чувствительных элементов. Т.е. сам по себе емкостный датчик от IST будет благополучно существовать в мелкодисперсионной взвеси воды.

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

            Если вы спрашиваете не из простого интереса, а имея в виду конкретную задачку, то напишите мне более детально, пожалуйста
          • +2
            Табачный дым, как обычно, для датчика смертелен?
            • 0
              В целом — нет, не смертелен.

              Но у меня сейчас на руках нет никаких цифр, результатов тестов именно для табачного дыма. Опишите приложение и требования к качеству измерений подробнее и мы подберем что-то подходящее.
              • 0
                У всех подобных датчиков в документации прописана недопустимость воздействия на датчик табачного дыма — он просто забивает пористый электрод и датчик перестаёт выдавать адекватный результат.
                Может быть, отмачивание в растворителе помогает(и то я не уверен что растворитель как жидкость сможет проникнуть внутри в поры), но получается за датчиками надо следить постоянно а это порой бывает накладно — в офисе например, раз в год кто-то покурит возле датчика и всё — теперь каждый день его проверять? Ведь датчик никаким образом не сообщает о том что забился, разве только косвенно или принудительно его чистить с каким-то интервалом.
                Впрочем, табачный дым — это просто типичный бытовой загрязнитель, а их наверняка существует множество — аэрозоль из краски или лака например.
                • 0
                  Воздействие газов не обязательно ведет к разрушению компонентов датчика. Я пока не могу говорить именно о табачном дыме, но многие химические воздействия обратимы и «лечатся» прогреванием.
                  Есть, например, сенсор со встроенным термометром сопротивления P14 2FW Thermo:


                  image


                  Pt100 или Pt1000 спаривается с емкостным датчиком и может служить как датчик температуры или как нагреватель. Нагрев элемента используется для рекалибровки, а также позволяет избавляться от кондесата или проводить тот самый Outgassing of humidity sensor.
                  Disturbing molecules can cause a drift because of diffusion or absorption. These molecules can be driven out of the polymer by heating

                  Есть результаты тестов, в соответствии с которыми прогрев датчика P14 2FW Thermo (140°C, 30 минут) позволил сократить отклонение характеристики датчика после воздействия паров лакокрасочного материала с -25 до +1,5% RH.

                  Это только один пример и он, конечно, не претендует на общность. Посыл в том что во многих случаях есть способы, позволяющие получить удобоваримые характеристики после воздействия газов.
                  • 0
                    Это касается дегазации, а табачный дым та ещё гадость — очень липкий(смолообразный), размер частиц — до 2мкм, легко адсорбируется и является уже продуктом сгорания «выжечь» температурой его нельзя.
                    Впрочем, у датчиков описанных в статье такого подогрева всёравно нет.
                    • 0
                      Коллеги, посыпаю голову пеплом — не выложила летом результаты тестов на табачный дым сюда, в публичное пространство.

                      Далее цитата.
                      We made following test:

                      Measure the modules (2 pieces of HYT271 and 1 piece of HYT221).
                      After we exposed the modules to cigarette smoke (put the modules into 2l bottle and burn 2 cigarettes for 1 hour and leave the modules for 1 day in this bottle, 1 day later we repeated this cycle).

                      After the exposure in the cigarette smoke the modules were measured again.

                      The results are in the table below.

                • 0
                  Два-три разнесенных в пространстве датчика, решают вашу проблему.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое