Глиф Учебники

Как подключить датчик температуры DHT11, DHT22 или DS18B20

Справочник · Arduino · 2 минуты чтения

Общие шаги для любого из датчиков:

  1. Подключите датчик: питание, GND и провод данных к цифровому выводу (в примерах — вывод 2).
  2. Поставьте библиотеку через Sketch → Include Library → Manage Libraries… (как — в справке Как установить библиотеку).
  3. Откройте пример библиотеки (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 предложит поставить её сама).

Arduino
#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 предложит поставить вторую вместе с первой.

Arduino
#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 быстро нагревают датчик. Сразу отключите питание: датчик мог выйти из строя. Проверьте распиновку по описанию конкретного модуля — у разных производителей порядок выводов разный.