0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Raspberry Pi Pico的云端温湿度监测站设计

我快闭嘴 来源:易心Microbit编程 作者:CircusPi 2022-09-13 11:52 次阅读

一、介绍

使用Pi Pico 搭配扩展板以及各种传感器模块,再加上网络相关模块将搜集到的数据上传云端,完成一个简易的云端温湿度监测站。

二、软件安装

安装Thonny IDE以及MircoPython Firmware的刻录。

三、硬件配置

我们这次会使用到的模块有SHT3x温湿度模块、1.3 OLEDLED灯模块以及AM7020 NBIoT网络模块,接线方式如下对照图表所示。

0dcacf56-3272-11ed-ba43-dac502259ad0.png

0e0132c6-3272-11ed-ba43-dac502259ad0.jpg

实际功能为将读取到的温湿度数据显示到1.3 OLED上,以及定时将数据透过AM7020上传云端,并且提供远程网页控制LED灯的功能,除了控制LED灯外也可结合继电器实现控制家电(e.g.电灯、电扇、浇水设备……等)。

四、云端设定

这次我们会使用Adafruit IO做为云端平台,它将会存放温度、湿度,以及LED灯控制讯息相关数据,并且透过内建服务Dashboard将数据以图形化方式呈现。

进到Adafruit IO官网新增三个Feed,分别为「temperature」、「humidity」、「led」,如下图所示。

0e1c95f2-3272-11ed-ba43-dac502259ad0.png

接着请新增一个Dashboard,名称为「pico」,如下图所示。

0e2c29c2-3272-11ed-ba43-dac502259ad0.png

继续在pico Dashboard内新增折线图表以及按钮开关,折线图数据源选择Feedtemperature」、「humidity」,按钮开关数据源选择Feedled」,如下图所示。

0e4cd208-3272-11ed-ba43-dac502259ad0.png

五、程序撰写

本篇所用到的范例程序代码可至下列连结下载

https://github.com/JiekangHuang/pi_pico_adafruitIO_nbiot

()加载相关Library

为了简化程序代码复杂度,我们将会使用AM7020SHT31OLED MicroPython Library 来处理Driver 的部分,请将这三个Library 预先存入Pi Pico内以便之后主程序呼叫。

首先使用Thonny从本机开启要存入的档案,并选择档案>>另存新檔>>Raspberry pi pico>>输入文件名(需与原档名相同)

Pico Library档案结构如下图所示。

第一层为lib文件夹

0e70737a-3272-11ed-ba43-dac502259ad0.png

lib文件夹里为「am7020」文件夹、「sht31.py」、「ssd1306.py」。

0e86eb00-3272-11ed-ba43-dac502259ad0.png

am7020文件夹里为「am7020_modem.py」、「am7020_mqtt.py」、「am7020_nb.py」。

0ea05edc-3272-11ed-ba43-dac502259ad0.png

()程序设计

开启打开范例「example/adafriotIO_pico.py」并执行。

1 fromutime import ticks_ms, sleep_ms

2 fromam7020.am7020_nb import AM7020NB

3 fromam7020.am7020_mqtt import AM7020MQTT

4

5 importsht31

6 frommachine import Pin, I2C

7 fromssd1306 import SSD1306_I2C

8

9 sht31_i2c= I2C(1, scl=Pin(7), sda=Pin(6), freq=400000)

10sensor = sht31.SHT31(sht31_i2c, addr=0x44)

11

12 WIDTH= 128 # oled 显示宽度

13HEIGHT = 64 #oled 显示高度

14

15 # 初始化 I2C 物件 I2C0 SCL =1, I2C0 SDA = GP0

16oled_i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000)

17

18 oled= SSD1306_I2C(WIDTH, HEIGHT, oled_i2c)

19

20 led =Pin(20, Pin.OUT)

21

22 #NBIoT 相关设定

23 apn ="twm.nbiot" # 存取点名称

24 band= 28 # 通讯频道

25CHECK_NET_INTERVAL_MS = 1000 # 网络检查间隔时间

26

27#相关设定

28MQTT_BROKER = "io.adafruit.com"

29 PORT= 1883

30 MQTT_USERNAME= ""

31MQTT_PASSWORD = ""

32TEMP_TOPIC = MQTT_USERNAME + "/feeds/pico.temperature"

33HUM_TOPIC = MQTT_USERNAME + "/feeds/pico.humidity"

34LED_TOPIC = MQTT_USERNAME + "/feeds/pico.led"

35UPLOAD_INTERVAL_MS = 30000 # 讯息上传间隔时(毫秒)

36

37 nb =AM7020NB(0, 9600, 0, 1, 3, False) # 建立连接对象

38 mqtt= AM7020MQTT(nb) # 建立 MQTT 通讯对象

39

40

41 defnbConnect(): # ⾃订联机程序

42 print("Initializing modem...")

43 while((not nb.init() or (notnb.nbiotConnect(apn, band)))):

44 print(".")

45

46 print("Waiting for network...")

47 while(not nb.waitForNetwork()):

48 print(".")

49 sleep_ms(5000)

50

51 print(" success")

52

53

54 defreConnBroker(): # MQTT Broker 重新联机程序

55 print("Connecting to",MQTT_BROKER, end="...")

56 if(mqtt.connBroker(MQTT_BROKER, PORT,MQTT_USERNAME, MQTT_PASSWORD, mqtt_id="ICSHOP_AM7020_MQTT_ID")):

57 print(" success")

58 print("subscribe: ",LED_TOPIC, end="")

59 if(mqtt.subscribe(LED_TOPIC,mqttCallback)):

60 print(" success")

61 else:

62 print(" fail")

63 else:

64 print(" fail")

65

66 #MQTT 订阅内容讯息回调函数

67

68

69 defmqttCallback(msg):

70 print(LED_TOPIC, ":", msg)

71 if(msg == "ON"):

72 led.on()

73 else:

74 led.off()

75

76

77chk_net_timer = 0 # 联机状态查询周期定时器

78pub_data_timer = 0 # 讯息发布周期定时器

79

80 oled.fill(0) # 清除画面

81oled.text("Init modem...", 0, 0)

82oled.show()

83

84print("Initializing modem...")

85while(not nb.init()):

86 print(".")

87

88while(True):

89 # show SHT31 data

90 oled.fill(0) # 清除画面

91

92 t = round(sensor.get_temp_humi()[0], 1)

93 h = round(sensor.get_temp_humi()[1], 1)

94 # print("Temperature: {}".format(t))

95 # print("Humidity:{}".format(h))

96

97 if(ticks_ms() > chk_net_timer): # 联机状态查询周期

98 chk_net_timer = ticks_ms() +CHECK_NET_INTERVAL_MS

99 if(not nb.chkNet()):

100 oled.fill(0) # 清除画面

101 oled.text("ISP Connecting", 0, 0)

102 oled.show()

103 nbConnect()

104 oled.fill(0) # 清除画面

105 oled.text("ISPConnected", 0, 0)

106 oled.show()

107 if(not mqtt.chkConnBroker()):

108 oled.fill(0) # 清除画面

109 oled.text("MQTTConnecting", 0, 0)

110 oled.show()

111 reConnBroker()

112 oled.fill(0) # 清除画面

113 oled.text("MQTTConnected", 0, 0)

114 oled.show()

115

116 if(ticks_ms() > pub_data_timer): # 讯息发布周期

117 pub_data_timer = pub_data_timer +UPLOAD_INTERVAL_MS

118 print("publish: ", t,end="")

119 if(mqtt.publish(TEMP_TOPIC, str(t))):

120 print(" success")

121 else:

122 print(" Fail")

123 print("publish: ", h,end="")

124 if(mqtt.publish(HUM_TOPIC, str(h))):

125 print(" success")

126 else:

127 print(" Fail")

128 mqtt.procSubs() # 检查订阅频道状态

129 oled.text("MQTT Connected", 0,0)

130 # 加入文字内容

131 oled.text("Temp: ", 0, 10)

132 oled.text(str(t), 50, 10)

