Датчик температуры и влажности HTU21D

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

Характеристики датчика:

  • Диапазон измерения температуры: от -40 до +125 °C
  • Диапазон измерения влажности: от 0 до 100% RH
  • Связь: I²C. адрес 0x40.
  • Разрешение: 14 Bit.
  • Точность относительной влажности ±2% (типичная)
  • Точность измерения температуры ±0,3 °C (типичная)
  • Встроенный детектор разряда батареи (флаг, если напряжение питания опускается ниже 2.25 В)
  • Встроенный нагреватель для самодиагностики: 5.5mW/ΔT=+0.5-1.5°C

Электрические параметры:

Параметр:мин.тип.макс.
Напряжение питания1.53.03.6В
Потребление в режиме измерения300450500μA
Потребление в спящем режиме.0.022.0μA

Что нужно знать:

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


Разновидности модулей:

Модуль от SparkFun и его клоны (HW-220):

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

GY-21:

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

Схема:


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

Можно подключать так, работать будет, но лучше подключить через конвертер логических уровней. Модуль от SparkFun оптимально использовать с 3.3 вольтовой логикой, платами с ESP например.

Для плат Arduino, лучше использовать модуль GY-21, питание модуля 5 вольт.


Софт:

Библиотеки есть и их много:

Доступны через менеджер библиотек Arduino IDE

Без библиотек:

#include <Wire.h>

const int htu21_addr = 0x40; // адрес датчика htu21d

void setup() {
  Serial.begin(9600);
  Wire.begin(); // инициализация i2c
}

void loop() {
  ReadTemperature();  
  ReadHumidity();
  delay(1000);
}

// Читает с датчика HTU21D температуру и выводит в COM-порт.
void ReadTemperature() {
  Wire.beginTransmission(htu21_addr); // начинаем общение с датчиком
  Wire.write(0xF3); // записываем команду на измерение температуры
  Wire.endTransmission(); // окончание передачи

  delay(100); // ждём готовности данных
  Wire.requestFrom(htu21_addr, 3); // запрашиваем 3 байта  

  int Stemp; // "сырые" данные температуры
  while (Wire.available()) { 
    int tmsb = Wire.read(); // читаем MSB температуры с датчика
    int tlsb = Wire.read() & 0xFC; // читаем LSB температуры с датчика и сбрасываем 2 младших бита
    int crc = Wire.read(); // читаем котрольную сумму    
    Stemp = tmsb * 256 + tlsb; // вычисляем значение Stemp
    // *256 это эквивалентно сдвигу на 8 бит влево: <<8 
    //Serial.println(Stemp, HEX);
  }
  double t = ConvertTemp(Stemp); // вычисляем температуру
  Serial.println("T = " + (String)t + "C"); // Выводим данные в COM-порт
}

// Преобразует температуру из "сырых" показаний датчика HTU21D в градусы Цельсия.
double ConvertTemp(int stemp){
  double t = stemp * 0.00268127 - 46.85; // 0.00268127 = 175.72/0x10000
  return t;
}

// Читает с датчика HTU21D относительную влажность и выводит в COM-порт.
void ReadHumidity() {
  Wire.beginTransmission(htu21_addr); // начинаем общение с датчиком
  Wire.write(0xF5); // записываем команду на измерение влажности
  Wire.endTransmission(); // окончание передачи

  delay(100); // ждём готовности данных
  Wire.requestFrom(htu21_addr, 3); // запрашиваем 3 байта  

  int Srh; // "сырые" данные влажности
  while (Wire.available()) { 
    int rmsb = Wire.read(); // читаем MSB влажность с датчика
    int rlsb = Wire.read() & 0xFC; // читаем LSB влажности с датчика и сбрасываем 2 младших бита
    int crc = Wire.read(); // читаем котрольную сумму
    Srh = rmsb * 256 + rlsb ; // вычисляем значение Srh
    //Serial.println(Srh, HEX);
  }
  double rh = ConvertRH(Srh); // вычисляем влажность
  Serial.println("RH = " + (String)rh + "%"); // Выводим данные в COM-порт
}

// Преобразует влажность из "сырых" показаний датчика HTU21D в проценты.
double ConvertRH(int srh) {
  double rh = srh * 0.0019073 - 6; // 0.0019073 = 125/0x10000
  return rh;
}

STM8 и Код на С:

.



Видео: