Модуль HTU21D IIC/I2C представляет собой цифровой датчик температуры и влажности, который может быть легко интегрирован в различные проекты и системы благодаря простому интерфейсу I2C.
Основные технические характеристики модуля:
- Диапазон измерения температуры: от -40°C до +125°C
- Диапазон измерения влажности: от 0% до 100%
- Точность измерения температуры: ±0.3°C
- Точность измерения влажности: ±3%
- Напряжение питания: от 2.1 до 3.6 В
- Интерфейс связи: I2C
- Адрес датчика: 0x40
Для работы с модулем необходимо подключить его к микроконтроллеру по интерфейсу I2C. Ниже приведен пример кода на языке Arduino, который демонстрирует чтение данных с датчика и вывод их на серийный порт:
#include <Wire.h>
#define HTU21D_ADDRESS 0x40
void setup()
{
Serial.begin(9600);
Wire.begin();
}
void loop()
{
float temperature, humidity;
// Запросить измерение температуры
Wire.beginTransmission(HTU21D_ADDRESS);
Wire.write(0xF3);
Wire.endTransmission();
delay(50);
// Прочитать данные о температуре
Wire.requestFrom(HTU21D_ADDRESS, 2);
temperature = Wire.read() << 8 | Wire.read();
temperature = -46.85 + (175.72 * temperature / 65536);
// Запросить измерение влажности
Wire.beginTransmission(HTU21D_ADDRESS);
Wire.write(0xF5);
Wire.endTransmission();
delay(50);
// Прочитать данные о влажности
Wire.requestFrom(HTU21D_ADDRESS, 2);
humidity = Wire.read() << 8 | Wire.read();
humidity = -6 + (125 * humidity / 65536);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
delay(1000);
}
В этом примере мы используем библиотеку Wire для управления шиной I2C и чтения данных с датчика. Сначала мы отправляем запрос на измерение температуры, затем считываем данные о температуре и преобразуем их в соответствующие единицы измерения. Аналогично мы запрашиваем и считываем данные о влажности.
Полученные данные выводятся на серийный порт в цикле loop() с помощью функции Serial.print(). Кроме того, данные могут быть использованы для различных задач, таких как автоматический контроль климата в комнате или в теплице, а также для мониторинга погодных условий.
Для работы с модулем HTU21D на esp8266 нужно подключить его к шине I2C, как мы это делали ранее с другими I2C-модулями. Вот пример кода, который демонстрирует чтение данных с HTU21D и вывод их на серийный порт:
#include <Wire.h>
#define HTU21D_ADDRESS 0x40
void setup() {
Serial.begin(9600);
Wire.begin();
}
void loop() {
// Запросить измерение температуры
Wire.beginTransmission(HTU21D_ADDRESS);
Wire.write(0xF3);
Wire.endTransmission();
// Ждем 50 мс, чтобы получить результат
delay(50);
// Читаем 2 байта данных
Wire.requestFrom(HTU21D_ADDRESS, 2);
byte msb = Wire.read();
byte lsb = Wire.read();
// Преобразуем данные в градусы Цельсия
int16_t rawTemp = (msb << 8) | lsb;
float temp = -46.85 + 175.72 / 65536.0 * (float)rawTemp;
// Выводим результат на серийный порт
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" C");
// Запросить измерение влажности
Wire.beginTransmission(HTU21D_ADDRESS);
Wire.write(0xF5);
Wire.endTransmission();
// Ждем 50 мс, чтобы получить результат
delay(50);
// Читаем 2 байта данных
Wire.requestFrom(HTU21D_ADDRESS, 2);
msb = Wire.read();
lsb = Wire.read();
// Преобразуем данные в проценты влажности
int16_t rawHumidity = (msb << 8) | lsb;
float humidity = -6 + 125 / 65536.0 * (float)rawHumidity;
// Выводим результат на серийный порт
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
delay(1000); // Ждем 1 секунду перед следующим измерением
}
В данном коде мы используем библиотеку Wire для работы с шиной I2C и функцию delay() для задержки между запросами. Для получения температуры и влажности мы отправляем соответствующие команды на модуль HTU21D, затем ждем 50 мс для получения результата и читаем 2 байта данных. Далее мы преобразуем полученные данные в градусы Цельсия и проценты влажности, соответствующим образом:
// Преобразование данных температуры
float t = (data[0] * 256.0) + data[1];
t = ((-46.85 + (175.72 * t / 65536.0)) - 0.1);
// Преобразование данных влажности
float h = (data[2] * 256.0) + data[3];
h = ((-6.0 + (125.0 * h / 65536.0)) - 0.1);
Здесь мы используем формулы из даташита для преобразования данных температуры и влажности из двухбайтового формата в градусы Цельсия и проценты влажности соответственно. Обратите внимание, что значения -0.1 добавляются для компенсации неточностей измерений.
Затем мы выводим преобразованные данные на серийный порт:
// Вывод преобразованных данных на серийный порт
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" C, Humidity: ");
Serial.print(h);
Serial.println(" %");
Этот код выводит значения температуры и влажности на серийный порт в формате “Temperature: XX C, Humidity: XX %”. Можно изменить формат вывода, добавить другие данные или передавать их по интерфейсу UART для дальнейшей обработки.
Важно отметить, что датчик HTU21D может работать в режиме низкого энергопотребления, который позволяет уменьшить потребление энергии и продлить время работы от батарейного питания. Для этого необходимо использовать команду перевода датчика в спящий режим и настройку периода ожидания. Как правило, в библиотеках для работы с датчиком уже есть функции для работы в этом режиме.