【物联网】基于树莓派的物联网开发【20】——树莓派控制DHT11温湿度传感器实战

传感器概述

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃。分为3个接口,分别为:VCC, DATA, GND。

产品图片

主要用途

检测环境温湿度

GPIO控制DHT11温湿度传感器实操

引脚接线

我用的是三个头的dht11传感器,因此连线方式是:

VCC(或正极) --- 树莓派的3v电源

GND (地线或者负极)--- 树莓派的gnd接口

DATA (D或者out) ---树莓派的GPIO引脚

1.VCC接上3V,可以选择1口或者17口
2.DATA接上GPIO口,我选的是GPIO4,第7口
3.GND接上接地口,我选的是第14口

模块原理图

硬件连接

硬件只涉及树莓派、DHT11传感器。

DHT11的信号引脚连接树莓派的GPIO17, DHT11的Vdd(+)和GND引脚(-)分别连接树莓派的电源正极和GND引脚。

实际线路

安装 Python3

本项目使用 Python3 进行开发,一般情况下,树莓派系统会内置 Python3,如果不确定系统内是否已经安装,可以使用下面的命令进行确认。

bash 复制代码
python3 --version

如果显示 Python 3.x.x(x 表示数字)则表示已经安装,否则请使用 apt 命令安装

bash 复制代码
sudo apt install python3

从源代码编译安装python3.9

如果你需要安装的Python版本不在apt仓库中,你可以从源代码编译安装。

bash 复制代码
wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz
tar -xf Python-3.9.1.tar.xz
cd Python-3.9.1
./configure --enable-optimizations
make -j 4
sudo make altinstall

使用altinstall可以避免与系统自带的Python版本冲突。

使用Pyenv管理Python版本

管理多个Python版本,可以使用pyenv。需要安装pyenv和pyenv-virtualenv:

1、安装依赖项:

bash 复制代码
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git 

2、安装pyenv:

bash 复制代码
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

3、配置环境变量(将以下内容添加到你的/.bashrc或/.profile文件中):

bash 复制代码
export PATH="HOME/.pyenv/bin:PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

4、重新加载配置文件:

bash 复制代码
source ~/.bashrc

5、使用pyenv安装最新版本的Python:

bash 复制代码
pyenv install -l  # 查看可用的Python版本
pyenv install 3.9.0 # 安装特定版本,例如3.9.0,
或者使用最新的稳定版号,如 pyenv install 3.9 或 pyenv install 3.10 等。
pyenv global 3.9.0  # 设置全局Python版本为3.9.0,或者使用最新的稳定版号。

Adafruit DHT库下载

bash 复制代码
sudo apt-get install git-core
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo apt-get install build-essential python-dev
sudo python3 setup.py install

注:安装失败,Adafruit_Python_DHT库无法安装成功,树莓派4b主板不支持。

关于虚拟环境

所谓虚拟环境是在python中把我们环境做成一个沙箱,不跟其他环境冲突。

另外,在类似树莓派这样的环境中不允许直接安装python的库,我们又需要用这些库,我们可以安装一个python的虚拟环境,由于虚拟环境不会影响外部环境,所以我可以在虚拟环境中安装python库。

python的虚拟环境安装步骤:

#创建一个文件夹用来安装虚拟环境:

bash 复制代码
mkdir adafruit_env
cd adafruit_env

安装虚拟环境:

bash 复制代码
sudo apt-get install python3-venv

创建虚拟环境:

bash 复制代码
python3 -m venv adafruit_env

激活虚拟环境:

bash 复制代码
source adafruit_env/bin/activate

退出虚拟环境:

bash 复制代码
deactivate

开启树莓派1-Wire接口

控制台终端输入命令

bash 复制代码
sudo raspi-config



选择确认退出即可。

安装adafruit-circuitpython-dht库

先进入虚拟环境

使用pip安装adafruit-circuitpython-dht库。打开终端,然后输入以下命令:

bash 复制代码
pip3 install adafruit-circuitpython-dht

GPIO控制传感器读取数据

编写Python获取温湿度代码,命名为demo1.py

代码如下:

