Использование 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()
Результат
Рекомендуемые статьи
- Рекомендации по недорогим и высокопроизводительным VPS/облачным серверам: https://blog.zeruns.com/archives/383.html
- Статьи по Python: https://blog.zeruns.com/category/Python/
- Чтение данных DHT11, DHT22, SHTC3 с помощью Arduino: https://blog.zeruns.com/archives/527.html
- Полный список студенческих скидок и образовательных преимуществ: https://blog.zeruns.com/archives/557.html
- Как создать личный блог: https://blog.zeruns.com/archives/218.html
- Настройка среды разработки ESP8266 и демонстрация проектов: https://blog.zeruns.com/archives/526.html


