Raspberry Pi: температура и влажность с DHT11/DHT22 (Python)

Узнайте, как подключить цифровые датчики температуры DHT11 и DHT22 к Raspberry Pi для получения показаний температуры и влажности. Вы научитесь подключать датчики к Raspberry Pi, устанавливать необходимые библиотеки и писать Python-скрипт, который выводит текущую температуру и влажность в терминале.

Raspberry Pi с DHT11 DHT22 — получение температуры и влажности Python

В этом руководстве мы рассмотрим следующие основные темы:

Предварительные требования

Прежде чем продолжить работу с этим руководством, проверьте следующие предварительные требования.

  1. Ознакомьтесь с платой Raspberry Pi — если вы ещё не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать файлы Python на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi через SSH с помощью расширения в VS Code. У нас есть подробное руководство на эту тему: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

  3. Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Raspberry Pi Pinout Guide: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

Знакомство с датчиками DHT11/DHT22

Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди мейкеров и любителей электроники.

Датчики температуры и влажности DHT11/DHT22

Эти датчики содержат чип, который выполняет аналого-цифровое преобразование и выдаёт цифровой сигнал с данными о температуре и влажности. Это делает их очень простыми в использовании с любым микроконтроллером.

DHT11 vs DHT22

Датчики DHT11 и 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

В следующей таблице показана распиновка DHT22 и DHT11. Когда датчик обращён к вам лицевой стороной, нумерация контактов начинается с 1 слева направо.

Контакт DHT

Подключить к

1

3.3V

2

Любой цифровой GPIO; также подключите подтягивающий резистор 4,7 кОм

3

Не подключать

4

GND

Модуль датчика DHT (Breakout Board)

Если у вас есть датчик DHT11 или DHT22 на плате-модуле, они поставляются только с тремя контактами и имеют встроенный подтягивающий резистор на контакте данных.

Датчик DHT22

В этом случае подключение ещё проще, и вам не нужно подключать внешний резистор. Платы-модули DHT обычно имеют маркировку на контактах: GND, VCC и DATA.

Контакт DHT

Подключить к

GND

GND

VCC

3V3 (OUT)

DAT

GPIO 4 (или любой другой цифровой контакт)

Необходимые компоненты

Raspberry Pi со схемой DHT22

Вот список компонентов, необходимых для сборки схемы (если у вас нет модуля DHT, вам понадобится резистор 4,7 кОм):

Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение датчика DHT к Raspberry Pi

Подключите датчик DHT22 или DHT11 к Raspberry Pi, как показано на следующей схеме. Если у вас есть модуль DHT, проигнорируйте резистор.

Схема подключения датчика DHT к Raspberry Pi

В этом примере мы подключаем контакт данных 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
Создание виртуального окружения Python на Raspberry Pi

Активируйте виртуальное окружение:

source myenv/bin/activate

Ваше приглашение командной строки должно измениться, указывая на то, что вы теперь находитесь в виртуальном окружении.

Активация виртуального окружения Python

Установка библиотеки Adafruit_CircuitPython_DHT

Теперь, когда мы находимся в нашем виртуальном окружении, мы можем установить библиотеку. Выполните следующую команду:

python3 -m pip install adafruit-circuitpython-dht

Через несколько секунд библиотека будет установлена (игнорируйте жёлтые предупреждения об устаревших пакетах).

Установка библиотеки 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 каждые три секунды.

Raspberry Pi — вывод показаний температуры и влажности датчика DHT22 DHT11

Вы можете остановить выполнение программы, нажав CTRL + C.

Вам также может быть интересно: :doc:`Raspberry Pi: BME280 — температура, влажность и давление (Python) </raspberry/rnt/raspberry-pi-bme280-python/index>`_.

Заключение

В этом руководстве вы узнали, как подключить цифровые датчики температуры и влажности DHT11 и DHT22 к Raspberry Pi и как написать Python-программу для получения и отображения показаний. Это один из самых базовых проектов для начала работы с датчиком DHT11 или DHT22.

Надеемся, что это руководство было для вас полезным. Если вы новичок в работе с Raspberry Pi, вы можете начать со следующих руководств:

Вы можете ознакомиться со всеми нашими проектами для Raspberry Pi по следующей ссылке:

Наконец, если вы хотите подключить датчик DHT11/22 к другим микроконтроллерам, у нас есть руководства для ESP32, ESP8266 и Arduino:

Спасибо за чтение.