Любительская метеостанция. Датчик влажности GY-21.

Любительская метеостанция. Датчик влажности GY-21.

Характеристики датчика влажности GY-21 и подключение его к контроллеру ESP8266.

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

Описание

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

GY-21

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

 si7021

Для защиты чувствительного элемента от загрязнений микрочастицами пыли может применяться 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 сек

}

Прошиваем контроллер и открываем монитор порта.

Пример вывода в порт: