【2024 DigiKey 创意大赛】AI环境监测站-硬件部分
本帖最后由 MioChan 于 2024-10-15 16:22 编辑<div>本次创意大赛我要制作的是一个AI环境监测站,我选择的开发板是Adafruit MatrixPortal M4,整个硬件方面的实现基于Circuit Python。选这个板子主要是因为它专门为驱动点阵屏设计,自带HUB75接口,可以直接插到点阵屏上。如果是用其他开发板需要自己连接差不多16条线,对于IO引脚少的板子再拓展其他功能也很麻烦。另外这个板子还带有一个i2c接口,对于Adafruit的传感器可以直接用4p连接线连接。</div>
<div> </div>
<div><strong>本帖主要是分享一下环境数据采集及其显示相关的硬件部分的设计</strong><strong>过程</strong><strong>,至于AI是一套单独的系统,后面再做介绍。我是比较喜欢</strong><strong>高内聚低耦合</strong><strong>的设计,一套系统就做一件事情,几套系统间可以互现协作,哪一套也都能拿来单独使用。</strong></div>
<div>首先是点阵屏的驱动,因为板子自带了HUB75接口,直接扣到点阵屏上连接好屏幕的电源线即可。</div>
<div></div>
<div>板子出厂自带了一个重力感应的沙漏程序,可以简单测试一下板子功能是否正常,确定好没问题后,即可开始刷入Circuitpy固件了。</div>
<div>我使用的是CircuitPython 9.1.4 可以在这里下载https://circuitpython.org/board/matrixportal_m4/</div>
<div>烧录过程也很简单,连接开发板到电脑,双击开发板上的reset按钮,NeoPixel RGB LED变为绿色后,电脑中会出现一个MATRIXBOOT的磁盘,将刚刚下载好的.uf2文件拖到MATRIXBOOT中即可。接下来开发板会重启,然后出现一个新的名为 CIRCUITPY的磁盘,接下来在里面就可以写代码了。</div>
<div>该开发板主要实现的功能如下:</div>
<p> </p>
<p><span style="font-size:16px;"><strong>1.显示环境信息:</strong></span><br />
<br />
设计了一套UI,屏幕会滚动显示各项环境指标,每一屏最多显示三项,滚动播放。对于部分指标数值过长,导致单位显示不下的问题,也额外增加了相应的逻辑,用来滚动显示这些显示不下的内容。</p>
<p> </p>
<p><span style="font-size:16px;"><strong>2.自定义弹幕文字显示:</strong></span><br />
该功能主要是用来滚动显示一些弹幕文字,通过网络功能实现。本来想和之前的项目一样做一个接受POST请求的API服务器,但这个版本的CircuitPy似乎对网络底层库支持的不太好,使用之前在Adafruit ESP32S3 TFT Feather的代码总是出问题,最后看了一下官方文档发现adafruit_matrixportal 已经包含了一些网络功能的实现,最后想了想决定通过Adafruit IO <a href="https://io.adafruit.com" target="_blank">https://io.adafruit.com</a>/ 来解决这个问题,这既简化了网络通信的复杂性,又能利用已经成熟的工具来处理数据。Adafruit IO 提供了一个相对容易上手的接口,可以通过publish和subscribe来接收和显示文本信息。在项目中,我将设备连接到Adafruit IO的服务中,创建了两个feed一个用于接受弹幕内容另一个定义弹幕颜色。通过订阅feed,我能够实时地从远程设备或应用发送数据,并在点阵屏上滚动显示。并且这样也解决了之前只能内网访问的问题,通过Adafruit IO服务托管这些信息,我们可以在任意位置的连接互联网的电脑上发布或订阅这些内容。最重要的是Adafruit IO也有相应的python库,我们也可以在其他python服务程序中更新这些内容。当然,已经做了中文字库支持。</p>
<p> </p>
<p>比较简单的例子是我们可以直接在io的dashboard创建一个面板为feed手动赋值。<br />
</p>
<p> </p>
<p>76c1c87d153eba290d29031939a4ad69<br />
</p>
<p> </p>
<p> </p>
<p><span style="font-size:16px;"><strong>3.传感器接入:</strong></span><br />
建立好显示环境信息的UI后接下来就是实际连接传感器了,更新面板的数据了<br />
下面是我用到的气体传感器<br />
<br />
BME680 是来自 Bosch Sensortec 的环境传感器,能够同时检测多种环境参数,广泛应用于空气质量监测。它集成了气体、湿度、压力和温度传感器。<br />
<br />
SGP30 是 Sensirion 开发的一款空气质量传感器,主要用于检测空气中的二氧化碳 (CO₂) 和总挥发性有机物 (TVOC)。<br />
<br />
MiCS-5524 是一款半导体气体传感器,专门用于检测一氧化碳 (CO) 和甲烷 (CH₄) 等有害气体。它基于金属氧化物半导体 (MOS) 技术,能够在低浓度下对一氧化碳表现出高度灵敏性。因为不支持i2c所以直接用飞线连接到了A0引脚。<br />
<br />
将上面的传感器连接到开发板即可。<br />
顺便一提,Adafruit这些i2c接口的连接线(上)和常用的4p80mm连接线(下)的线序并不一样,我们需要在另一端做一个交叉。简单来说,用尖嘴镊子把接线端子顶出来,换到镜像的位置即可。<br />
</p>
<p> </p>
<p><span style="font-size:16px;"><strong>4.数据记录功能:</strong></span></p>
<div>既然是环境监测站自然要有保存历史数据的功能,这里我最初的是想法是将传感器数据写入到板载存储器中。不过这样有个很大的问题,这些数据只有连接到这个板子的电脑才能读取,用网络实现不仅麻烦,如果外部设备频繁请求这些信息也会大量消耗板子有限的计算资源。最后还是想到了用Adafruit IO,我们可以在IO中创建不同环境指标的feed,让板子定时上传这些数据到IO上,这样不仅能记录历史数据,其他应用能非常方便的获取这些数据,还能直接在IO创建一个环境监测面板直接查看这些数据,也不需要再额外设计一个软件来画图了。</div>
<div>下面是监测面板的效果:</div>
<div></div>
<div> </div>
<div> </div>
<div><span style="font-size:16px;"><strong>遇到的坑:</strong></span></div>
<div>这里也顺便分享一下目前为止折腾这个项目遇到的坑。首先是传感器部分,因为这几个传感器也是第一次玩,实际上手后才发现,感觉被描述欺骗了。</div>
<div>比如BME680,虽然手册上生成可以测VOC,但是传感器只能返回气体电阻值,当VOC上升这个值会减小,反之则上升。也就是说这个传感器无法测得实际的VOC。有一个BSEC库倒是能够将气体电阻值转换为标准的空气质量指数 (IAQ) ,但是这个库是闭源的,也没有Circuitpy版本,但发现这个问题的时候几百行代码都写完了,当初立项也说的是用Crcuitpy来做,也不好换Arduino。还有就是MiCS-5524虽然文档说能测各种气体,但实际上只能测这些气体是否存在,而不能准确分辨是哪种气体,只能当一个有害气体警报器用。</div>
<div> </div>
<div>还有最大的一个坑是VScode中Circuitpy插件的,git上好久没维护了,现在最新版本的完全用不了,git上也全是在反应这个bug的也没人解决。</div>
<div><strong></strong></div>
<div><strong></strong></div>
<div> </div>
<div>换成官方推荐的Mu编辑器虽然能用,但代码补全真的差VScode那个插件太多了,后续再做项目还是考虑Micropy或者Arduino吧</div>
<div><strong></strong></div>
<div> </div>
<div><span style="font-size:16px;"><strong>后续计划:</strong></span></div>
<div>其实主体上项目已经完成了,后续打算为这个点阵屏设计一个底座并3D打印出来。</div>
<div>关于AI部分,主要是想接入一个LLM(大语言模型)。实现让AI助手能读取这些环境信息,给出一些建议之类的,并通过TTS读出来。</div>
<div>此外,有余力的话也想继续用Unity实现一个3D模型,给LLM一个皮囊,放到我之前做的那个全息显示器中。</div>
<div> </div>
<div> </div>
<p><!--importdoc--></p>
<p>气体传感器一般都不会返回具体浓度,都得自己转换,有些值还和温度有关。</p>
wangerxian 发表于 2024-10-15 18:20
气体传感器一般都不会返回具体浓度,都得自己转换,有些值还和温度有关。
<p>关键这些库都没有Circuitpy的就很麻烦<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loudly-crying-face_1f62d.png" width="28" /></p>
页:
[1]