Как подключить датчик температуры DHT11, DHT22 или DS18B20
Общие шаги для любого из датчиков:
- Подключите датчик: питание,
GNDи провод данных к цифровому выводу (в примерах — вывод 2). - Поставьте библиотеку через Sketch → Include Library → Manage Libraries… (как — в справке Как установить библиотеку).
- Откройте пример библиотеки (File → Examples → имя библиотеки) или скетч ниже, загрузите и смотрите температуру в мониторе порта на скорости 9600.
Какой выбрать
| Датчик | Что измеряет | Диапазон | Точность | Особенности |
|---|---|---|---|---|
| DHT11 | температура и влажность | 0…50 °C | ±2 °C | недорогой, опрос не чаще раза в секунду |
| DHT22 (AM2302) | температура и влажность | −40…80 °C | ±0,5 °C | опрос не чаще раза в 2 секунды |
| DS18B20 | только температура | −55…125 °C | ±0,5 °C в диапазоне −10…85 °C | бывает в герметичной гильзе на проводе, несколько датчиков на одном проводе |
Подключение и скетч
Подключение и скетч зависят от датчика — его модель написана на модуле или в описании товара.
DHT11 и DHT22
Подключение модуля: VCC (или +) → 5V, GND (или −) → GND, DATA (или OUT) → вывод 2. Голому датчику с четырьмя ножками нужен ещё резистор 10 кОм между DATA и VCC; на модулях он обычно уже стоит.
Библиотека: DHT sensor library от Adafruit, вместе с ней — Adafruit Unified Sensor (IDE предложит поставить её сама).
#include <DHT.h>
DHT dht(2, DHT11); // вывод 2; для DHT22 — DHT22
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Ошибка чтения DHT");
return;
}
Serial.print(t);
Serial.print(" °C, ");
Serial.print(h);
Serial.println(" %");
}Если в мониторе только «Ошибка чтения DHT» (в примере библиотеки — Failed to read from DHT sensor!):
- провод
DATAне на том выводе, что в скетче, или перепутаныVCCиGND; - выбран не тот тип: DHT11 в скетче, а датчик DHT22, или наоборот;
- голый датчик без резистора 10 кОм;
- опрос чаще, чем датчик успевает измерять.
DS18B20
Подключение: VCC → 5V, GND → GND, DATA → вывод 2, и обязательно резистор 4,7 кОм между DATA и VCC. У герметичной версии на проводе цвета обычно такие: красный — VCC, чёрный — GND, жёлтый или белый — DATA; сверьтесь с описанием своего датчика.
Библиотеки: DallasTemperature (автор Miles Burton) и OneWire — IDE предложит поставить вторую вместе с первой.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2); // шина 1-Wire на выводе 2
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
}
void loop() {
sensors.requestTemperatures(); // все датчики на шине измеряют
float t = sensors.getTempCByIndex(0); // первый датчик, °C
if (t == DEVICE_DISCONNECTED_C) {
Serial.println("Датчик не найден");
} else {
Serial.print(t);
Serial.println(" °C");
}
delay(1000);
}requestTemperatures() ждёт окончания измерения — при обычной точности это около 0,75 секунды, и скетч в это время стоит.
Несколько датчиков DS18B20 подключают параллельно на тот же провод данных с одним общим резистором: у каждого свой заводской адрес. Второй датчик — getTempCByIndex(1), третий — getTempCByIndex(2).
Что значат странные числа:
- −127 — датчик не ответил: нет резистора 4,7 кОм, обрыв провода, перепутаны выводы;
- 85 — значение, которое датчик хранит сразу после включения: измерение не состоялось. Частые причины — датчик перезапустился из-за плохого питания или контакта, длинный провод; проверьте питание и подключение.
Если датчик горячий
Перепутанные VCC и GND у DS18B20 и DHT быстро нагревают датчик. Сразу отключите питание: датчик мог выйти из строя. Проверьте распиновку по описанию конкретного модуля — у разных производителей порядок выводов разный.