仔爸 发表于 2024-3-29 21:58:54

基于Beetle ESP32 C6开发板和物联网的环境检测

本帖最后由 仔爸 于 2024-3-30 15:02 编辑

物联网环境检测拿到DFROBOT赠送的Esp32C6主控板之后,我就开始“快乐”地玩耍起来。看到前面快乐加了引号,你就知道我当时内心其实挺崩溃的,因为DF目前只提供Arduino的方案。幸亏乔楚老师为DFROBOT的ESP32 C6编译了MicroPython的固件,才能真正快乐地玩起来。首先当然是为板子烧录固件,之前一起使用flash_download_tool_3.9.3版本的软件进行烧录,发现并不支持C6,果然从官网下载V3.9.5版本,支持烧录ESP32 C6,方法与C3、S3等ESP32家族的板子差不多,不再赘述。一、项目概况接下来,首先看一下本项目的基本概况,如下思维导图所示。本项目通过连接到ESP32 C6上的DHT11温湿度传感器获取环境数据,并显示在四位数码管(基于TM1637)上,同时将采集到的数据,通过WIFI发送到SIoT服务器,然后大Mind+的可视化面板展示出来。
二、所需硬件
[*]ESP32 C6
[*]DHT11温湿度传感器
[*]TM1637四位数码管
[*]面板包和杜邦线等
三、项目实现(一)硬件连接根据如图所示进行硬件连接(注意四位数码管上显示的不是时间,而是温度和湿度,中间用冒号隔开)。由于我将排针焊接到ESP32 C6上之后,板子上的引脚编号无法看到,因此可以对照DF知识维库上的图片进行对照。这里我把DHT11的数据引脚接到了板子的7号引脚。将TM1637四位数码管的CLK和DIO分别接到了板子的22和23号引脚。你在连接的时候不一定是这几个引号,只要对应即可。(二)软件编程1.环境数据采集程序刚烧录好固件,通过在交互式编程界面输入help(‘modules’)可以查看该固件内置了哪些模块,通过观察,我们可以发现里面直接内置了DHT模块,省去我们另外去找传感器的驱动模块。此外我们还可以在交互窗口输入以下两条语句,具体查看一下该模块的相关帮助信息,另外还了解到该模块同时支持DHT22传感器。import dhthelp(dht)
因为我们还将使用主板上的7号引脚,需要使用machine模块中的Pin函数。使用下面的语句导入from machine import Pin接下来,通电开始让DHT11工作,使用下面的几条语句d = dht.DHT11(Pin(7)) #创建一个dht对象,并调用接到主板7号引脚上的DHT11模块d.measure() #开始测试t = d.temperature() #获得温度数据h = d.humidity() #获得湿度数据本着强烈的探索精神,如果我们要探索一个具体实例化类里面的变量和方法,我们还可以在交互窗口继续输入以下内容:好了,到此我们已经可以获取传感器上的数据了,不如先将数据打印出来,以下是完整的获取数据并打印出来的程序。import time,dhtfrom machine import Pin d =dht.DHT11(Pin(7)) while True:    d.measure()    t = d.temperature()    h = d.humidity()    print(str(t)+''+str(h))       time.sleep(3)    2.将数据显示在数码管上接下来我们考虑将获取到的温湿度数据显示在一个物理设备上,手头正好有一个基于TM1637芯片的四位数码管,因为只要显示数字,也就不考虑液晶屏了。要使用这个硬件,通过help(‘modules’)没有发现可以使用的驱动模块,好在互联网上有许多资源,轻松就可以获取到,前提是我们要知道一些硬件的参数。一般在购买硬件的页面有提供,有些商家甚至服务到家,连各类驱动程序一并提供。我们在搜索引擎中搜索关键字:github micropython tm1637,在搜索结果中仔细排查寻找,终于找到它了。正所谓:“众里寻他千百度,蓦然回首,那人却在,灯火阑珊处”,只是这次我没有用百度,用的是必应,真是有求必应啊。但转念一想,是不是也在百度中找找看呢,结果不看不知道,一看吓一挑,好家伙,有长进啊,大大地好。进入Github仓库,将这个库下载。将下载包解压后,找到里面的tm1637.py文件,将它上传到板子上,我在Thonny中进行操作,单击“视图>文件”,左侧会出现ESP32 C6板子上空间的文件列表,为了更好地管理第三方库,我们创建一个lib文件夹,并将tm1637.py上传到该文件夹内,后面用到的siot.py文件也将传到这里。如果你还不会使用Thonny连接ESP32并进行文件上传下载及编程,请查看这篇文章:《Beetle ESP32 C3 初体验》
好了,准备好了这个库,我们可以通过下面的语句将这个库引入我们的程序:from lib import tm1637我们可以将lib文件夹看成一个大库的集合,要从这个大集合中找到需要的库,用from,如果你不创建文件夹,直接将tm1637.py上传到板子的根目录,那么下面这条语句就可以了。importtm1637是不是瞬间觉得import和fromimport不那么胡搅蛮缠啦。刚才连接硬件的时候,我们已经将四位数码管的clk和dio连接到板子的22,23号引脚,因此通过下面这条语句来创建一个新的对象中以。tm =tm1637.TM1637(clk=Pin(22),dio=Pin(23))当然,打开tm1637.py去看一看这个库里面是如何编写的,里面有哪些函数和方法,也是一种非常好的探究学习的方式。通过查看tm1637.py文件内容,或者查看github上的简介,我们可以找到一些有用的信息,比如显示数字可以用number或numbers方法。然后我们可以修改程序为(加粗的为新增语句):import time,dhtfrom machine import Pinfrom lib import tm1637 d =dht.DHT11(Pin(7))tm = tm1637.TM1637(clk=Pin(22),dio=Pin(23)) while True:    d.measure()    t = d.temperature()    h = d.humidity()    print(str(t)+''+str(h))       tm.numbers(t,h)    time.sleep(3)    运行程序,温湿度传感器获取的数据就显示在四位数码管上了,是不是很神奇。Python就是这么神奇,你只要拿用模块直接使用,而不需要深究它的实现过程。3.将数据发送到SIoT服务器数据获取了,也显示出来了,接下来我们一不做二不休,将数据发送出去,送到物联网服务器吧,这里采用SIoT V2。之前我写过类似的文章,如《Beetle ESP32 C3 通过网络获取气象数据》。进入https://github.com/vvlink/SIoT,下载这个仓库有点大,因为包含了SIoT整个开源代码,那么我们就只要找到siot.py模块,想办法把它拿下来就行了。如果你不会单独将这个文件下载下来,那么你就在附件里面下载吧。然后将soit.py文件上传到ESP32 C6板子的lib文件夹内。仍使用下面的语句将其引入from lib import tm1637,siot且慢,SIoT服务器在哪?目前V2版本由DFROBOT在开发维护,处于测试阶段,从下面的网址下载,解压后双击startSIoT.bat运行(出现黑色终端窗口表示运行)。https://mindplus.dfrobot.com.cn/dashboard通过上图中的本机IP访问SIoT服务器,并创建两个主题,这两个主题名字在程序中将使用。请确保ESP32 C6和SIoT服务器在同一个局域网段,比如连接同一个路由器,或者本机是笔记本的话,将笔记本作为热点。然后在程序中首先添加连接WIFI:def do_connect():    import network    wlan = network.WLAN(network.STA_IF)    wlan.active(True)    if not wlan.isconnected():       print('connecting to network...')      wlan.connect('无线名称', '密码') # 此处填写无线热点的信息      while not wlan.isconnected():            pass    print('network config:', wlan.ifconfig())do_connect()然后创建对象并连接:IOT_UserName = "siot"IOT_PassWord = "dfrobot"SERVER = "192.168.0.105" CLIENT_ID= ""# 设置客户端IDsiot.init(CLIENT_ID,SERVER,user=IOT_UserName,password=IOT_PassWord) siot.connect()然后就可以往服务器发送数据了,注意发送数据的前缀“->”可以实现将数据保存在服务器端。while True:    d.measure()    t = d.temperature()    h = d.humidity()    print(str(t)+''+str(h))    siot.publish(b"siot/温度", (str('->')+str(t)))    siot.publish(b"siot/湿度", (str('->')+str(h)))    tm.numbers(t,h)    time.sleep(3) 4.可视化面板显示数据SIoT服务器上有了数据,我们就可以在Mind+1.8的可视化面板中将其显示出来。具体操作可以参考文章:《Beetle ESP32 C3 通过网络获取气象数据》四、完整程序import time,dhtfrom machine import Pinfrom libimport tm1637,siot def do_connect():    import network    wlan = network.WLAN(network.STA_IF)    wlan.active(True)    if not wlan.isconnected():      print('connecting to network...')      wlan.connect('bitcode', 'bitcode.vip')# 此处填写无线热点的信息      while not wlan.isconnected():            pass    print('network config:', wlan.ifconfig()) do_connect()time.sleep(0.5) IOT_UserName= "siot"IOT_PassWord= "dfrobot"SERVER ="192.168.0.105"#mqtt_port= 1883 CLIENT_ID= ""# 设置客户端IDsiot.init(CLIENT_ID,SERVER,user=IOT_UserName,password=IOT_PassWord) siot.connect() #client =MQTTClient(client_id, mqtt_server,mqtt_port,mqtt_user, mqtt_password)# 创建MQTT客户端实例#client.set_callback(sub_cb)#client.connect()# 连接到MQTT服务器 tm =tm1637.TM1637(clk=Pin(22),dio=Pin(23))d = dht.DHT11(Pin(7)) while True:    d.measure()    t = d.temperature()    h = d.humidity()    print(str(t)+''+str(h))    siot.publish(b"siot/温度", (str('->')+str(t)))    siot.publish(b"siot/湿度", (str('->')+str(h)))    tm.numbers(t,h)    time.sleep(3)    siot.stop()   
五、项目反思在本项目的实现过程中,对于连接物联网服务器,我尝试了几种方法,比如使用umqtt/simple连接EMQX和SIoT,但前者没有连接成功,后者连接不稳定,所以最终采用siot.py模块来实现连接。
实现了温湿度数据的采集,接下来我们就可以扩展其他数据的采集,如环境噪音,光线,天气数据等。也可以通过订阅SIoT主题并获得相关消息来控制一些硬件的开关和运行。

余老师 发表于 2024-4-6 20:57:20

厉害,不过看着感觉过程挺复杂的。

地下铁 发表于 2024-4-16 09:30:31

非常棒,学习!!!
页: [1]
查看完整版本: 基于Beetle ESP32 C6开发板和物联网的环境检测