133 oled.text("*C", 90, 10)

134

135 oled.text("Humi: ", 0, 20)

136 oled.text(str(h), 50, 20)

137 oled.text("%", 90, 20)

138 oled.show() # 显示绘制内容

程序代码说明:

1. 引入这次实作所需模块。

0eb7e9a8-3272-11ed-ba43-dac502259ad0.png

2. 建立并传入I2C1建立SHT31对象,用来读取温湿度;建立并传入I2C0建立OLED对象,用来操作OLEDOLED设定宽高为128*64;建立LED对象,pin设定为20,并设为输出,用来显示网页控制开关状态。

0ed2e55a-3272-11ed-ba43-dac502259ad0.png

3. 设定NBIoT 模块所使用的APNBand(不同电信商会不一样,此为台湾大哥大,Band 28),设定MQTT相关参数Broker 使用Adafruit IOPort 使用1883,账号密码请自行修改,设定温湿度、LED Topic,请务必与云端设定相同,35行设定数据上传云端的间隔,使用者可自行依需求调整,这里设为30秒上传一次;建立AM7020AM7020MQTT对象,用来将数据发送至云端平台。

0ef11264-3272-11ed-ba43-dac502259ad0.png

4. 定义NBIoT 联机程序,呼叫AM7020对象init 初始化方法以及nbiotConnect 方法直到成功,接着呼叫waitForNetwork 方法等待联机完成。

0f1748c6-3272-11ed-ba43-dac502259ad0.png

5. 定义MQTT 重新联机程序,使用AM7020MQTT对象的connBroker 方法联机到指定Broker,这里须注意每个装置的mqtt_id不可相同,若相同Broker 将会剔除上一次的联机,联机完毕后使用AM7020MQTT 对象的subscribe 方法订阅LED Topic,并传入callback(于下一段说明),用以接收LED开关状态。

0f3a7a1c-3272-11ed-ba43-dac502259ad0.png

6. 定义LED数据的Callback,当AM7020MQTT对象收到LED主题数据时就会呼叫此方法,在此方法里面判断讯息并控制LED亮灭。

0f61c130-3272-11ed-ba43-dac502259ad0.png

7. 建立检查联机状态、发布数据的定时器;将OLED画面清除并显示初始化讯息,并等待NBIOT模块初始化成功。

0f7b2d00-3272-11ed-ba43-dac502259ad0.png

8. 进入无穷循环,92~93行读取温湿度数据,97~114定时检查NBIOT以及MQTT的联机状态,若中间有断线便会呼叫上面定义的重新联机方法,并透过OLED显示目前状态。

0f9b378a-3272-11ed-ba43-dac502259ad0.png

9. 透过定时器的方式定时发送温湿度数据到云端(默认为30秒上传一次),发送数据使用AM7020MQTT对象的publish方法,参数带入目标Topic以及要发布的讯息。

0fc4b83a-3272-11ed-ba43-dac502259ad0.png

10. 128行使用AM7020MQTT对象的procSubs方法检查是否有订阅数据到达;将温湿度数据显示到OLED上。

0fea17f6-3272-11ed-ba43-dac502259ad0.png

六、执行结果

完成以上步骤,并执行范例程序代码,我们就可以在OLED及云端上看到温湿度数据,并且可以直接透过网页按钮控制Pico LED灯,如下图所示。

0fff6f2a-3272-11ed-ba43-dac502259ad0.jpg

10200e74-3272-11ed-ba43-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OLED
    +关注

    关注

    118

    文章

    5975

    浏览量

    221309
  • 监测站
    +关注

    关注

    0

    文章

    261

    浏览量

    10519

原文标题:如何使用 Raspberry Pi Pico 实现 IoT 物联网?

