Raspberry Pi считывает данные о температуре и влажности DHT11 с помощью Python

Использование Raspberry Pi 4 с Python для чтения данных с датчика температуры и влажности DHT11 через GPIO

Введение

DHT11 — это датчик температуры и влажности с цифровым сигналом, предварительно откалиброванным. Точность: влажность ±5% RH, температура ±2°C. Диапазон измерений: влажность 20–90% RH, температура 0–50°C. Точность невысокая, но цена низкая. DHT11 использует однопроводную шину для связи. Напряжение питания: 3,3–5 В.

Чтение данных DHT11, DHT22, SHTC3 с помощью Arduino: https://blog.zeruns.com/archives/527.html
Метод реализации задержки в микросекундах на Python: https://blog.zeruns.com/archives/623.html

Скачать техническое описание DHT11: https://url.zeruns.com/DHT11 Код доступа: qefk

Исходный код

Подключение схемы:

Я использую Raspberry Pi 4. Для других моделей проверьте и адаптируйте подключение самостоятельно.

Описание GPIO-разъёмов Raspberry Pi 4: https://url.zeruns.com/RPI4_GPIO

DHT11		Raspberry Pi
 VCC---------5V (вывод 2)
 DATA-------BCM18 (вывод 18 по BCM, соответствует выводу 12)
 GND--------Ground (вывод 6)

Исходный код:

import RPi.GPIO as GPIO
import time

def delayMicrosecond(t):    # Функция задержки в микросекундах
    start, end = 0, 0       # Объявление переменных
    start = time.time()     # Запись времени начала
    t = (t - 3) / 1000000   # Преобразование t в секунды, -3 — компенсация задержки
    while end - start < t:  # Цикл до тех пор, пока разница не достигнет заданного значения
        end = time.time()   # Запись времени окончания

tmp = []      # Список для хранения считанных данных

data = 18     # GPIO-вывод Raspberry Pi, к которому подключён вывод DATA датчика DHT11 (используется BCM-нумерация)
# https://blog.zeruns.com  
a, b = 0, 0

def DHT11():
    GPIO.setup(data, GPIO.OUT)  # Настройка GPIO как выход
    GPIO.output(data, GPIO.HIGH) # Установка высокого уровня на GPIO
    delayMicrosecond(10 * 1000)  # Задержка 10 мс
    GPIO.output(data, GPIO.LOW)  # Установка низкого уровня на GPIO
    delayMicrosecond(25 * 1000)  # Задержка 25 мс       
    GPIO.output(data, GPIO.HIGH) # Установка высокого уровня на GPIO
    GPIO.setup(data, GPIO.IN)    # Настройка GPIO как вход
# https://blog.zeruns.com     
    a = time.time()           # Запись времени начала цикла
    while GPIO.input(data):   # Цикл до тех пор, пока вход не станет низким
        b = time.time()       # Запись времени окончания
        if (b - a) > 0.1:     # Проверка, не превысила ли задержка 0,1 секунды (предотвращение зависания)
            break             # Выход из цикла
          
    a = time.time()
    while GPIO.input(data) == 0:  # Цикл до тех пор, пока вход не станет высоким
        b = time.time()
        if (b - a) > 0.1:
            break
                 
    a = time.time()
    while GPIO.input(data): # Цикл до тех пор, пока вход не станет низким
        b = time.time()
        if (b - a) >= 0.1:
            break   
             
    for i in range(40):         # 40 циклов для получения данных температуры и влажности
        a = time.time()
        while GPIO.input(data) == 0:  # Цикл до тех пор, пока вход не станет высоким
            b = time.time()
            if (b - a) > 0.1:
                break
# https://blog.zeruns.com                         
        delayMicrosecond(28)    # Задержка 28 микросекунд
             
        if GPIO.input(data):    # Проверка, остаётся ли сигнал высоким после 28 мкс
            tmp.append(1)       # Запись бита как 1
                 
            a = time.time()
            while GPIO.input(data): # Цикл до тех пор, пока вход не станет низким
                b = time.time()
                if (b - a) > 0.1:
                    break
        else:
            tmp.append(0)       # Запись бита как 0
             
while True:
    GPIO.setmode(GPIO.BCM)      # Установка BCM-нумерации
    GPIO.setwarnings(False)
    del tmp[0:]                 # Очистка списка
    time.sleep(1)               # Задержка 1 секунда
# https://blog.zeruns.com     
    DHT11()
  
    humidity_bit = tmp[0:8]       # Разделение данных: биты 0–7 — целая часть влажности
    humidity_point_bit = tmp[8:16]# Биты 8–15 — дробная часть влажности
    temperature_bit = tmp[16:24]  # Биты 16–23 — целая часть температуры
    temperature_point_bit = tmp[24:32] # Биты 24–31 — дробная часть температуры
    check_bit = tmp[32:40]        # Биты 32–39 — бит проверки
 
    humidity_int = 0
    humidity_point = 0
    temperature_int = 0
    temperature_point = 0
    check = 0
# https://blog.zeruns.com  
    for i in range(8):          # Преобразование двоичного кода в десятичный
        humidity_int += humidity_bit[i] * 2 ** (7 - i)
        humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
        temperature_int += temperature_bit[i] * 2 ** (7 - i)
        temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
        check += check_bit[i] * 2 ** (7 - i)
  
    humidity = humidity_int + humidity_point / 10
    temperature = temperature_int + temperature_point / 10
  
    check_tmp = humidity_int + humidity_point + temperature_int + temperature_point
  
    if check == check_tmp and temperature != 0 and humidity != 0:  # Проверка корректности данных
        print("Температура: ", temperature, "°C\nВлажность: ", humidity, "%") # Вывод данных температуры и влажности
        print("https://blog.zeruns.com")
    else:
        print("ошибка")
  
    time.sleep(1)
    GPIO.cleanup()

Результат


Рекомендуемые статьи

2 лайка