В качестве датчика измерения влажности в любительской метеостанции используется GY-21. Рассмотрим, что из себя представляет этот датчик, каким образом его можно подключить к контроллеру, а также приведем пример программы, получающей значения влажности и температуры с датчика и выводящей их в последовательный порт.
Описание
Представляет собой высокоточный модуль для измерения температуры и влажности. Обладает очень низкой погрешностью в своём классе: при измерении температуры она составляет - 0.4%, а влажности - 2%

Существуют несколько версий модуля GY-21 в зависимости от того, на какой микросхеме сенсора он основан: SHT21 - от Sensirion, HTU21 - от MEAS, SI7021 - от Silicon Labs.

Для защиты чувствительного элемента от загрязнений микрочастицами пыли может применяться PTFE фильтр-мембрана.
Реализована возможность прогрева сенсора для удаления росы и получения истинных значений влажности воздуха, если сенсор продолжительное время работал при влажности от 80% и выше.
Данный сенсор может применяться для систем контроля микроклимата помещений, автономной метеорологической аппаратуры, малогабаритных бытовых метеостанций.
Характеристики датчика
- Измерение температуры: -40...+125°C
- Измерение влажности воздуха: 0...100 %
- Рабочее напряжение: 2,1...3,6 В
- Интерфейс: I2C
- Рабочая температура: -40...+85°C
Подключение датчика к контроллеру
VIN - питание +3.3В
GND - земля
SCL - интерфейс I2C IO5 (GPIO5, D1)
SDA - интерфейс I2C IO4 (GPIO4, D2)
Программа получения влажности и температуры
Для обмена данными с датчиком используется библиотека HTU2xD/SHT2x/Si70xx и библиотека Wire для работы с I2C.
#include <Wire.h>
#include <HTU2xD_SHT2x_Si70xx.h>
float htValue; //to store T/RH result
/*
типы сенсоров:
- HTU2xD_SENSOR, SHT2x_SENSOR //взаимозаменяемы друг с другом, так как они имеют одинаковый адрес и характеристики
- SI700x_SENSOR, SI702x_SENSOR //взаимозаменяемы друг с другом, так как они имеют одинаковый адрес и характеристики
- SI701x_SENSOR //не взаимозаменяемые с SI700x_SENSOR/SI702x_SENSOR, различные адреса
разрешение:
- HUMD_08BIT_TEMP_12BIT //RH 8-bit / T 12-bit
- HUMD_10BIT_TEMP_13BIT //RH 10-bit / T 13-bit
- HUMD_11BIT_TEMP_11BIT //RH 11-bit / T 11-bit
- HUMD_12BIT_TEMP_14BIT //RH 12-bit / T 14-bit
*/
HTU2xD_SHT2x_SI70xx ht2x(HTU2xD_SENSOR, HUMD_12BIT_TEMP_14BIT); //задаем тип сенсора, разрешение
void setup() {
Serial.begin(115200);
Serial.println();
while (ht2x.begin() != true) //сброс сенсора, выключение нагревателя, установка разрешения
{
Serial.println(F("HTU2xD/SHT2x not connected, fail or VDD < +2.25v")); //(F()) сохраняет строку во флэш-память для освобождения динамической памяти
delay(5000);
}
Serial.println(F("HTU2xD/SHT2x OK"));
}
void loop() {
Serial.println();
/* измерение температуры */
htValue = ht2x.readTemperature(); //точность +-0.3C в диапазоне 0C..60C для 14-bit
Serial.print(F("Temperature...............: "));
if (htValue != HTU2XD_SHT2X_SI70XX_ERROR) //HTU2XD_SHT2X_SI70XX_ERROR = 255, возвращает 255, если произошла ошибка
{
Serial.print(htValue);
Serial.println(F(" +-0.3C"));
}
else
{
Serial.println(F("<error>"));
ht2x.softReset(); //попытка восстановить работу, во все регистры устанавливаются значения по умолчанию
ht2x.setHeater(false); //true=нагреватель вкл, false=нагреватель выкл
ht2x.setResolution(HUMD_12BIT_TEMP_14BIT); //влажность 12-bit, температура 14-bit
}
/* измерение влажности */
delay(500); //частые измерения разогревают сенсор, что ведет к недостоверности данных, требуется задержка
Serial.print(F("Compensated Humidity......: "));
if (htValue != HTU2XD_SHT2X_SI70XX_ERROR) //если температура OK, измеряется и рассчитывается скомпенсированная влажность
{
htValue = ht2x.getCompensatedHumidity(htValue); //точность +-2% в диапазоне 0%..100%/0C..80C для 12-bit, компенсация влияния температуры на влажность
if (htValue != HTU2XD_SHT2X_SI70XX_ERROR)
{
Serial.print(htValue);
Serial.println(F(" +-2%"));
}
}
if (htValue == HTU2XD_SHT2X_SI70XX_ERROR)
{
Serial.println(F("<error>"));
}
/* проверка состояния питания */
Serial.print(F("Power.....................: "));
if (ht2x.voltageStatus() == true)
{
Serial.println(F("power OK, VDD > +2.25v"));
}
else
{
Serial.println(F("power FAIL, VDD < +2.25v"));
}
/* чтение идентификатора сенсора */
Serial.print(F("Sensor ID.................: "));
htValue = ht2x.readDeviceID(); //возвращает 21 для SHT, HTU или 7021, 7020, 7013, 7006, 7000 для сенсора Si70xx
if (htValue != HTU2XD_SHT2X_SI70XX_ERROR)
{
Serial.println(htValue);
}
else
{
Serial.println(F("<error>"));
}
delay(10000); //рекомендуемая частота опроса 8 - 30 сек
}
Прошиваем контроллер и открываем монитор порта.
Пример вывода в порт:
