Лёгкая библиотека для датчика температуры и влажности HTU21D
- Асинхронное чтение
- Блокирующее чтение
- Установка разрешения
- Проверка напряжения
- Управление нагревателем
Совместима со всеми Arduino платформами (используются Arduino-функции)
- Библиотеку можно найти по названию GyverHTU21D и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
GyverHTU21D htu;
bool begin(); // запуск и проверка наличия датчика
void setHeater(bool state); // Включение / выключение подогрева
bool powerGood(); // Состояние питания
void setResolution(uint8_t mode); // Установка разрешения
// Разрешение:
HTU21D_RES_HIGH // Высокое разрешение (см. таблицу ниже) - по умолчанию
HTU21D_RES_MEDIUM // Среднее разрешение (см. таблицу ниже)
HTU21D_RES_LOW // Низкое разрешение (см. таблицу ниже)
bool readTick(uint16_t prd = 100); // асинхронный тикер чтения, true если готово. Можно указать свой период. По умолч. 100 мс
bool requestTemperature(); // Запросить температуру (true если успешно)
bool requestHumidity(); // Запросить влажность (true если успешно)
bool readTemperature(); // Прочитать температуру (true если успешно)
bool readHumidity(); // Прочитать влажность (true если успешно)
float getTemperature(); // Получить температуру
float getHumidity(); // Получить влажность
float getTemperatureWait(); // прочитать температуру (блокирующая функция)
float getHumidityWait(); // прочитать флажность (блокирующая функция)
Режим | Разрешение, темп. | Разрешение, влажн. | Время чтения, темп. | Время чтения, влажн. |
---|---|---|---|---|
HTU21D_RES_LOW | 12 bit | 8 bit | 13 ms | 3 ms |
HTU21D_RES_MEDIUM | 11 bit | 11 bit | 4 ms | 8 ms |
HTU21D_RES_HIGH | 14 bit | 12 bit | 50 ms | 16 ms |
Значения можно просто получить из getTemperatureWait()
и getHumidityWait()
. Функции выполняются время, указанное в таблице выше.
Режим асинхронного чтения позволяет не ждать преобразование и вернуться к опросу позже, не блокируя программу. В этом режиме нужно запросить чтение, подождать время согласно разрешению, а затем прочитать значение. Запросить можно только одну измеряемую величину за раз: запросили температуру - прочитали температуру. Запросили влажность - прочитали влажность. Запросить сразу и то и то нельзя!
- Запросить измерение: вызвать
requestTemperature()
илиreadTemperature()
. Вернётtrue
при успешном запросе. - Прочитать измерение:
readTemperature()
илиreadHumidity()
. Вернётtrue
при успешном чтении. - Получить результат:
getTemperature()
илиgetHumidity()
.
В этом режиме библиотека сама опрашивает и читает датчик по встроенному таймеру, остаётся только забрать результат.
Просто в цикле вызываем readTick()
или readTick(свой период в мс)
. Если функция вернула true
- данные обновились.
#include <GyverHTU21D.h>
GyverHTU21D htu;
void setup() {
Serial.begin(9600);
if (!htu.begin()) Serial.println(F("HTU21D error"));
}
void loop() {
// время выполнения зависит от разрешения, см. доку
float temp = htu.getTemperatureWait();
float hum = htu.getHumidityWait();
Serial.print("Temp: ");
Serial.print(temp);
Serial.println(" *C");
Serial.print("Hum: ");
Serial.print(hum);
Serial.println(" %");
Serial.println();
delay(1000);
}
#include <GyverHTU21D.h>
GyverHTU21D htu;
void setup() {
Serial.begin(9600);
if (!htu.begin()) Serial.println(F("HTU21D error"));
}
void loop() {
// Читаем температуру
htu.requestTemperature(); // Запрашиваем преобразование
delay(100); // Ждем окончания (см. доку)
if (htu.readTemperature()) { // Читаем температуру из датчика и проверяем
Serial.print("Temp: ");
Serial.print(htu.getTemperature()); // В случае успеха выводим температуру в порт
Serial.println(" *C");
}
// Читаем влажность
htu.requestHumidity(); // Запрашиваем преобразование
delay(100); // Ждем окончания (см. доку)
if (htu.readHumidity()) { // Читаем влажность из датчика и проверяем
Serial.print("Hum: ");
Serial.print(htu.getHumidity()); // В случае успеха выводим влажность в порт
Serial.println(" %");
}
Serial.println();
delay(1000);
}
#include <GyverHTU21D.h>
GyverHTU21D htu;
void setup() {
Serial.begin(9600);
if (!htu.begin()) Serial.println(F("HTU21D error"));
}
void loop() {
// функция опрашивает датчик по своему таймеру
if (htu.readTick()) {
// можно забирать значения здесь или в другом месте в программе
Serial.println(htu.getTemperature());
Serial.println(htu.getHumidity());
Serial.println();
}
}
- v1.0
- v1.1 - совместимость esp8266
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код