Термостат для закваски держал 26 градусов по DHT22 — так я думал, пока не положил рядом медицинский термометр. Тот показывал 26,9. Девять десятых не согрели закваску, но объяснили, почему она подходила на полдня медленнее, чем у соседа по форуму: у DHT22 паспортный допуск плюс-минус полградуса, и мой экземпляр весь уходил в минус от правды. Разница пряталась не в показаниях, а в допуске: любые два DHT22 могут расходиться на целый градус, и у меня как раз лежал такой «счастливый» экземпляр. Для погодной станции на балконе это неважно, для термостата — целых полдня.
SHT31 от Sensirion с точностью ±0,2 °C закрывает разрыв. Здесь: подключение по четырём проводам с адресом 0x44, библиотека Adafruit_SHT31 с двумя нужными функциями, калибровка смещения против эталона и честное сравнение с DHT22 в цифрах — что полградуса и два процента влажности значат на практике, в термостате и рядом с ним. И сразу честная оговорка: паспорт — про допуск экземпляра, а не про гарантию правды, поэтому половина урока — про калибровку, а не про покупку.
Подключение: четыре провода и адрес 0x44
Модуль SHT31 — четыре вывода: питание, земля, SDA и SCL на A4/A5, как у всех остальных жителей шины. Подтяжки на модуль уже напаяны — номиналы подтяжек и когда нужны вторые я разбирал отдельно, здесь ничего допаивать не надо. Диапазон питания у сенсора широкий, от 2,4 до 5,5 В, поэтому прямой контакт с пятёркой Uno — штатный режим без стабилизаторов и делителей. Адрес заводской — 0x44; если припаять вывод ADDR к питанию, чип переедет на 0x45, и на одной шине уживутся два SHT31 — механика конфликтов адресов описана в отдельном уроке. На многих модулях есть светодиод обмена — по нему видно, жив ли сенсор, ещё до всякого Serial.
#include <Wire.h>#include "Adafruit_SHT31.h" Adafruit_SHT31 sht31 = Adafruit_SHT31(); const float SMESCHENIE = -0.4; // против эталонного термометра void setup() { Serial.begin(9600); if (!sht31.begin(0x44)) { // ADDR на земле: 0x44, на питании: 0x45 Serial.println("SHT31 ne otvechaet na 0x44"); while (true) {} }} void loop() { float t = sht31.readTemperature(); float h = sht31.readHumidity(); if (isnan(t) || isnan(h)) { // сенсор не ответил Serial.println("chto-to ne tak: nan"); delay(2000); return; } Serial.print("t="); Serial.print(t + SMESCHENIE, 2); Serial.print(" C RH="); Serial.print(h, 1); Serial.println(" %"); delay(2000);}Паспортные ±0,2 °C — это допуск от экземпляра к экземпляру, а не гарантия, что ваш покажет правду. Мой показывал плюс 0,4 к реальности, и я это число вычел. Метод: эталонный термометр рядом, сквозняки закрыты, минут десять на выравнивание температур, среднее из чтений против эталона — разница и есть смещение. Эталон выбирайте по задаче: для окна 18-26 °C хватает одной пары «эталон против показаний» при стабильной температуре, точки льда и кипения — для задач с широким диапазоном. Константа SMESCHENIE живёт в скетче и применяется к каждому чтению. Если плат несколько, храните смещения в энергонезависимой памяти: перепрошивка не должна обесценивать полчаса калибровки.
SHT31 против DHT22 в цифрах
| Параметр | SHT31 | DHT22 |
|---|---|---|
| Точность по температуре | ±0,2 °C (0-65 °C) | ±0,5 °C |
| Точность по влажности | ±2 %RH (10-90 %RH) | ±2-5 %RH |
| Разрешение | 0,01 °C / 0,01 %RH | 0,1 °C / 0,1 %RH |
| Интерфейс и темп | I2C, готовая пара за 15 мс | однопроводной протокол, опрос раз в 2 с |
Теперь практический смысл этих цифр. Термостат с гистерезисом ±0,5 °C поверх DHT22 гуляет уже на градус: полградуса допуска сенсора складываются с полградусом гистерезиса, и реальная температура в коробке ходит от 25,5 до 26,5 при настройке «26 ровно». С SHT31 тот же гистерезис отдаёт 25,8-26,2 — втрое уже. По влажности арифметика такая: ±2 %RH значит, что два честных SHT31 расходятся максимум на четыре процента в худшем случае, а пара DHT22 с допуском ±5 — на десять. Как собрать сам термостат с реле, я показывал в проекте инкубатора, а выбор между DHT11 и DHT22 остаётся правильным, когда бюджет важнее десятых градуса. Для сравнения: у барометра BMP280, соседа по шине, температурный паспорт вообще ±1 °C — там температура побочная, для компенсации давления, о чём я писал в уроке про BMP280. Свежее поколение Sensirion — SHT40: тот же класс по градусам, ±1,8 %RH по влажности, дешевле и в корпусе поменьше, библиотека та же с точностью до имени.
Ещё два довода не про точность. Первый — протокол: SHT31 говорит по I2C и отдаёт готовую пару за 15 мс, когда DHT22 требует собственный однопроводной формат, блокирует скетч на 4-5 мс при каждом чтении и не даёт опрашивать себя чаще раза в две секунды. Пятнадцать миллисекунд на весь цикл — это две транзакции по шине, пара сотен байтов в секунду, соседи даже не заметят. На шине SHT31 живёт рядом с экраном и часами без единого лишнего провода. Второй довод — рынок: DHT22 — самая подделываемая деталь стартовых наборов, клоны с точностью «как повезёт» продают под видом оригинала; как отличить подделку DHT22 — отдельная тема, а у SHT31 честность на прилавках пока держится лучше.
Последняя практическая деталь — первые секунды жизни сенсора. После подачи питания SHT31 готов не сразу: первому чтению дайте секунду-другую, иначе получите либо нули, либо число с прошлого включения. В скетче я ставлю первый замер через delay(2000) после begin и дальше живу по миллис-расписанию. И не требуйте от сенсора мгновенной реакции на дуновение: скорость отзыва на влажность у любого ёмкостного чипа — секунды, а не миллисекунды, поэтому опрос чаще раза в секунду даёт те же цифры, что раз в две.
- Сканер шины видит 0x44 — иначе проверяйте ADDR и провода.
- Первое чтение даёт разумные 15-45 °C и 20-90 %, не нули и не 99.
- Нагреватель на пять секунд поднимает показания — чип живой.
- Сравнение с DHT22 бок о бок расходится меньше чем на градус.
- Смещение против эталона записано константой, а не в памяти о вчерашнем замере.
- 1. На каком адресе найдёт SHT31 сканер шины, если вывод ADDR сидит на земле?
- 2. Паспортная точность SHT31 по температуре в диапазоне 0-65 °C — ?
- 3. Чем паспорт по влажности у DHT22 качественно отличается от SHT31?
- 4. Почему в термостате точность датчика критична для размаха температуры?
- 5. Что даст включение встроенного нагревателя SHT31 на пару секунд?
- SHT31 отвечает на 0x44 (ADDR на земле) или 0x45 (ADDR на питании); питание 2,4-5,5 В — на Uno напрямую.
- Точность ±0,2 °C и ±2 %RH против ±0,5 °C и ±2-5 %RH у DHT22; разрешение 0,01 против 0,1.
- Паспорт — допуск экземпляра: смещение против эталона калибруется и живёт константой в скетче.
- Опрос каждые 15 мс по I2C против однопроводного протокола DHT22 с паузой в две секунды.
- Нагреватель внутри чипа — тест живости и сушка конденсата одним вызовом sht31.heater().
Частые вопросы по теме урока
- На каком адресе найдёт SHT31 сканер шины, если вывод ADDR сидит на земле?
- Заводской адрес 0x44. Подтянув ADDR к питанию, вы переводите чип на 0x45 — так на одной шине живут два SHT31. 0x44
- Паспортная точность SHT31 по температуре в диапазоне 0-65 °C — ?
- Sensirion обещает ±0,2 °C в рабочем окне 0-65 °C — вдвое лучше допуска DHT22. Полградуса, как у DHT22, у SHT31 не бывает, а ±0,05 °C — это уже лабораторные платиновые резисторы за другие деньги. ±0,2 °C
- Чем паспорт по влажности у DHT22 качественно отличается от SHT31?
- У DHT22 производитель заявляет допуск от ±2 до ±5 %RH — лотерея между экземплярами. У SHT31 полка одна: ±2 %RH в окне 10-90 %RH, поэтому в проекте с двумя сенсорами показания не разъезжаются. У DHT22 разброс допуска шире: от ±2 до ±5 %RH против ±2 у SHT31
- Почему в термостате точность датчика критична для размаха температуры?
- Гистерезис ±0,5 °C поверх допуска ±0,5 °C даёт реальную прогулку около градуса: полградуса врёт датчик, полградуса заложены в логику. С SHT31 вклад допуска падает до 0,2 °C — размах сжимается втрое. Термостат от неточного датчика ломается электрически
- Что даст включение встроенного нагревателя SHT31 на пару секунд?
- Нагреватель внутри чипа управляется методом heater(): показания должны заметно подскочить и вернуться после выключения. Если не подскочили — сенсор мёртв, залит конденсатом или подделка. Живой тест: температура обязана подскочить на градус-полтора