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
    +关注

    关注

    119

    文章

    6198

    浏览量

    224160
  • 监测站
    +关注

    关注

    0

    文章

    314

    浏览量

    11079

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

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

收藏 人收藏

    评论

    相关推荐

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

      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

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

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

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

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

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

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

    使用raspberry pi Pico的原因

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

    基于 LabVIEW 的温湿度监测系统设计与实现

    基于LabVIEW的温湿度监测系统123456
    发表于 11-24 16:59 60次下载

    温湿度监测

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

    土壤墒情监测站是什么,它的应用优势都有哪些

    监测站。 土壤墒情监测站是什么?土壤墒情监测站是一款集土壤温湿度采集、存储、传输和管理于一体的土壤墒情自动监测系统。它连接的传感器可持续
    的头像 发表于 11-09 11:05 2984次阅读

    田间小气候监测站有什么作用

    田间小气候监测站可用于田间大棚内空气温度、湿度、光合作用强度以及二氧化碳浓度、土壤温湿度进行自动监测,并且快速准确收集监测数据,更好的分析田
    发表于 07-23 10:08 548次阅读

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

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

    库房温湿度自动监测系统

    仓储、库房在管理上,环境控制都是重中之重。库房温湿度自动监测系统作为一种更为便捷的解决方案,已经得到广泛的应用。 库房温湿度自动监测系统通过集成传感器、数据采集器、传输设备和管理平台等
    的头像 发表于 07-09 18:00 703次阅读

    温湿度监测系统应用

    在现代化工业生产、仓储管理、农业种植以及智能家居等领域,温湿度监测已成为不可或缺的一环。温湿度作为环境控制的关键因素,直接影响着产品质量、存储安全、作物生长效率以及居住舒适度。因此,一套高效、精准
    的头像 发表于 07-26 16:15 403次阅读