Модуль датчика влажности и температуры GY21 на основе датчика SHT21 представляет собой высокоточный модуль для измерения температуры и влажности. Обладает очень низкой погрешностей в своём классе: при измерении температуры она составляет - 0.4%, а влажности - 2% (см. рис. 2). Благодаря такой низкой погрешности и универсальному интерфейсу I2C данный модуль подходит для замеров температуры и влажности в промышленных помещениях.

Модуль датчика влажности и температуры GY21.

Модуль датчика влажности и температуры GY21.

Погрешность измерений датчика влажности и температуры SHT21.

Погрешность измерений датчика влажности и температуры SHT21.


Технические характеристики GY-21

Датчик : SHT21
Интерфейс : I2C
Диапазон рабочего напряжения датчика: 1,9 – 3,6 В
Напряжение питания модуля: 5 В
Потребляемый ток в режиме измерения: 300 μA
Потребляемый ток в режиме ожидания: 0.15 μA
Влажность:

  • Рабочий диапазон: от -40 до +125 ° C
  • Точность измерения: ± 0,4 ° C (макс), от -10 до 85 ° C
  • Рабочий диапазон: от 0 до 100%
  • Точность измерения: ± 3% (макс), 0-80%
Заводская калибровка
Встроенный детектор разряда батареи (выставляет флаг, если напряжение питания опускается ниже 2.25 В)
Встроенный нагреватель для самодиагностики датчиков 

Назначение выводов

VIN – вход напряжения питания, от +4 до +6 В (номинально 5 В) постоянного тока
GND – вход питания (общий)
SCL – контакт синхронизации интерфейса I2C
SDA – контакт данных интерфейса I2C     


Подключение GY-21 к плате Arduino 

Датчик работает по протоколу I2C. Подключение модуля к плате Arduino производим согласно таблице.

GY21

Arduino

VIN

+ 5 В

GND

GND

SCL

A5

SDA

A4

Схема соединений показана на рисунке ниже.

Схема соединений для подключения датчика SHT21

Схема соединений для подключения датчика SHT21

Для получения адреса датчика загрузим на плату Arduino скетч I2C-сканера (скачать test_i2c_uno.zip).

Адрес датчика фиксирован —0x40. К шине I2C можно подключить только 1 датчик SHT21. 

 Сканер I2C устройств

 Сканер I2C устройств

Команды для управления SHT21

  • 0xE3 — измерить температуру, линия SCL будет прижата к земле
  • 0xE5 — измерить влажность, линия SCL будет прижата к земле
  • 0xF3 — измерить температуру, линия SCL не прижата к земле
  • 0xF5 — измерить влажность,  линия SCL не прижата к земле
  • 0xE6 — записать данные в пользовательский регистр
  • 0xE7 — прочитать данные из пользовательского регистра
  • 0xFE — перезагрузить датчик

Для получения данных будем использовать Arduino-библиотеку SHT21. Скетч для получения данных с датчика представлен в листинге.


#include <Wire.h>
#include <SHT2x.h>  
void setup() {
Wire.begin();
Serial.begin(9600);
}  
void loop() {
Serial.print("Humidity(%RH): ");
Serial.print(SHT2x.GetHumidity());
Serial.print("     Temperature(C): ");
Serial.println(SHT2x.GetTemperature());
delay(1000);
}

Загружаем скетч на плату Arduino, открываем монитор последовательного порта и наблюдаем вывод данных.

Вывод данных в монитор последовательного порта 

Вывод данных в монитор последовательного порта 


Пример использования GY-21

Создадим проект вывода показаний с датчика SHT21 на светодиодную матрицу 8x32 c драйвером MAX7119.

Нам потребуются следующие компоненты

  • Плата Arduino Uno – 1
  • Плата прототипирования – 1
  • Модуль GY21 (датчик SHT21) – 1
  • Cветодиодная матрица 8x32 c драйвером MAX7119 – 1
  • Блок питания 5В 1А – 1
  • Провода

Схема соединения элементов показана на рисунке ниже.

