Arduino для начинающих. Урок 9. Подключение датчика температуры и влажности DHT11 и DHT22
Продолжаем серию уроков “Arduino для начинающих”. Сегодня мы разберем подключение к Arduino датчиков температуры и влажности DHT11 и DHT22.
Датчики DHT11 и DHT22 не обладают высоким быстродействием и точностью, но зато просты, недороги и отлично подходят для обучения. Они выполнены из двух частей — емкостного датчика влажности и термистора. Чип, находящийся внутри, выполняет аналого-цифровое преобразование и выдает цифровой сигнал, который можно считать с помощью любого микроконтроллера.
Список деталей для сборки модели
Для сборки проекта, описанного в этом уроке, понадобятся следующие детали:
- плата Arduino (подробнее, о том как выбрать Arduino здесь);
- датчик DHT11 или DHT22 (можно купить, например, здесь или здесь);
- Breadboard;
- резистор на 10 кОм;
- программа Arduino IDE, которую можно скачать с сайта Arduino.
Датчик DHT11 входит в состав набора из 37 датчиков и других компонентов за $37.

Датчики DHT11 и DHT22
Чем отличаются датчики DHT11 и DHT22?
Две версии сенсоров DHT похожи друг на друга и имеют одинаковую распиновку. Их отличия в характеристиках. Спецификации:
Сенсор DHT11:
- определение влажности в диапозоне 20-80%
- определение температуры от 0°C до +50°C
- частота опроса 1 раз в секунду
Сенсор DHT22:
- определение влажности в диапазоне 0-100%
- определение температуры от -40°C до +125°C
- частота опроса 1 раз в 2 секунды
Таким образом, характеристики датчика DHT22 лучше по сравнению с DHT11, и поэтому он чуть-чуть дороже. Снимать показания чаще, чем раз в 1-2 секунды не получится, но, возможно, для вашего проекта более высокое быстродействие и не требуется.
Подключение сенсоров DHT к Arduino
Датчики DHT имеют стандартные выводы и их просто установить на breadboard.
Датчики DHT имеют 4 вывода:
- питание.
- вывод данных
- не используется.
- GND (земля).
Между выводами питания и вывода данных нужно разместить резистор номиналом 10 кОм.
Датчик DHT часто продается в виде готового модуля. В этом случае он имеет три вывода и подключается без резистора, т.к. резистор уже есть на плате.
Схема подключения датчика с резистором:

Схема подключения датчика DHT к Arduino
Arduino скетч
Воспользуемся библиотекой DHT.h, созданной специально для датчиков DHT. Ее можно скачать здесь. Для использования нужно поместить скачанную папку в в папку /libraries.
Пример программы для работы модели с датчиком DHT22 (можно просто скопировать в Arduino IDE):
#include "DHT.h"
При использовании датчика DHT11 закомментируйте строку:
#define DHTPIN 2 // номер пина, к которому подсоединен датчик
// Раскомментируйте в соответствии с используемым датчиком
// Инициируем датчик
DHT dht(DHTPIN, DHT22);
//DHT dht(DHTPIN, DHT11);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
// Задержка 2 секунды между измерениями
delay(2000);
//Считываем влажность
float h = dht.readHumidity();
// Считываем температуру
float t = dht.readTemperature();
// Проверка удачно прошло ли считывание.
if (isnan(h) || isnan(t)) {
Serial.println("Не удается считать показания");
return;
}
Serial.print("Влажность: "+h+" %\t"+"Температура: "+t+" *C ");
}
DHT dht(DHTPIN, DHT22);
И раскомментируйте строку:
//DHT dht(DHTPIN, DHT11);
Загрузите скетч в контроллер и проверьте правильность работы при помощи Сервис->Монитор порта:

