Подключение датчика температуры и влажности SHT31 к Arduino
Хотите вести учёт климата в теплице, создать систему управления хьюмидором или отслеживать данные о температуре и влажности для метеостанции? Датчик температуры и влажности SHT31 может стать правильным выбором для вас!
Датчик SHT31 откалиброван на заводе и не требует внешних компонентов для работы. Поэтому с помощью всего нескольких подключений и кода Arduino вы сможете сразу начать измерять относительную влажность и температуру.
Обзор оборудования
Модуль содержит недорогой, простой в использовании, высокоточный цифровой датчик температуры и влажности от Sensirion — SHT31.
Компактные размеры модуля позволяют использовать его практически для чего угодно: термостатов, регуляторов влажности, комнатных метеостанций и подобных устройств для мониторинга или управления влажностью и/или температурой.
Датчик SHT31 способен измерять влажность во всём диапазоне от 0 до 100% RH с типичной точностью ±2% в диапазоне от 20% до 80% RH (разрешение 0,01% RH).
Максимальный диапазон температур SHT31 составляет от -40 до 125°C. Типичная точность — ±0,3°C при 25°C (разрешение 0,015°C).
Внимание:
Датчик SHT31 имеет небольшое окошко, открывающее полимерную плёнку, отвечающую за измерение температуры и влажности. Рекомендуется не допускать попадания жидкостей, пыли или других загрязнений на неё, так как это может повлиять на точность датчика.
Требования к питанию
Сам датчик использует напряжение от 2,4В до 5,5В, что делает этот модуль совместимым как с 3В, так и с 5В. Поэтому вы можете использовать его с вашим любимым микроконтроллером на 3,3В или 5В без каких-либо опасений.
SHT31 потребляет менее 0,8 мА во время измерений и менее 0,2 мкА в режиме однократного измерения (без измерений). Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием, таких как мобильные телефоны, носимые устройства или смарт-часы.
Интерфейс I2C
SHT31 — это I2C-датчик, что означает, что он использует две линии данных/тактового сигнала I2C, доступные на большинстве микроконтроллеров, и может разделять эти контакты с другими I2C-датчиками, если у них нет конфликта адресов.
Датчик поддерживает два различных I2C-адреса: 0x44Hex и 0x45Hex. Это позволяет использовать два модуля SHT31 на одной шине или избежать конфликта адресов с другим устройством на шине.
Вывод AD определяет I2C-адрес модуля. Этот вывод имеет встроенный подтягивающий к земле резистор. Поэтому, если оставить вывод AD неподключённым, I2C-адрес по умолчанию будет 0x44Hex, а при подключении к высокому уровню сигнала I2C-адрес станет 0x45Hex.
Режим оповещения
SHT31 имеет вывод оповещения (AL), который может срабатывать, когда условия окружающей среды (влажность и/или температура) превышают заданные пользователем пределы. Это позволяет выполнять измерения по прерываниям вместо циклического опроса, давая микроконтроллеру возможность выполнять другие задачи, пока датчик собирает данные.
Когда влажность и/или температура превышают верхний предел, вывод Alert переходит в HIGH и остаётся в HIGH, пока температура не опустится ниже порога сброса. Аналогично, когда влажность и/или температура выходят за нижний предел, вывод Alert переходит в HIGH и остаётся в HIGH, пока температура не поднимется выше порога сброса.
На изображении ниже показаны различные пределы для режима оповещения.
Подробнее можно прочитать в отдельном `руководстве по применению `_.
Технические характеристики
Вот полные характеристики:
Для получения дополнительной информации обратитесь к даташиту ниже.
Распиновка модуля SHT31
Рассмотрим распиновку.
VCC — вывод питания. Поскольку датчик использует напряжение 2,4-5,5В, подайте на него то же напряжение, что и логический уровень вашего микроконтроллера — например, для микроконтроллера на 5В, такого как Arduino, используйте 5В.
GND — общий контакт земли для питания и логики.
SCL — вывод тактового сигнала I2C, подключается к линии тактового сигнала I2C вашего микроконтроллера.
SDA — вывод данных I2C, подключается к линии данных I2C вашего микроконтроллера.
AD — вывод определяет I2C-адрес модуля. Если оставить AD неподключённым, I2C-адрес по умолчанию — 0x44Hex, при подключении к высокому уровню — 0x45Hex.
AL — вывод срабатывает, когда условия окружающей среды (влажность и/или температура) превышают заданные пользователем пределы.
Подключение модуля SHT31 к Arduino
Подключение датчика SHT31 очень простое!
Необходимо подключить всего четыре контакта, чтобы начать использовать датчик. Один для VCC, один для GND и две линии данных для связи по I2C.
Подключите вывод SCL к контакту тактового сигнала I2C, а вывод SDA — к контакту данных I2C на Arduino. Обратите внимание, что у каждой платы Arduino контакты I2C расположены по-разному и должны быть подключены соответствующим образом. На платах Arduino с компоновкой R3 контакты SDA (линия данных) и SCL (тактовая линия) расположены на разъёмах рядом с контактом AREF. Они также известны как A5 (SCL) и A4 (SDA).
На следующей иллюстрации показана схема подключения.
Установка библиотеки
Для запуска датчика необходимо установить библиотеку `Adafruit SHT31 `_. Она доступна в менеджере библиотек Arduino.
Для установки библиотеки перейдите в Sketch > Include Library > Manage Libraries… Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Отфильтруйте поиск, введя „SHT31“, и установите библиотеку.
Библиотека Adafruit_SHT31 внутренне использует вспомогательную библиотеку `Adafruit Bus IO `_ для абстрагирования транзакций I2C и SPI и работы с регистрами. Поэтому найдите в менеджере библиотек adafruit bus и установите её тоже.
Код Arduino — Считывание температуры и влажности
Ниже приведён базовый скетч Arduino. Загрузите его в Arduino, и вы увидите текущую температуру и влажность в вашей комнате!
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
Serial.begin(9600);
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate I2C address
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
}
void loop() {
float t = sht31.readTemperature();
float h = sht31.readHumidity();
if (! isnan(t)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
} else {
Serial.println("Failed to read temperature");
}
if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
} else {
Serial.println("Failed to read humidity");
}
delay(1000);
}
После загрузки кода откройте последовательный терминал на скорости 9600 бод. Вы должны увидеть что-то похожее на вывод, показанный ниже. Попробуйте подышать на датчик, чтобы увидеть изменение значений влажности и температуры!
Пояснение к коду:
Код достаточно прост. В начале подключаются библиотеки Arduino.h, Wire.h и Adafruit_SHT31.h, и в глобальной области видимости создаётся объект Adafruit_SHT31.
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
В setup мы инициализируем последовательную связь с ПК и вызываем функцию begin().
Функция begin(<address>) инициализирует датчик, где <address> — I2C-адрес датчика. По умолчанию он равен 0x44Hex, вы также можете настроить датчик на 0x45Hex и передать это значение. Эта функция возвращает True, если датчик найден и ответил корректно, и False, если не найден.
void setup() {
Serial.begin(9600);
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate I2C address
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
}
После инициализации вы можете обращаться к методам объекта (sht31) через оператор точки.
sht31.readTemperature() возвращает показание температуры в °C в формате числа с плавающей запятой (целая + дробная часть). Для перевода в градусы Фаренгейта умножьте на 1,8 и прибавьте 32.
sht31.readHumidity() возвращает показание влажности, также в формате числа с плавающей запятой от 0 до 100 (это показание в % влажности).
void loop() {
float t = sht31.readTemperature();
float h = sht31.readHumidity();
if (! isnan(t)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
} else {
Serial.println("Failed to read temperature");
}
if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
} else {
Serial.println("Failed to read humidity");
}
delay(1000);
}