文章出处:【微信号:易心Microbit编程,微信公众号:易心Microbit编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    温湿度监测的应用和必要性

    工控技术发展有限公司将为药品工业中与温湿度相关的重要环节提供全面可靠的产品和解决方案,如制药原料的仓储环境监测、药品和药品杀菌灭菌工艺验证、药品运输环境监测、实验室净化车间环境及设备监测
    发表于 04-25 19:46

    智能温湿度监测 温湿度传感器使用

      1、智能温湿度监测是档案管理发展的必然与趋势  随着社会不断发展与进步,档案分类越来越细化,涉及的内容越来越丰富,信息量和数量越来越大。全国有数以万计的大大小的档案馆,其中有许多非常重要的机要
    发表于 07-03 11:02

    【OneNET麒麟座试用申请】空气质量数据监测站

    项目名称:空气质量数据监测站试用计划:空气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测:1、测试采集PM25数据,包括室内、野外数据2、测试烹调烟气对环境PM25
    发表于 04-05 15:03

    【Thunderboard Sense试用申请】移动空气质量监测站

    项目名称:移动空气质量监测站试用计划:项目描述:基于EFR32系列平台,开发可移动式空气质量监测站,板上温湿度传感器监测空气温度湿度,压力传
    发表于 05-19 17:10

    基于LoRa无线技术温湿度监测解决方案

    有效措施调节库内的温湿度。因此,建立实时的温湿度监控系统,并保存完整的历史数据成为存储行业领域的关键。基于四信LoRa无线技术的温湿度传感监测“云”是利用四信LoRa无线通信技术对仓储
    发表于 06-12 18:42

    库房无线温湿度监控方案 无线温湿度监控系统 仓储物流无线温湿度

    的日常生活和周围环境的温湿度息息相关,石油、化工、航天、制药、档案保管、粮食存储等领域对温湿度也有着较高的要求。因此,对温湿度监测和控制已成为生产过程中非常重要的技术?。无线网络的飞
    发表于 03-01 10:15

    水质监测站在智能水产养殖监测系统中有何应用

    水质监测站的功能特点有哪些?水质监测站在智能水产养殖监测系统中有何应用?
    发表于 09-26 07:42

    中山微型水质多参数在线监测站安装案例

    一.产品概述润越环保微型水质多参数在线监测站采用岸基方式,以小型无线水质监测终端为核心元素,布置在河流、水库、湖泊、饮用水源的岸边。监测站采用移动通讯为传输媒介,以大屏幕显示器和zhong央服务器为
    发表于 12-13 19:10

    如何实现环境参数智能监测站设计?

    如何实现环境参数智能监测站设计?
    发表于 12-20 07:38

    Raspberry Pi Pico搭载DHT11测量温湿度的方法

    “DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。”01—DHT11简...
    发表于 01-10 08:09

    使用raspberry pi Pico的原因

    使用raspberry pi Pico的原因在硬件产品(单片机)的开发中我们往往需要借助一些额外的仪器/设备进行产品的辅助测试, 假设我们需要一个IO+ADC类型辅助设备, 以往的做法是 原理图
    发表于 02-07 09:16

    温湿度监测

    进行温湿度的仿真,采用PROTEUS进行粮仓温湿度的检测与控制。
    发表于 05-11 14:33 25次下载

    大气网格化空气监测站产品介绍

    BYQL-AQMS大气网格化监测站是我公司生产的新型空气质量在线多参数监测系统,主要监测PM2.5、PM10、CO、SO2、NO2、O3、TVOC、温湿度等多种参数。
    发表于 06-21 08:55 3784次阅读

    管式土壤墒情监测站监测方案

    原理为基础,能够测量不同层次土壤中水分含量以及温湿度状态。它的检测过程为动态过程,最高可以检测5层土壤温湿度状态,最低可以检测3层土壤温湿度状态,带有倾角的设备可以监测土壤的倾斜角度来
    的头像 发表于 08-06 16:46 1437次阅读
    管式土壤墒情<b class='flag-5'>监测站</b><b class='flag-5'>监测</b>方案

    基于树莓派Raspberry Pi Pico的自动浇花系统

    方案介绍该项目,我们将使用 Raspberry Pi Pico 制作一个自动浇水系统,每 8 小时或根据土壤湿度水平给植物浇水一次。硬件部件1. 树莓派
    发表于 12-27 15:34 5次下载