Недорогой, простой в использовании, высокоточный цифровой датчик влажности и температуры.
Характеристики датчика:
- Диапазон измерения температуры: от -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.5 | 3.0 | 3.6 | В |
Потребление в режиме измерения | 300 | 450 | 500 | μA |
Потребление в спящем режиме. | | 0.02 | 2.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 и Код на С:
.