Модуль GY-21 (SHT21): температура и влажность по шине I2C

Характеристики модуля GY-21, назначение выводов, команды датчика SHT21, чтение данных библиотекой SHT2x и вывод показаний на светодиодную матрицу.
Особенности модуля
GY-21 — модуль для измерения температуры и относительной влажности, построенный на датчике SHT21. В своём классе он отличается малой погрешностью, а благодаря интерфейсу I2C легко подключается к любому контроллеру. Такое сочетание позволяет применять его в том числе для контроля микроклимата в производственных помещениях. Датчик откалиброван на заводе, имеет встроенный нагреватель для самодиагностики и детектор разряда батареи, который выставляет флаг при падении напряжения питания ниже 2,25 В.


| Датчик | SHT21 |
| Интерфейс | I2C |
| Рабочее напряжение датчика | 1,9–3,6 В |
| Напряжение питания модуля | 5 В |
| Ток при измерении | 300 мкА |
| Ток в режиме ожидания | 0,15 мкА |
| Диапазон влажности | 0–100 % |
| Точность по влажности | ±3 % (макс.) в диапазоне 0–80 % |
| Диапазон температур | от -40 до +125 °C |
| Точность по температуре | ±0,4 °C (макс.) от -10 до +85 °C |
| Адрес I2C | 0x40 (фиксированный) |
Выводы и подключение
На плате четыре контакта:
- VIN — питание от +4 до +6 В постоянного тока, номинально 5 В;
- GND — общий провод;
- SCL — линия синхронизации I2C;
- SDA — линия данных I2C.


Адрес датчика можно проверить скетчем I2C-сканера: он показывает 0x40. Адрес не изменяется, поэтому на одной шине I2C может работать только один SHT21.
Команды SHT21
Датчик понимает небольшой набор команд:
- 0xE3 — измерить температуру, линия SCL на время измерения удерживается у земли;
- 0xE5 — измерить влажность, SCL удерживается у земли;
- 0xF3 — измерить температуру без удержания SCL;
- 0xF5 — измерить влажность без удержания SCL;
- 0xE6 — запись в пользовательский регистр;
- 0xE7 — чтение пользовательского регистра;
- 0xFE — перезагрузка датчика.
Чтение данных из скетча
На практике напрямую посылать команды не обязательно: существует Arduino-библиотека для SHT21, подключаемая заголовком SHT2x.h вместе с Wire.h. В setup достаточно вызвать Wire.begin() и открыть последовательный порт на 9600, а в цикле раз в секунду печатать результаты функций SHT2x.GetHumidity() и SHT2x.GetTemperature(). В мониторе порта появляются строки с влажностью в %RH и температурой в градусах Цельсия.
Пример: показания на светодиодной матрице
Более наглядный вариант — вывод значений на светодиодную матрицу 8x32. Для сборки нужны:
- Arduino Uno;
- макетная плата;
- модуль GY-21;
- светодиодная матрица 8x32 с драйвером;
- блок питания 5 В, 1 А;
- провода.
Отдельный блок питания 5 В нужен для самой матрицы. Скетч использует библиотеки Wire, SHT2x, SPI и MaxMatrix; объект матрицы создаётся строкой MaxMatrix m(6,7,8,4). В программе описан массив из 13 символов размером 8x8 точек: цифры от 0 до 9, пробел, знак процента и значок градуса Цельсия. После инициализации устанавливается максимальная яркость (m.setIntensity(15)) и на пять секунд показывается заставка.
В основном цикле программа измеряет влажность, приводит её к целому числу и функцией writeSprite выводит десятки, единицы и знак процента. Через две секунды то же самое происходит с температурой и значком °C. В результате на матрице попеременно отображаются оба параметра, а в монитор порта параллельно идут те же значения.
Возможные неполадки
Если датчик не выдаёт показаний, проверяют наличие питания на модуле и правильность подключения линий SDA и SCL. При неверных показаниях исключают попадание на датчик влаги и прямых солнечных лучей, а также снижают частоту опроса до одного раза в секунду.