Raspberry Pi: температура и влажность с DHT11/DHT22 (Python)
Узнайте, как подключить цифровые датчики температуры DHT11 и DHT22 к Raspberry Pi для получения показаний температуры и влажности. Вы научитесь подключать датчики к Raspberry Pi, устанавливать необходимые библиотеки и писать Python-скрипт, который выводит текущую температуру и влажность в терминале.
В этом руководстве мы рассмотрим следующие основные темы:
Предварительные требования
Прежде чем продолжить работу с этим руководством, проверьте следующие предварительные требования.
Ознакомьтесь с платой Raspberry Pi — если вы ещё не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.
Вы должны знать, как запускать и создавать файлы Python на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi через SSH с помощью расширения в VS Code. У нас есть подробное руководство на эту тему: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Raspberry Pi Pinout Guide: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
Знакомство с датчиками DHT11/DHT22
Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди мейкеров и любителей электроники.
Эти датчики содержат чип, который выполняет аналого-цифровое преобразование и выдаёт цифровой сигнал с данными о температуре и влажности. Это делает их очень простыми в использовании с любым микроконтроллером.
DHT11 vs DHT22
Датчики DHT11 и DHT22 очень похожи, но отличаются своими характеристиками. В следующей таблице сравниваются некоторые из наиболее важных характеристик датчиков температуры и влажности DHT11 и DHT22. Для более подробного анализа этих датчиков, пожалуйста, ознакомьтесь с даташитами датчиков.
DHT11 |
DHT22 |
|
|---|---|---|
|
|
|
Диапазон температур |
от 0 до 50 °C ±2 °C |
от -40 до 80 °C ±0,5 °C |
Диапазон влажности |
от 20 до 90% ±5% |
от 0 до 100% ±2% |
Разрешение |
Влажность: 1%, Температура: 1 °C |
Влажность: 0,1%, Температура: 0,1 °C |
Рабочее напряжение |
3 – 5,5 В DC |
3 – 6 В DC |
Потребляемый ток |
0,5 – 2,5 мА |
1 – 1,5 мА |
Период опроса |
1 секунда |
2 секунды |
Цена |
от $1 до $5 |
от $4 до $10 |
Где купить |
Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и вы можете запрашивать показания только с интервалом в 2 секунды.
DHT11 имеет меньший диапазон и менее точен. Однако вы можете запрашивать показания датчика каждую секунду. Он также немного дешевле.
Несмотря на различия, они работают аналогичным образом, и вы можете использовать один и тот же код для считывания температуры и влажности. Вам просто нужно указать в коде тип используемого датчика.
Распиновка DHT
Датчики DHT имеют четыре контакта, как показано на следующем рисунке. Однако, если вы приобрели датчик DHT на плате-модуле (breakout board), он поставляется только с тремя контактами и имеет встроенный подтягивающий резистор на контакте 2.
В следующей таблице показана распиновка DHT22 и DHT11. Когда датчик обращён к вам лицевой стороной, нумерация контактов начинается с 1 слева направо.
Контакт DHT |
Подключить к |
|---|---|
1 |
3.3V |
2 |
Любой цифровой GPIO; также подключите подтягивающий резистор 4,7 кОм |
3 |
Не подключать |
4 |
GND |
Модуль датчика DHT (Breakout Board)
Если у вас есть датчик DHT11 или DHT22 на плате-модуле, они поставляются только с тремя контактами и имеют встроенный подтягивающий резистор на контакте данных.
В этом случае подключение ещё проще, и вам не нужно подключать внешний резистор. Платы-модули DHT обычно имеют маркировку на контактах: GND, VCC и DATA.
Контакт DHT |
Подключить к |
|---|---|
GND |
GND |
VCC |
3V3 (OUT) |
DAT |
GPIO 4 (или любой другой цифровой контакт) |
Необходимые компоненты
Вот список компонентов, необходимых для сборки схемы (если у вас нет модуля DHT, вам понадобится резистор 4,7 кОм):
Плата Raspberry Pi — читайте Лучшие стартовые наборы Raspberry Pi
Резистор 4,7 кОм или аналогичного номинала (не нужен, если у вас есть модуль DHT)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Подключение датчика DHT к Raspberry Pi
Подключите датчик DHT22 или DHT11 к Raspberry Pi, как показано на следующей схеме. Если у вас есть модуль DHT, проигнорируйте резистор.
В этом примере мы подключаем контакт данных DHT к GPIO 4. Однако вы можете использовать любой другой подходящий цифровой GPIO. :doc:`Узнайте больше о GPIO Raspberry Pi здесь </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_.
Получение температуры и влажности с датчика DHT на Raspberry Pi (скрипт Python)
Существуют различные способы получения показаний температуры и влажности с датчиков DHT11 или DHT22 с помощью Raspberry Pi и Python. Мы будем использовать Python-библиотеку `Adafruit_CircuitPython_DHT <https://github.com/adafruit/Adafruit_CircuitPython_DHT>`__.
Обновление Raspberry Pi
Сначала обновите и обновите свой Raspberry Pi, если доступны какие-либо обновления. Выполните следующую команду:
sudo apt update && sudo apt upgrade
Если необходимо обновление, вас спросят, хотите ли вы продолжить. Нажмите Y и Enter, чтобы продолжить. Возможно, вам придётся подождать несколько минут, если требуется обновление.
Создание виртуального окружения
Мы установим библиотеку DHT в виртуальное окружение. Создание виртуального окружения позволит изолировать Python-библиотеки, которые мы используем, в данном случае библиотеку DHT, от остальной системы.
Мы создадим виртуальное окружение в каталоге на нашем Рабочем столе. Введите следующую команду в окне терминала, чтобы перейти на Рабочий стол:
cd ~/Desktop
Создайте папку для вашего проекта. Именно здесь мы создадим виртуальное окружение и установим библиотеку. Мы создадим папку с именем dht_test.
mkdir dht_test
Перейдите в только что созданную папку:
cd ~/Desktop/dht_test
Создайте виртуальное окружение для этого каталога с именем myenv. Это должен быть тот же каталог, в который мы установим библиотеку DHT. Замените myenv на желаемое имя для вашего виртуального окружения.
python3 -m venv myenv
Затем вы можете выполнить следующую команду, чтобы убедиться, что виртуальное окружение создано.
ls -l
Активируйте виртуальное окружение:
source myenv/bin/activate
Ваше приглашение командной строки должно измениться, указывая на то, что вы теперь находитесь в виртуальном окружении.
Установка библиотеки Adafruit_CircuitPython_DHT
Теперь, когда мы находимся в нашем виртуальном окружении, мы можем установить библиотеку. Выполните следующую команду:
python3 -m pip install adafruit-circuitpython-dht
Через несколько секунд библиотека будет установлена (игнорируйте жёлтые предупреждения об устаревших пакетах).
Код Python для Raspberry Pi DHT11/DHT22
Следующий скрипт получает температуру и влажность с датчиков DHT и выводит показания в терминале Python. Создайте новый файл Python с произвольным именем, например dht_basic.py, и скопируйте следующий код.
# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-dht11-dht22-python/
# Based on Adafruit_CircuitPython_DHT Library Example
import time
import board
import adafruit_dht
# Sensor data pin is connected to GPIO 4
sensor = adafruit_dht.DHT22(board.D4)
# Uncomment for DHT11
#sensor = adafruit_dht.DHT11(board.D4)
while True:
try:
# Print the values to the serial port
temperature_c = sensor.temperature
temperature_f = temperature_c * (9 / 5) + 32
humidity = sensor.humidity
print("Temp={0:0.1f}ºC, Temp={1:0.1f}ºF, Humidity={2:0.1f}%".format(temperature_c, temperature_f, humidity))
except RuntimeError as error:
# Errors happen fairly often, DHT's are hard to read, just keep going
print(error.args[0])
time.sleep(2.0)
continue
except Exception as error:
sensor.exit()
raise error
time.sleep(3.0)
Для создания и запуска Python-скриптов на Raspberry Pi мы предпочитаем использовать VS Code с расширением SSH: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Как работает код
Продолжайте читать, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.
Импорт библиотек
Начните с импорта необходимых библиотек: модуль time для добавления задержек в наш код, модуль board для взаимодействия с GPIO Raspberry Pi и модуль adafruit_dht для считывания данных с датчика DHT.
import time
import board
import adafruit_dht
Датчик DHT
В следующей строке мы инициализируем наш датчик DHT. Мы используем DHT22, подключённый к GPIO 4 (вы можете использовать любой другой подходящий GPIO, если измените код в следующей строке):
sensor = adafruit_dht.DHT22(board.D4)
Если вы используете DHT11, код должен выглядеть так:
sensor = adafruit_dht.DHT11(board.D4)
С этого момента мы будем обращаться к нашему датчику DHT как к объекту sensor в коде.
Цикл while
Затем у нас есть цикл, который поддерживает работу программы бесконечно, пока вы не остановите её. Внутри цикла мы будем пытаться считать данные датчика и отобразить показания.
while True:
try:
Считывание температуры и влажности
Получить температуру в градусах Цельсия и влажность так же просто, как использовать свойства temperature и humidity объекта sensor. Итак, вы можете получить температуру следующим образом:
temperature_c = sensor.temperature
По умолчанию температура возвращается в градусах Цельсия. Мы добавляем строку для преобразования в градусы Фаренгейта.
temperature_f = temperature_c * (9 / 5) + 32
Мы сохраняем значение влажности в переменной humidity:
humidity = sensor.humidity
После получения показаний датчика мы выводим их в терминале с помощью функции print().
print("Temp={0:0.1f}ºC, Temp={1:0.1f}ºF, Humidity={2:0.1f}%".format(temperature_c, temperature_f, humidity))
Форматирование вывода
Temp={0:0.1f}ºC, Temp={1:0.1f}ºF, Humidity={2:0.1f}%: это строка формата, которая определяет, как будет отображаться вывод. Строка формата содержит заполнители, обозначенные фигурными скобками {}, которые будут заполнены фактическими значениями с помощью метода .format().
Temp={0:0.1f}ºC указывает заполнитель для первого значения (температура). Он определяет, как значение будет отформатировано:
{0}: указывает индекс вставляемого значения (0 относится к первому значению, переданному в метод .format()).:0.1f: это спецификация форматирования, которая определяет, как значение должно быть отображено. 0 представляет минимальное количество цифр, а .1f означает, что значение будет отображено как число с плавающей запятой с одной цифрой после десятичной точки.
Temp={1:0.1f}ºF: эта часть строки формата имеет ту же структуру, что и выше, но относится ко второму значению (temperature_f).
Humidity={2:0.1f}%: эта часть строки формата относится к третьему значению (humidity).
Наконец, .format(temperature_c, temperature_f, humidity) вставляет фактические значения в заполнители внутри строки формата. Значения, указанные в скобках, вставляются в заполнители в соответствии с их индексами (0, 1, 2).
Если мы не можем получить корректные показания температуры и влажности, мы обрабатываем исключения в блоках except:
except RuntimeError as error:
# Errors happen fairly often, DHT's are hard to read, just keep going
print(error.args[0])
time.sleep(2.0)
continue
except Exception as error:
sensor.exit()
raise error
Мы получаем новые показания температуры каждые три секунды. Вы можете настроить время задержки, изменив аргумент метода sleep().
time.sleep(3)
Демонстрация
Сохраните ваш Python-файл в той же папке, где находится виртуальное окружение (в нашем случае Desktop/dht_test). Затем запустите его на Raspberry Pi. Выполните следующую команду (убедитесь, что вы находитесь в правильном каталоге — той же папке, где находится виртуальное окружение):
python dht-basic.py
Виртуальное окружение должно быть активным для запуска скрипта. Если виртуальное окружение не активно, вы можете снова выполнить следующую команду для активации myenv.
source myenv/bin/activate
Вы должны получать новые показания температуры и влажности в терминале Python или в терминале Raspberry Pi каждые три секунды.
Вы можете остановить выполнение программы, нажав CTRL + C.
Вам также может быть интересно: :doc:`Raspberry Pi: BME280 — температура, влажность и давление (Python) </raspberry/rnt/raspberry-pi-bme280-python/index>`_.
Заключение
В этом руководстве вы узнали, как подключить цифровые датчики температуры и влажности DHT11 и DHT22 к Raspberry Pi и как написать Python-программу для получения и отображения показаний. Это один из самых базовых проектов для начала работы с датчиком DHT11 или DHT22.
Надеемся, что это руководство было для вас полезным. Если вы новичок в работе с Raspberry Pi, вы можете начать со следующих руководств:
:doc:`Начало работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_
:doc:`Raspberry Pi Pinout Guide </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
Вы можете ознакомиться со всеми нашими проектами для Raspberry Pi по следующей ссылке:
Наконец, если вы хотите подключить датчик DHT11/22 к другим микроконтроллерам, у нас есть руководства для ESP32, ESP8266 и Arduino:
Спасибо за чтение.