Схема соединений для вывода данных с SHT21 на светодиодную матрицу.

Схема соединений для вывода данных с SHT21 на светодиодную матрицу.

Блок питания 5В используем для питания светодиодной матрицы. Содержимое скетча представлено в листинге. В скетче в массиве figure прописаны все цифры (0-9) и знаки пробел, % и °С.

// подключение библиотек
#include <Wire.h>
#include <SHT2x.h>
#include <SPI.h>
#include <MaxMatrix.h>
// создание объекта Matrix
MaxMatrix m(6,7,8,4);
// массив для вывода цифр (0-9) и знаков пробел, % и °С
byte figure[13][10]={
{8,8,                 //0
B00111110,
B01111111,
B01100011,
B01100011,
B01100011,
B01100011,
B01111111,
B00111110},
{8,8,                 //1
B00000011,
B00000111,
B00001011,
B00010011,
B00000011,
B00000011,
B00000011,
B00000011},
{8,8,               //2
B00111110,  
B01111111,
B00000111,
B00001110,
B00011100,
B00111000,
B01111111,
B01111111},
{8,8,                 //3
B01111111,
B01111111,
B00000011,
B01111111,
B01111111,
B00000011,
B01111111,
B01111111},
{8,8,                 //4
B01100011,
B01100011,
B01100011,
B01111111,
B01111111,
B00000011,
B00000011,
B00000011},
{8,8,                 //5
B01111111,
B01111111,
B01100000,
B01111111,
B01111111,
B00000011,
B01111111,
B01111111},
{8,8,                 //6
B01111111,
B01111111,
B01100000,
B01111111,
B01111111,
B01100011,
B01111111,
B01111111},
{8,8,                 //7
B01111111,
B01111111,
B00000111,
B00001110,
B00011100,
B00011000,
B00011000,
B00011000},
{8,8,                 //8
B01111111,
B01111111,
B01100011,
B01111111,
B01111111,
B01100011,
B01111111,
B01111111},
{8,8,                 //9
B01111111,
B01111111,
B01100011,
B01111111,
B01111111,
B00000011,
B01111111,
B01111111},
{8,8,                 //пробел
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000},
{8,8,                 // %
B10000000,
B01000110,
B00100110,
B00010000,
B00001000,
B01100100,
B01100010,
B00000001},
{8,8,                 // *C
B11000000,
B11000000,
B00001111,
B00010000,
B00010000,
B00010000,
B00010000,
B00001111},
};
void setup() {
Wire.begin();
Serial.begin(9600);
// инициализация матриц
delay(500);
m.init();
m.setIntensity(15);
// начальная картинка
m.writeSprite(24, 0, figure[12]);
m.writeSprite(16, 0, figure[11]);
m.writeSprite(8,0, figure[12]);
m.writeSprite(0, 0, figure[11]);
delay(5000);
}
void loop() {
// измерение влажности
int h=SHT2x.GetHumidity();
Serial.print("Humidity(%RH): ");
Serial.println(h);  
m.writeSprite(24, 0, figure[11]);
m.writeSprite(16, 0, figure[10]);
m.writeSprite(8,0, figure[h/10]);
m.writeSprite(0, 0, figure[h%10]);
delay(2000);
// измерение температуры
int t=SHT2x.GetTemperature();
Serial.print("     Temperature(C): ");
Serial.println(t);  
m.writeSprite(24, 0, figure[12]);
m.writeSprite(16, 0, figure[10]);
m.writeSprite(8,0, figure[t/10]);
m.writeSprite(0, 0, figure[t%10]);
delay(2000);
}

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

​​​​​​​

Схема в сборе.


Что делать если

Датчик не выдает показания

  • Проверьте подано ли питание на модуль
  • ​​​​​​​Проверьте правильность подключения контактов SDA и SCL

Датчик выдает неверные показания

  • Исключите попадание влаги на датчик
  • Исключите попадание прямых солнечных лучей на датчик
  • Уменьшите частоту получения данных с датчика до 1 сек

Рекомендуемые товары

Комментарии 0