Показания температуры и влажности (Монитор порта)
Вы должны увидеть температуру и влажность. Изменения можно увидеть, например, выдыхая на датчик (как для затуманивания окна). Дыхание увеличивает влажность.
Смотрите также:
Учебный курс “Arduino для начинающих”: главная страница.
Посты по урокам:
- Первый урок: Светодиод
- Второй урок: Кнопка
- Третий урок: Потенциометр
- Четвертый урок: Сервопривод
- Пятый урок: Трехцветный светодиод
- Шестой урок: Пьезоэлемент
- Седьмой урок: Фоторезистор
- Восьмой урок: Датчика движения (PIR) и E-mail
- Девятый урок: Подключение датчика температуры и влажности DHT11 или DHT22
Все посты сайта “Занимательная робототехника” по тегу Arduino.
Наш YouTube канал, где публикуются видео-уроки.
Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазины Амперка и DESSY. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.
Автор Александр Гагарин. В статье использованы материалы learn.adafruit.com.
Давид
17.07.2015
При компиляции выдало: Arduino: 1.6.5 (Windows 7), Плата»Arduino Uno»
Изменена опция сборки, пересобираем все
sketch_jul16a.ino: In function ‘void loop()’:
sketch_jul16a:45: error: invalid operands of types ‘const char [21]’ and ‘float’ to binary ‘operator+’
invalid operands of types ‘const char [21]’ and ‘float’ to binary ‘operator+’
и розовым цветом выделена строчка Serial.print(«Влажность: «+h+» %\t»+»Температура: «+t+» *C «);
Эта строка как-то неправильно написана?
Спасибо всем, кто подскажет
Денис
17.07.2015
В Ардуино нормально строка не формируется. Все, что нужно вывести, нужно написать отдельными Serial.print
koa73
17.09.2016
Serial.println(«Humidity : «+String(h, 1)+»%\t Temperature : «+String(t, 1)+» *C»);
Пруфпик
29.10.2016
Для DHT11 со встроенным резистором на плате рабочая программа будет такой. Вывод с — (правый) от датчика подключаем к GND Arduino, средний вывод (это +) подключаем на разъем 5V, левый вывод (это сигнал) подключаем к цифровому пину с цифрой 2.
#include «DHT.h»
#define DHTPIN 2 // номер пина, к которому подсоединен датчик
// Раскомментируйте в соответствии с используемым датчиком
// Инициируем датчик
//DHT dht(DHTPIN, DHT22);
DHT dht(DHTPIN, DHT11);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
// Задержка 2 секунды между измерениями
delay(2000);
//Считываем влажность
float h = dht.readHumidity();
// Считываем температуру
float t = dht.readTemperature();
// Проверка удачно прошло ли считывание.
if (isnan(h) || isnan(t)) {
Serial.println(«Не удается считать показания»);
return;
}
Serial.print(«Hum: «);
Serial.print(h);
Serial.print(» Temp: «);
Serial.print(t);
Serial.println(» C»);
}
tapin13
16.11.2017
Serial.print((String)»Влажность: «+h+» %\t»+»Температура: «+t+» *C «);
Вася
30.08.2018
Вот, например.
Serial.println((String)»Влажность: » + h + (String)» %\t» + (String)»Температура: » + t + (String)» *C «);
Андрей
16.11.2015
У меня датчик DHT11 в виде готового модуля с тремя выводами. ВНИМАНИЕ: левый пин — данные, средний — питание, правый — земля.
В скачанной бbблиотеке DHT есть скетч с примером использования датчика — работает без изменений. По сравнению с другим прибором температуру DHT11 показывает +/- один градус, а влажность завышает на 6 %.
Павел
05.12.2015
Андрей, можно скетч на такой датчик? Пол интернета перерыл, не нашел, у всех без встроенных резисторов.
deftvk
27.05.2016
Вот здесь более, чем доступно codius.ru/articles/187, ещё и что происходит в библиотеке описано. И пример кстати на модуле с резистором.
Паша
27.02.2016
Адрюха, респект! В 5 гайдах в интернет говорят что первая ножка — это питание, и только твой коммент помог получить данные с dht11 модуля.
Спасибо!
Salihman
16.06.2016
Спасибо тебе огромное!
Андрей
03.01.2016
При проверке выдает следующее сообщение :
E:\Arduino\Dht11\Dht11\examples\TempHumidity\TempHumidity.ino:3:17: fatal error: DHT.h: No such file or directory
#include «DHT.h»
^
compilation terminated.
exit status 1
Ошибка компиляции.
что делать?
Андрей
03.01.2016
E:\Arduino\Dht11\Dht11\examples\TempHumidity\TempHumidity.ino:3:17: fatal error: DHT.h: No such file or directory
#include «DHT.h»
^
compilation terminated.
exit status 1
Ошибка компиляции.
Что делать?
Александр
07.01.2016
эта ошибка когда не подключил библиотеку, либо коряво скачалось, у меня все работает на китайском ардуино uno
Дмитрий
15.01.2016
все очень понятно написано . а будет продолжение ?
Роман
19.01.2016
Скетч не верный!
Из примера к библиотеке работает. В приведенном примере нет.
Андрей
13.02.2016
#include «DHT.h»
//#include «iostream»
#define DHTPIN 10
int ledtest = 6;
DHT dht(DHTPIN, DHT11);
void setup()
{
pinMode(led, OUTPUT);
pinMode(ledtest, OUTPUT);
Serial.begin(9600);
dht.begin();
}
void loop()
{
delay(1000);
//setlocale(LC_ALL,»RUS»);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
Serial.println(«no info»);
digitalWrite(ledtest, LOW);
return;
}
else
{
digitalWrite(ledtest, HIGH);
//****** НЕФОРМИРУЮЩАЯСЯ СТРОКА ВЫВОДА пришлось писать её раздельно.
Serial.print(«Humidity: «); Serial.print(h); Serial.print(«% «); Serial.print(«Temp: «); Serial.print(t); Serial.println(«*C» );
}
}
вот полностью рабочий вариант.
у меня там ещё диод как индикатор стоит, часть с ledset можно вырезать.
Виталий
14.09.2016
у вас в тексте программы ошибки. pinMode(led, OUTPUT) не описана как переменная, вы, наверное, имели ввиду ledtest вместо led
Юрий
12.07.2017
найти и заменить все « на » . ledtest вместо led
Kirill
14.02.2016
Как сделать когда выше 25 градусов включался контакт 4 вентилятор. Помогите пожалуйста.
Dmirtiy
28.02.2016
Kirill, примерно так:
t — температура, конечно.
ledPin = вывод для управляющего сигнала (у меня загорается светодиод, например)
Ну и для контроля вставля дополнительные надписи в порт, их можно убрать.
if (t > 25)
{
analogWrite(ledPin, 255);
Serial.println(«Warning!!!»);
}
else
{
analogWrite(ledPin, 0);
Serial.println(«NO Warning!!!»);
}
Леонид
20.04.2016
подскажите плис, как вывести данные с датчика на LCD Keypad Shield
Просто на экран, понятно..
Роман
23.09.2016
This report would have more information with
«Show verbose output during compilation»
enabled in File > Preferences.
Arduino: 1.0.6 (Windows XP), Board: «Arduino Uno»
sketch_sep23a.ino: In function ‘void loop()’:
sketch_sep23a:46: error: invalid operands of types ‘const char [21]’ and ‘float’ to binary ‘operator+’
Скопировал. Проверку не проходит.
Роман
27.09.2016
Ткните на спец форум какойнить, где на вопросы чайников отвечают оперативно, за небольшим донатом не заржавеет.
Занимательная робототехника
27.09.2016
На http://forum.amperka.ru/ попробуйте.
dikikh.dm
06.10.2016
Всем доброй ночи, никак не могу завести dht11, все время не удается считать показания. Пробовал менять местами пины 5В и вывода иноформации, как советовали выше — не помогло.
Датчик температуры работает отлично.
Дохлый dht 11 попался?
nemezida.su
29.10.2016
поxоже на то. Что вообще выводит в переменной влажности?
Олег
05.12.2016
Подключал датчик через дашборд, выдавал нулевые значение в мониторе порта, подключил напрямую провода (от ардуино сразу к датчику), все заработало.
Олег
05.12.2016
Разобрался с дашбордом, я новичок, поэтому не знал что дорожки плюс и минус на ней работают только до половины, а дальше разрыв, датчик установил на вторую половину, а подключил к + и GND первую половину.
Сергей
09.12.2016
Что за ошибка в библиотеке? При проверке выскакивает. На Ардуино IDE
In file included from G:\Arduino\Arduino\Sketch\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:
G:\Arduino\Arduino\Sketch\libraries\DHT-sensor-library-master\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory
#include
^
compilation terminated.
Используем библиотеку DHT-sensor-library-master версии 1.3.0 из папки: G:\Arduino\Arduino\Sketch\libraries\DHT-sensor-library-master
exit status 1
Ошибка компиляции для платы Arduino Nano.
Алексей
20.02.2017
У кого ошибка при компиляции как у Сергея, установите библиотеку версии 1.2.3 .
И строка вывода:
Serial.println(«Humidity : «+String(h, 1)+»%\t Temperature : «+String(t, 1)+» *C»);
как писал koa73
Алексей
20.02.2017
У кого ошибка как у Сергея, установите версию библиотеки 1.2.3.
Voviks99
01.03.2017
Serial.print(» Hum: «);
Serial.print(h);
Serial.print(» %\t»);
Serial.print(» Temp: «);
Serial.print(t);
Serial.println(» *C»);
//Serial.println(«Humidity : «+String(h, 1)+»%\t Temperature : «+String(t, 1)+» *C»);
//Serial.println(«Влажность: «+h+» %\t»+»Температура: «+t+» *C «);
у меня так получилось, правда с русским крякозябры. заработала.
Олег
27.03.2017
Adafruit_Sensor.h: No such file or directory
#include скачайте библиотеку
Stivin
31.03.2017
Добрый день, подключил датчик и дисплей, все ок, подскажите пожалуйста как сделать допустим если температура равна х значению то зуммер будет пищать 1раз в 1 минуту?
Александр
04.04.2017
640.00 *C температуры и 921.6 % влажности — это нормальные показания? О_О
tapin13
16.11.2017
если вы в аду, то да.
BEC
15.01.2020
У тебя датчик DHT11 а ты выставил DHT22
Antoniolip
03.06.2017
Привет!
Срочно! Как купить электронику из Китая в Томске или в России с бесплатной доставкой курьером? Помогите срочно не могу самому найти интернет магазин…
Не знаю как выбрать магазин что бы не кинули выручайте!
Занимательная робототехника
03.06.2017
Например, Aliexpress. Или другие магазины http://edurobots.ru/gde-kupit-robotov-konstruktori-i-radiodetali/
Ancicbop
10.07.2017
Очень познавательно.
engladbop
22.11.2017
Не совсем согласен,
Константин
03.01.2018
Здравствуйте,подскажите что вообще значит // Инициируем датчик
DHT dht(DHTPIN, DHT22);
//DHT dht(DHTPIN, DHT11);
И для чего это нужно???
Александр
21.03.2018
Говорим ардуине с каким датчиком нужно работать.
1
09.08.2018
Нит черта не работает , как не качал библиотеку по инструкции без толку — не одного нормального примера с этим датчиком пока не нашел
learnArduino
21.05.2020
таже самая проблема
Володя
16.10.2018
У кого ругается на нечто подобное — «fatal error: Adafruit_Sensor.h: No such file or directory» Установите еще и эту библиотеку:
https://github.com/adafruit/Adafruit_Sensor
Kripto
27.10.2018
Так как библиотека обновлялась то надо провести некоторые изменения в коде.
Как сказано в условии, качаем библиотеку:
https://github.com/adafruit/DHT-sensor-library
Также может понадобиться еще и эта библиотека:
https://github.com/adafruit/Adafruit_Sensor
B копируем эти библиотеки в:
C:\Program Files\Arduino\libraries /путь по умолчанию ,у каждого может быть свой путь/
Далее выкладываю правильный код:
//Присвоение портов переменным и подключение библиотек.
#include «DHT.h» //Подключае библиотеку
#define DHTPIN 2 // Назначаем номер порта
#define DHTTYPE DHT22 //Задаем тип датчика
DHT dht(DHTPIN, DHT22); // Инициируем датчик
// код установки, запускается один раз:
void setup() {
Serial.begin(9600); //Инициирует последовательное соединение и задаетскорость передачи данных с ПК
dht.begin(); //Назначает указанный выше пин как выходной параметр, и обнуляет счётчик времени между запросами температуры.
}
// основной код, для цыкличного запуска:
void loop() {
delay(2000); // Задержка 2 секунды между измерениями
float h = dht.readHumidity(); //Считываем влажность
float t = dht.readTemperature(); // Считываем температуру
// Проверка удачно прошло ли считывание.
if (isnan(h)||isnan(t)) { //||isnan(f)
Serial.println(«Не удается считать показания»);
return;
}
// Передаем значения на ПК
Serial.print(«Влажность: «);
Serial.print(h);
Serial.print(«%\t»);
Serial.print(«Температура: «);
Serial.print(t);
Serial.println(«°C»);
}
Михаил
04.12.2018
скажите чайнику пж код чтобы если t>26 е\то чтобы светодиод загорался
Евгений
18.01.2019
У меня ардуино не хочет принимать float, что делать?
samsung директор
21.01.2020
пАМАГИТЕ
In file included from D:\ardyino\programma\arduino-1.8.9\libraries\DHT-sensor-library-master\DHT_U.cpp:15:0:
D:\ardyino\programma\arduino-1.8.9\libraries\DHT-sensor-library-master\DHT_U.h:36:29: fatal error: Adafruit_Sensor.h: No such file or directory
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
learnArduino
21.05.2020
скетч чюхня удалил половину пофиксите пж