• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

树莓派+DHT11传感器(温度,湿度检测)实验Python实验

武飞扬头像
只会CV的熊
帮助1

为了测试树莓派的GPIO接口,并尝试发出数据,做此实验并记录。


实验实现了以下内容: 

  1. 通过树莓派GPIO来连接并控制DHT11传感器,获得温度,湿度数据;
  2. 使用MQTT将树莓派所获取的温度与湿度数据广播;
  3. PC端通过订阅MQTT服务器的广播获取湿度与温度数据,并存入数据库。

1.树莓派连接控制DHT11传感器,获得温度,湿度数据并用MQTT广播

  1. 在树莓派未通电情况下连接GPIO引脚与DHT11;

启动树莓派,并根据所连接引脚进行编码。

  1.  
    # 此代码块在树莓派端运行
  2.  
    import time
  3.  
    import board
  4.  
    import adafruit_dht # 读取DHT11数据使用的库,该库由官方提供下载
  5.  
    from datetime import datetime
  6.  
    import paho.mqtt.client as mqtt # mqtt库
  7.  
    import json
  8.  
     
  9.  
    # mqtt 服务器地址/端口
  10.  
    broker = "192.168.137.57"
  11.  
    port = 1883
  12.  
    keepalive = 60
  13.  
    # 需要发布的主题
  14.  
    topic = "DHT11_message"
  15.  
     
  16.  
    # 实例化并连接
  17.  
    client = mqtt.Client()
  18.  
    client.connect(broker, port)
  19.  
     
  20.  
    Pin = board.D4 # 使用GPIO(BCM),注意根据官方提供的GPIO引脚图进行连接
  21.  
    dhtDevice = adafruit_dht.DHT11(Pin)
  22.  
     
  23.  
    while True:
  24.  
    try:
  25.  
    # 获取时间
  26.  
    recDate = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  27.  
    # 获取传感器数值
  28.  
    temperature_c = dhtDevice.temperature
  29.  
    humidity = dhtDevice.humidity
  30.  
    # mqtt 传输
  31.  
    msg = json.dumps({
  32.  
    'Tem':temperature_c,
  33.  
    'Hum':humidity,
  34.  
    'Date':recDate
  35.  
    })
  36.  
    result = client.publish(topic, msg)
  37.  
    status = result[0]
  38.  
    if status == 0:
  39.  
    print(f"Send `{msg}` to topic `{topic}`")
  40.  
    else:
  41.  
    print(f"Failed to send message to topic {topic}")
  42.  
    print(msg)
  43.  
     
  44.  
    except RuntimeError as error:
  45.  
    # Errors happen fairly often, DHT's are hard to read, just keep going
  46.  
    print(error.args[0])
  47.  
    time.sleep(2.0)
  48.  
    continue
  49.  
    except Exception as error:
  50.  
    dhtDevice.exit()
  51.  
    raise error
  52.  
    time.sleep(2.0)
学新通

2.订阅MQTT服务器的广播获取湿度与温度数据,并存入数据库

本实验中我将MQTT服务器搭建在树莓派上,所以MQTT服务器的地址就是树莓派目前的IP。当然也可以在PC端搭建MQTT服务器

  1.  
    '''
  2.  
    PC端DHT11数据接收,并写入数据库中
  3.  
    '''
  4.  
    import paho.mqtt.client as mqtt
  5.  
    import time
  6.  
    import json
  7.  
    import pymysql
  8.  
     
  9.  
    # 连接数据库用参数
  10.  
    DBHOST = 'localhost'
  11.  
    DBUSER = 'root'
  12.  
    DBPASS = '123456' # 数据库登录密码
  13.  
    DBNAME = 'DHT11' # 数据库 库名
  14.  
     
  15.  
    # 连接数据库并创建实例
  16.  
    try:
  17.  
    # 连接数据库,所需参数(主机名,用户名,密码,数据库名)
  18.  
    db = pymysql.connect(host=DBHOST, user=DBUSER, password=DBPASS, database=DBNAME,charset='utf8')
  19.  
    print('连接成功')
  20.  
    except pymysql.Error as e:
  21.  
    print('连接数据库失败' str(e))
  22.  
     
  23.  
    cur = db.cursor()
  24.  
     
  25.  
    # MQTT服务器地址及端口
  26.  
    HOST = "192.168.000.000" # 服务器ip地址
  27.  
    MQTT_PORT = 1883 # 服务器端口(基本默认为1883)
  28.  
     
  29.  
    # 访问mqtt数据部分
  30.  
    def on_connect(client, userdata, flags, rc):
  31.  
    rc_status = ["连接成功", "协议版本错误", "无效的客户端标识", "服务器无法使用", "用户密码错误", "无授权"]
  32.  
    print("connect:", rc_status[rc])
  33.  
     
  34.  
    def on_message(client, userdata, msg):
  35.  
    print("主题:", msg.topic)
  36.  
    res = msg.payload.decode("UTF-8")
  37.  
    data = json.loads(res)
  38.  
    print("消息:", data)
  39.  
    write_mysql(data)
  40.  
     
  41.  
    #写入数据库
  42.  
    def write_mysql(data):
  43.  
    sql ="insert into sensordata (nowtime,tem,hum) values (%s,%s,%s)"
  44.  
    params = (data['Date'],data['Tem'],data['Hum'])
  45.  
    db.ping(reconnect=True)
  46.  
    cur.execute(sql,params)
  47.  
    db.commit()
  48.  
    print("数据库插入成功")
  49.  
     
  50.  
    def main():
  51.  
    client = mqtt.Client()
  52.  
    client.on_connect = on_connect # 返回连接状态的回调函数
  53.  
    client.connect(HOST, MQTT_PORT, keepalive=600) # 连接服务器
  54.  
    client.on_message = on_message # 定义回调函数
  55.  
    client.subscribe('DHT11_message', qos=0) # 订阅主题
  56.  
    client.loop_forever()
  57.  
     
  58.  
    # 执行
  59.  
    main()
  60.  
     
  61.  
     
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkiiih
系列文章
更多 icon
同类精品
更多 icon
继续加载