Содержание
Обзор датчика температуры и влажности GY-21
Модуль датчика влажности и температуры GY21 (рисунок 1) на основе датчика SHT21 представляет собой высокоточный модуль для измерения температуры и влажности. Обладает очень низкой погрешностей в своём классе: при измерении температуры она составляет - 0.4%, а влажности - 2% (см. рис. 2). Благодаря такой низкой погрешности и универсальному интерфейсу I2C данный модуль подходит для замеров температуры и влажности в промышленных помещениях.
Рисунок 1. Модуль датчика влажности и температуры GY21.
Рисунок 2. Погрешность измерений датчика влажности и температуры SHT21.
Технические характеристики GY-21
- Датчик : SHT21
- Интерфейс : I2C
- Диапазон рабочего напряжения датчика: 1,9 – 3,6 В
- Напряжение питания модуля: 5 В
- Потребляемый ток в режиме измерения: 300 μA
- Потребляемый ток в режиме ожидания: 0.15 μA
- Влажность: рабочий диапазон: от 0 до 100%. Точность измерения: ± 3% (макс), 0-80%
- Температура: рабочий диапазон: от -40 до +125 ° C. Точность измерения: ± 0,4 ° C (макс), от -10 до 85 ° C
- Заводская калибровка
- Встроенный детектор разряда батареи (выставляет флаг, если напряжение питания опускается ниже 2.25 В)
- Встроенный нагреватель для самодиагностики датчиков
Назначение выводов
- VIN – вход напряжения питания, от +4 до +6 В (номинально 5 В) постоянного тока
- GND – вход питания (общий)
- SCL – контакт синхронизации интерфейса I2C
- SDA – контакт данных интерфейса I2C
Подключение GY-21 к плате Arduino
Датчик работает по протоколу I2C. Подключение модуля к плате Arduino производим согласно таблице.
Схема соединений показана на рис. 3.
Рисунок 3. Схема соединений для подключения датчика SHT21
Для получения адреса датчика загрузим на плату Arduino скетч I2C-сканера (скачать test_i2c_uno.zip).
Адрес датчика фиксирован —0x40 (см. рис. 4). К шине I2C можно подключить только 1 датчик SHT21.
Рисунок 4. Сканер I2C устройств
Команды для управления SHT21
- 0xE3 — измерить температуру, линия SCL будет прижата к земле
- 0xE5 — измерить влажность, линия SCL будет прижата к земле
- 0xF3 — измерить температуру, линия SCL не прижата к земле
- 0xF5 — измерить влажность, линия SCL не прижата к земле
- 0xE6 — записать данные в пользовательский регистр
- 0xE7 — прочитать данные из пользовательского регистра
- 0xFE — перезагрузить датчик
Для получения данных будем использовать Arduino-библиотеку SHT21. Скетч для получения данных с датчика представлен в листинге 1.
Листинг 1.
#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, открываем монитор последовательного порта и наблюдаем вывод данных (см. рис. 5).
Рисунок 5. Вывод данных в монитор последовательного порта
Создадим проект вывода показаний с датчика SHT21 на светодиодную матрицу 8x32 c драйвером MAX7119.
- Плата Arduino Uno – 1 шт
- Плата прототипирования – 1 шт
- Модуль GY21 (датчик SHT21) – 1 шт
- Cветодиодная матрица 8x32 c драйвером MAX7119 – 1 шт
- Блок питания 5В 1А – 1 шт
- Провода
Схема соединения элементов показана на рис. 6.
Рисунок 6. Схема соединений для вывода данных с SHT21 на светодиодную матрицу.
Блок питания 5В используем для питания светодиодной матрицы. Содержимое скетча представлено в листинге 2. В скетче в массиве figure прописаны все цифры (0-9) и знаки пробел, % и °С.
Листинг 2
// подключение библиотек #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); }
Загружаем скетч на плату и видим попеременный вывод на матрицу значений влажности и температуры (рис. 7,8).
Рисунок 7,8. Схема в сборе.
Часто задаваемые вопросы
- Проверьте подано ли питание на модуль
- Проверьте правильность подключения контактов SDA и SCL
- Исключите попадание влаги на датчик
- Исключите попадание прямых солнечных лучей на датчик
- Уменьшите частоту получения данных с датчика до 1 сек