某存在感很弱的屑温湿度计(),美其名曰 Sensor Acquisition Unit(传感器采集单元)
SAU-G0(Sensor Acquisition Uinit(传感器采集单元),基于STM32G031G8U6,是本id学习低功耗的试水作品
休眠:约8uA
亮屏运行:约4.0mA(1%屏幕亮度,WS2812不供电)
最大电流30mA以上(OLED屏幕亮度100%,WS2812两通道LED亮度100%)
使用CubeMX tools工具粗略计算(未引入唤醒瞬间的电流):1%的时间运行,99%的时间休眠,每天运行864秒(屏幕亮度为1%),其他时间休眠,那么100mA锂电池极限续航2个月7天
如果每10分钟采集温湿度数据一次,每天采集144次,每次5秒,每天耗时720秒,还剩余144秒可支持每天以1%的亮度亮屏2分钟
每组带两位小数的温湿度数据占用4byte(16bit 16bit),每天储存576byte数据,2个月采集温湿度数据8640组,占用34560byte空间(需使用24C512 EEPROM(65536byte)存储)
PCB采用叠板设计,分为主控板与拓展板,具体应用取决于拓展板上的传感器和存储芯片,你可以绘制自己的拓展板写驱动程序
- 硬件:STM32G031G8U6 CH343P LIS3DH TPS63000 / TPS63001 TP4054 / MCP73831-2ATI/OT
- USB:由于只有一个Type-C,且休眠时(STOP1模式)固件没有禁用SWD接口功能(为了防止变砖,虽然STOP1模式用不了SWD),实测如果SWD接口用排阻连CH343的D 和D-会消耗200uA以上的电流,所以Type-C采用正反插不同功能,正插G031的SWD接口用于调试,反插USB转TTL串口,这样既保留功能也避免了电流泄露
- 串口芯片:可选焊接板载的CH343P,若想外接串口芯片节约成本,可焊接上图CH343P右边的两个焊接跳线,那么G031的USART2就与Type-C直连了
- 有源晶振:默认不焊接,使用内部振荡器,预留给更高精度的时钟应用,例如不使用拓展板的外置RTC,而使用G031内部的RTC,时钟源使用外部32.768Khz有源晶振
- 硬件:AHT20 24Cxx PCF8563 WS2812
- 硬件:AHT20 24Cxx PCF2129 WS2812
- 硬件:microSD卡或NOR Flash 12mm蜂鸣片
- 备注:无传感器和RTC芯片,整活儿专用,目前暂未写固件
SAU-G0主控单元有80多个元件,元件很密集(0402、扁平无引脚封装),十分建议开钢网
交互BOM,浏览器打开即可
路径:每一个AD工程目录下的 BOM/bom
电容耐压:OLED外围电路的几个电容标注了耐压要求,其他的电容默认10V耐压或以上
电池型号:601417 3.7V 100mAh
电池连接器:非必须,可以直接焊线
EEPROM:程序实现了容量 2Kbit-1024Kbit 自适应,推荐24C512
OLED屏幕和FPC按键需要从豆总1.6元电子烟主板车上拆(没有这个,但想DIY的朋友可以私信我给你寄)
打包的STM32CubeIDE1.7.0工程,需要先安装暗黑主题(教程),然后随便编译/折腾
目前固件已完成对AHT-GL和AHT-PL拓展板适配
- 屏幕渐亮渐暗
- 串口修改时间
- 串口导出EEPROM储存的采集数据
- 多级菜单
- 自定义采集温湿度任务,自动计算任务数据存储空间
- 自动检测EEPROM容量:已测试24C02、24C64、24C128、24C512
- 休眠:支持RTC、加速度计、按键三种方式唤醒
- 串口命令解释器
- 硬件看门狗
- 熄屏采集逻辑
- 硬复位时,检测EEPROM概率出现检测容量为0
- 唤醒时概率死机
编译好的固件:Hex
Type-C采用正反插不同功能,正插G031的SWD接口用于调试,反插USB转TTL串口
烧录时需要全程按住按钮中键不放以保持上电
Type-C 正插连接即可烧录
板载一键下载电路,Type-C 反插连接
STM32G031G8U6出厂时option bytes默认BOOT0信号由option byte决定,ISP烧录前,必须先使用STLINK以SWD连G031修改option bytes的nBOOT_SEL位为取消勾选,否则后续CH343P的RTS和DTR无法将G031设置为IPS模式!!!
需要FlyMCU和开STM32CubeProgrammer 配合烧录
按住OK键保持不放,FlyMCU选择 RTS低电平DTR高电平进BooTloader,显示已连接后(FlyMCU无法对G0进行进一步操作),即可松开OK键,然后打开STM32CubeProgrammer(FlyMCU可不关闭,另外新版STM32CubeProgrammer ,会有RTS和DTR选项,都选择0)以 UART 波特率115200 连接,如果一切顺利,即可进入烧录状态
你可能会问为啥不直接用STM32CubeProgrammer操作DTR和RTS而要用FlyMCU操作,因为这个功能我测试对于一键下载电路不起作用,DTR和RTS信号的波形很奇怪,但是FlyMCU可以
不同的打印方式需要使用不同的打印模型:
- FDM打印:上盖和盒子得分两个件打印,模型文件使用 单个零件
- 树脂光固化、尼龙激光烧结打印:盖子和盒子可合并成一个模型打印,模型文件使用 连接零件
- STL文件名解释:GL是使用PCF8563扩展板的,PL是使用PCF2129扩展板的
PA12打印的外壳组装后效果:
SAU-G0-EX_AHT-GL 初号机,AHT20 周边忘记开槽了:
后续制作的 SAU-G0-EX_AHT-GL 和 SAU-G0-EX_AHT-PL:
运行时,或唤醒时,都可能死机(概率极小),死机时,找一根USB线一端接5V,另一端 Type-C 反插连接温湿度计,然后拔出Type-C,即可复位STM32G031
(待修复)串口导出的文本表格的格式不对,markdown表格记成csv格式,是说咋导入谷歌表格识别不了
扩展板的纽扣电池保持开机亮屏才能从3V3充电,休眠或关机时无法充电,若太长时间不持续亮屏充电,由于RTC芯片持续消耗纽扣电池的能量,纽扣电池会过放电到0V
临时解决方案,例如 SAU-G0-EX_AHT-PL 扩展板,断开 SJ1跳线,将D1右端飞线到SJ2跳线的VbatWeek,这样后,即使关机了,锂电池还能经VbatWeek持续给纽扣电池充电
VbatWeek是从主板的锂电池经BAV99两个硅二极管降压取电的,压降1.1V左右。那么当主板的锂电池充满电时,即锂电池电压4.2V时,VbatWeek约3.1V,纽扣电池约3V,此时VbatWeek高于纽扣电池的电压时,RTC由VbatWeek供电(主板锂电池供电),而当锂电池低于4.1V时,纽扣电池的电压就会比VbatWeek高,RTC由纽扣电池供电,若熄屏时间太久没有唤醒,那么纽扣电池的电量会被RTC芯片持续消耗,可能出现纽扣电池的电压再次低于VbatWeek,那么纽扣电池又会充电
纽扣电池100%电量时电压约3V,0%电量时电压约2.0V,当纽扣电池低于2V时,主板锂电池也差不多低于3V触发锂电池保护板的过放电保护了,这个时候用户也会发现差不多没电了,需要充电
总之,纽扣电池和VbatWeek是通过二极管进行相互交替给RTC芯片供电的,在大多数情况下,当主板锂电池没电时,纽扣电池还能维持RTC芯片正常运转(MS621FE纽扣电池约5.5mAh,能维持RTC芯片(PCF2129:0.7uA)300天)
锂电池4.21V时,3.3V给纽扣电池充电,充满时纽扣电池的电压 | 锂电池4.20V时,VbatWeek的电压 |
---|---|
后续有空就改一下PCB扩展版修这个电路BUG,如果我没有改,你也可以自己修改源文件
使用XCOM,连接串口黑屏就勾选RTS,再长按中键连接
菜单-->数据采集-->导出数据,文本表格格式为 csv 格式,数据以逗号分割,在XCOM里导出选中,复制,新建一个 .csv文件,粘贴进去,就可以用 Excel 或者 Google Sheets (谷歌表格) 处理
格式如下:
Date & Time , T(C) , H(%) 2024/09/30 17:22:00, 31.90 ,51.00 2024/09/30 17:22:10, 31.90 ,49.00 2024/09/30 17:22:20, 31.80 ,40.00 2024/09/30 17:22:30, 31.70 ,44.00 2024/09/30 17:22:40, 31.70 ,44.00
例如,使用谷歌表格,上传 csv 文件后,对列进行少许的格式化,得到折线图
采集数据的示例Excel文件位于Data文件夹
屏幕亮度90%,开启自动休眠,设置任务后,由RTC闹钟唤醒亮屏4秒,采集一次温湿度,数据保存在EEPROM,然后熄屏进入低功耗模式
在24小时如此反复约1200次,锂电池电压从4.2V降到4.0V,耗电约15%
左侧为温度标尺,右侧为湿度标尺,横轴为时间点(横轴无法显示完全1200个时间标签)
屏幕亮度50%,开启自动休眠,设置任务后,由RTC闹钟唤醒亮屏5秒,采集一次温湿度,数据保存在EEPROM,然后熄屏进入低功耗模式
在38天如此反复约1800次(每天48次),锂电池电压从4.25V降到4.00V,耗电约20%
- 加入默认任务模板:年采集,月采集,周采集
- 这货要是flash再大点,可以整个串口命令进行报表查询