DIY低功耗BLE传感器 - 硬件篇

把床头灯换成智能灯泡有一段时间了,最大的痛点是开关灯需要:

  1. 打开手机
  2. 打开Home Assistant软件
  3. 点击开关

这一连串操作过于冗长,不过比强行伸手去按一米外的开关强了几千倍的。于是想购入一款无线开关,打开购物软件,发现价格都在四五十左右,感到难以接受。遂进入了DIY无线开关这一大坑。

选型  

Wi-Fi是第一个被我排除的,功耗高,连接慢(指上电后的建立连接过程),且给我带来过很多不好的体验。

对于Zigbee,比较合适的MCU有ESP32-C6/H2和TLSR8258。前者略贵。后者厂家略高冷:对于我等散户野人只能在淘宝官方店购买,还要20块运费,除此之外没有别的购买渠道。且下载必须买专用的下载器。不过官网SDK随便下这一点就已经吊打了一众天天要你签NDA的SB芯片厂了,值得表扬。

于是最终选择了BLE,MCU使用我之前就用过不少次的CH582,一直觉得不错,简单、便宜、低功耗。

电路设计  

image-20240915212142427

两个按键一个用了PB22,正好兼作为BOOT按键。下载程序使用串口,本来是想着体积比A口小,焊接比C口容易,还能顺便输出调试信息,没留电源输入引脚是懒得做双电源OR-ing。

看着一堆空着的IO感觉有点浪费,所以强行加了一个温湿度传感器,然而I2C忘记加上拉了,等下版本修复吧。

因为用的是纽扣电池,所以给电池两边并了一个电容,试图缓解发送时电流增加造成的电池压降,不过实际看来100uF效果还是有限。从纽扣电池蓝牙温湿度计CR1220+CH592F+SHT40学到的。

因为元器件很少,所以瞎点点很快就完成了layout。天线试图做了一下阻抗匹配,不过由于缺乏理论知识,可以约等于没有阻抗匹配。

image-20240915215146973

打样 & 焊接  

导出Gerber,到嘉立创下单,准备好元器件,开焊!焊接时强推使用InteractiveHtmlBom插件,可以很方便地找到对应元器件。因为焊点不多,就没订钢网,自己随便上了点锡膏,风枪吹完再用烙铁修一下多出来的锡,最后用酒精棉片稍微擦了擦,完事。

验证  

焊好之后简单量了下没有短路,就接上电源和USB转串口,准备把程序烧进去看看了。不过我之前用的wchisp不支持串口下载,找了一圈也只找到沁恒官方的WCHISPTool_CMD,吐槽下这个软件的奇怪逻辑:首先,你必须有一个配置文件,这个配置文件呢,肯定是没有文档的,想要获得这个配置文件的唯一方法是打开沁恒的WCHISPStudio,导出一份配置文件。不过它只有Windows版本,使用wine打开效果是这样的:

打开就是一片灰色,鼠标飘过去或者右击一下能多显示出来一点点控件,我也不想管是什么原因了,费劲把所有控件召唤出来之后稍微根据需求选了一下,导出了配置文件。

[Public]
MCUName=CH582
bMCULine=6
bMCUType=130
DataFlashFile=.
swzUserFile1=.
swzUserFile2=.
swzUserFile3=.
swzUserFile4=.
swzUserFile5=.
DataFlashFileSel=0
IsUserFile1Sel=0
IsUserFile2Sel=0
IsUserFile3Sel=0
IsUserFile4Sel=0
IsUserFile5Sel=0
[CH57x-58xUICfg]
bDnInterType=1
Baud=115200
DwnldCfgPin=PB22
BootPinNum=1
WProtectAddr=.
IsCodeProtect=1
IsRSTAsInputPin=1
IsSerialNoBtnDwnld=1
IsClearDataFlash=0
IsEraseAllCFlash=0
IsAfterDownRest=1
bVerifyType=0

导出配置文件后我以为万事大吉,照着使用说明尝试下载:

./WCHISPTool_CMD -p /dev/ttyUSB0 -c ./CH582.INI -o flash -f ./BTN582.hex

具体报错有点忘了,大致是找不到设备之类的。怀疑是不是没焊好,检查了好几遍原理图,又拿万用表、示波器到处量,始终找不到问题所在。最后,我想起了使用说明中被我忽略的一步:

第一次看到这一步的我是非常不解甚至不屑的,无法理解这个软链接存在的意义,于是直接跳过了这一步。在查了一圈走投无路之后,我只能试着创建了一个链接,然后用它来烧录。成功了。我当场就愤怒了,直接掏出Ghidra,发现上面传进去的/dev/ttyUSB0会被转换成0,然后下载的时候,某个静态库会把这个0和硬编码的/dev/ttyISP拼接起来,作为待下载设备的路径,非常反人类。不理解、不原谅。