Funpack第三季第一期——无线温度检测
该项目使用了Silicon Labs XG24-EK2703A,实现了无线温度检测系统的设计,它的主要功能为:基于CircuitPython读取内部温度并通过蓝牙功能发送到手机上位机实现温度曲线绘制。
标签
Funpack活动
蓝牙
温度检测
XG24-EK2703A
Lucheni
更新2024-03-05
186

项目介绍

本次活动我做了两个小的项目

使用芯片内部的温度检测外设,测量温度并通过蓝牙发送至上位机,在上位机中以“绘图”的形式对温度数据进行可视化。(此项目完成了要求任务一)

②使用板载QWIIC接口连接了0.96寸OLED显示器以及BMP390温湿度传感器,EFR32MG24基于IIC通信读取BMP390传感器的温度数据并将数据在0.96寸OLED显示器中显示(此项目部分完成了任务三)


设计思路

因为我个人更喜欢Arduino开发环境,在搜索后发现SiliconLabs提供了Arduino开发环境,所以就先进行了尝试。

最初我的设想是在Arduino环境下,读取内部温度再基于蓝牙将温度数据发送到另一块带屏幕的esp32开发板,并进行数据显示。

经过初步的尝试,使用getCpuTemp();函数即可获取芯片内部温度传感器的温度数值,此时已经基本完成了任务一的一半。

但尝试了很久,我始终没有调通EFR32MG24 Arduino环境下与esp32进行蓝牙通信,蓝牙id似乎和正常的不太一样。并且我也没有找到更多的资料,所以最终放弃了使用Arduino的方案。

之后看了群里大家的讨论,发现主要使用的有CircuitPython和Simplicity Studio环境,其中Simplicity Studio安装似乎因为网络问题有点小麻烦,CircuitPython环境我相对还比较熟悉,所以选择使用了CircuitPython环境。

Circuitpython环境下开发就相对简单了,Circuitpython是Adafruit维护的类Python开发环境,对于使用蓝牙方面的应用,还开发了Bluefruit APP,基于Adafruit_ble库可以很轻易地进行蓝牙通信和实现上位机显示的需求。

而Circuitpython环境中,也有可以直接读取芯片内部温度传感器温度数值的变量:microcontroller.cpu.temperature

于是参考了Adafruit_ble库的例程后,项目一的主要代码如下:

while True:
for i in range(2):
led[i].value = not led[i].value
print(led[i].value)
print("CPU温度:", microcontroller.cpu.temperature)

ble.start_advertising(advertisement)
print("Waiting to connect")
while not ble.connected:
pass
print("Connected")

while ble.connected:
print("Temperature: %0.1f℃" % microcontroller.cpu.temperature)
result = "%0.1f\n" % microcontroller.cpu.temperature
uart.write(result.encode("utf-8"))
time.sleep(1)

以上代码使用microcontroller.cpu.temperature函数读取芯片内部温度传感器温度数据,并将数据发送到串口在oled屏幕上显示

之后等待蓝牙成功连接,连接后使用uart.write代码将温度数据发送到Bluefruit APP,APP会接受蓝牙串口数据并在绘图器重绘制曲线。

完成了项目一后,我又仔细看了看这块开发板,板载集成了qwiic接口和microBUS接口,算是扩展性能非常丰富的了,由于我手头没有microBUS的传感器,所以选择使用qwiic接口来连接一些iic传感器跑一个简单的小项目,于是就有了项目二

项目二使用了一块0.96oled屏幕和BMP390传感器,屏幕和传感器都板载了qwiic接口,连接到开发板非常简单

基于CircuitPython完成这个项目也不难,Adafruit为这两个外设都提供了相对完备的库和使用指南:

0.96oled:https://learn.adafruit.com/monochrome-oled-breakouts/circuitpython-usage

BMP390:https://learn.adafruit.com/adafruit-bmp388-bmp390-bmp3xx/python-circuitpython

项目二的主要代码如下:

while True:
print("Pressure: {:6.1f}".format(bmp.pressure))
print("Temperature: {:5.2f}".format(bmp.temperature))

color_palette[0] = 0x000000 # White
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)
# Draw a smaller inner rectangle
inner_bitmap = displayio.Bitmap(WIDTH - BORDER * 2, HEIGHT - BORDER * 2, 1)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0x000000 # Black
inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=BORDER, y=BORDER)
splash.append(inner_sprite)
# Draw a label
text = "{:5.2f}".format(bmp.temperature)
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=28, y=HEIGHT // 2 - 1)
splash.append(text_area)

time.sleep(1)

代码使用bmp.temperature读取bmp390的温度数据,再将其格式化后写入oled屏幕的显示缓存,之后通过splash.append将显示缓存发送至oled屏幕进行显示

总结

经过这次活动,我算是第一次比较完整地实用Circuitpython开发单片机,相比于之前主要使用Arduino为主,即使偶尔使用Circuitpython也是使用Mu编辑器,可能是这块开发板不支持原生USB的原因,我对Thonny环境摸索了很久,在库上传的步骤一直有报错。

对于EFR32MG24芯片,Arm内核,支持蓝牙,甚至Sparkfun也为它开发了ThingPlus开发板,其实个人感觉是一颗非常适合diy玩家的芯片,但是在搜索了淘宝等渠道后,发现很少有这颗芯片的散片出售,零星的链接中芯片价格也过百,期待以后能在diy环境中看到这颗芯片的普及。

附件下载
mycode.rar
团队介绍
个人
团队成员
Lucheni
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号