bash 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import numpy as np
import time
import sys
DHTPIN = 17
GPIO.setmode(GPIO.BCM)
def read_dht11_dat():
    try:
        GPIO.setup(DHTPIN, GPIO.OUT)
        GPIO.output(DHTPIN, GPIO.LOW)
        time.sleep(0.02)
        GPIO.output(DHTPIN, GPIO.HIGH)
        GPIO.setup(DHTPIN, GPIO.IN)

        # Wait for sensor response
        timeout = time.time() + 0.1
        while GPIO.input(DHTPIN) == GPIO.LOW:
            if time.time() > timeout:
                raise RuntimeError("Sensor response timeout (LOW)")

        timeout = time.time() + 0.1
        while GPIO.input(DHTPIN) == GPIO.HIGH:
            if time.time() > timeout:
                raise RuntimeError("Sensor response timeout (HIGH)")

        # Read 40 bits of data
        data = []
        for _ in range(40):
            # Wait for start of bit
            timeout = time.time() + 0.001
            while GPIO.input(DHTPIN) == GPIO.LOW:
                if time.time() > timeout:
                    raise RuntimeError("Bit start timeout")

            # Measure duration of high pulse
            start = time.time()
            timeout = start + 0.001
            while GPIO.input(DHTPIN) == GPIO.HIGH:
                if time.time() > timeout:
                    break

            duration = time.time() - start
            data.append(1 if duration > 0.00005 else 0)

        # Convert bits to values
        m = np.logspace(7, 0, 8, base=2, dtype=int)
        data_array = np.array(data)

        humidity = m.dot(data_array[0:8])
        humidity_point = m.dot(data_array[8:16])
        temperature = m.dot(data_array[16:24])
        temperature_point = m.dot(data_array[24:32])
        check = m.dot(data_array[32:40])

        tmp = humidity + humidity_point + temperature + temperature_point

        if check == tmp and humidity + temperature < 1000:  # Sanity check
            return humidity, temperature
        return False

    except Exception as e:
        print(f"Error reading sensor: {str(e)}", file=sys.stderr)
        return False

def main():
    print("Raspberry Pi DHT11 Temperature test program\n")
    time.sleep(1)

    try:
        while True:
            result = read_dht11_dat()
            if result:
                humidity, temperature = result
                print(f"humidity: {humidity}%, Temperature: {temperature}C\n")
            else:
                print("Data are wrong, skip\n")
            time.sleep(1)
    except KeyboardInterrupt:
        pass

def destroy():
    GPIO.cleanup()

if __name__ == '__main__':
    try:
        main()
    finally:
        destroy()

运行脚本程序

可以看到humidity 和 Temperature数据打印在控制台。

相关推荐
智码看视界2 小时前
Edge AI 与 IoT 全栈系列:Edge AI 全栈 2:ESP32 + MQTT + Flink 实时 IoT 数据管道
物联网·flink·esp32·全栈开发·iot平台·实时流处理·edgeai
盛世宏博智慧档案3 小时前
基于PLC与物联网网关的档案库房温湿度超标自动联动控制实现思路(含拓扑图与协议对接)
大数据·人工智能·物联网
做萤石二次开发的哈哈3 小时前
萤石蓝海AIoT工作台新增需求PRD自动生成+技术设计文档可视化:AI先澄清需求再写代码,项目返工率大幅下降
人工智能·物联网·萤石开放平台·蓝海aiot一站式工作台·aiot开发
芯片人00714 小时前
纯硬件一键开关机ASIC芯片,为什么比 MCU 方案更适合更可靠
人工智能·单片机·嵌入式硬件·物联网·芯片
芯片人00716 小时前
武汉广昇科技的GMUX1308A模拟开关芯片成功导入中国台湾上市企业联昌电子,助力汽车电子供应链自主可控
科技·嵌入式硬件·物联网·汽车·芯片
黎阳之光16 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
IT小白杨17 小时前
多店铺防关联指纹浏览器哪个好:从账号关联判定模型到环境隔离架构的一次拆解
经验分享·物联网·矩阵·架构·指纹浏览器
一个学Java小白20 小时前
系统移植11111
物联网
这张生成的图像能检测吗1 天前
(论文速读)GMA-Net:面向嵌入式物联网设备的航空发动机损伤检测轻量级实时网络
物联网·目标检测·缺陷检测·轻量化·设备部署
wtblszn1 天前
光伏封装产线智能管理平台方案
网络·物联网