type
status
date
slug
summary
tags
category
icon
password
打个草稿先 😋
 
 
 
 
 
 
 
 

先听我叭叭几句💬

 
我是个特别喜欢看实时数据的人,特别是那些系统运行时的状况、log、参数。看着那些数据在飞速滚动就很满意,能随时得知系统当前的状况。
 
Such like:
  1. 电脑信息
    1. notion image
 
  1. USB功率
    1. notion image
 
  1. 充电功率
    1. notion image
 
 
这种可视化数据也便于判断设备是否工作在预期状态,及时进行调试。而这次我要弄的也是类似的东西。
 
我家的汽车是老丰田花冠,没有车机,人机交互娱乐设备几乎没有,只有一个多媒体电台。车辆里程和油耗这些信息也是没有,车内温度也没有,甚至啊,连倒车影像也没有 😃 定速巡航啊,车道保持这种就更不用想了。如此简陋的功能,练就了我一副好车技 🫠
 
So, what am I planning to do?
 
像车辆胎压监测啊、远程启动啊、自动驾驶啊,这种,我这技术肯定是做不到的了 😅,但是呢,简单一点的实用一点的我还是可以的。
 
首先是车内温度,简单。
来个指南针?可以。
然后实时海拔高度?还不错。
都看实时海拔高度了,上坡下坡的坡度要不看看?
蓝牙放个音乐?做个喇叭?
还有……
STOP,你TM会吗你就搁着许愿 🥲
 
开工!(其实,这东西从9月份就开始计划了,拖了很久)
 

 
 

器件选型

 
(压缩一下,方便阅览~已去除部分仅在Demo版本使用的传感器)
 
OPT3001 环境光传感器(#I2C)
AHT20 温湿度传感器(#I2C)
BMP280/SPL06-001 气压传感器(#I2C)
SSD1315 0.96寸 OLED显示器(#SPI)
LSM6DS3TR-C 6轴加速度-陀螺仪传感器(#SPI)
 
IC & 原理图
notion image
notion image
 
捏麻麻的,Demo画错了,都焊好了,写代码的时候才发现,CS引脚没有接到MCU上,只能飞线 😡
 
驱动代码(已验证)
 
main.c 应用示例
 

 
 

软件部分

 
CubeMX
(有空再整理~)
 

 
 

开淦!

 
选型其实花了蛮久的,一开始想法很多,什么功能都想做。
 
供电方式就想了很多。想做太阳能+超级电容供电的,想了想供电不实际。想做电池充电的,但是怕夏季车内高温,锂电池不安全。最后还是返璞归真用有线供电接USB
 
功能方面,一开始其实还有磁力计的,想着做一个指北的功能。驱动是驱动起来了,但是输出的是原始信息,真正的东西南北角还需要一个挺复杂的公式计算出来。还要依赖陀螺仪的偏航角来计算。而且这玩意被干扰的概率很大,基本上拿个金属物质在它附近动一动,数据就开始乱飘了。考虑到即使功能做出来了,屏幕也不知道如何显示效果最好,遂放弃。最后保留温湿度车辆俯仰角气压海拔高度这三个。
 
单片机用的是STM32G070CBT6,其实用F103C8T6应该也是可以的,主要是担心64KB Flash装不下,况且G0系列用了新的制程和技术,价格也便宜,还是很有优势的。
 
传感器部分:
  • 气压计用的是SPL06-001,与BMP280是Pin-to-Pin的,主要是SPL06好买。
  • 陀螺仪,本来想用 MPU6050 的,毕竟代码成熟,还有现成驱动。但因为价格、假货多,而且还停产了,我最后换成了另一款我完全没接触过、网上例程也不多的六轴陀螺仪,LSM6DS3,来自ST的,也不贵,好像才8块。买的时候没想那么多,没例程问题不大,只要手册详细,怎样都能驱动起来吧?
  • 温湿度传感器AHT20了,价格便宜,相比SHT30便宜一半不止。代码少,精度还不错,缺点是没有连续测量,不过问题不大。
  • 考虑到屏幕在白天和夜间的显示亮度,还需要一颗环境光传感器对光进行测量并反馈,以此调节屏幕的亮度。如果没有这个玩意,屏幕只能维持一个亮度,或者手动调节亮度,不太安全。最终选择了躺在我购物车里很久的OPT3001,来自德州仪器。
  • 另外,我还预留了一个可选的 EEPROM。在设计时担心以后可能要存点数据,临时想加又来不及,所以直接放了个BL24C02,反正不贵。
 
基本上就是这些了,屏幕选了个大一点点的1.3寸OLED屏幕,OLED可读性更好,单色好分辨,对于行车安全来说影响最小,且OLED相比TFT屏幕,理论上更省电(虽然我也不知道我这个有线供电的电要省在哪里)
 
 

打板测试

 
Demo 主要验证各模块能否驱动成功
notion image
notion image
 
花了我挺多时间去看手册,板子上6颗传感器都要看,看得我头晕眼花 😵‍💫。不过好在最后都把他们驱动起来了,除了那颗磁力计,感觉有点多余。
btw,这颗OLED显示屏真好看~
 
Beta1 第一个测试样品
notion image
notion image
 
精简了一些不需要的芯片和功能。
 
屏幕单独一块板,因为陀螺仪需要保持水平放置,而屏幕需要竖起来才能看到,所以需要分离。
那么为什么这个屏幕这么抽象呢?🤔 因为我把封装弄反了 😂,屏幕本来应该贴在那个二维码的位置…
… …
后来可能因为各种原因,静电或者啥的,屏幕突然坏掉了,不亮了,也有可能是扯坏了排线。想再去买一个给它换上都不行,店家下架了,全网都找不到这次侧出排线的封装。刚好我觉得这版的PCB还是大了点,空位很多,再优化一版吧~
 
Beta2 以为是最终版本
notion image
notion image
notion image
 
更集成,体积更小,空间利用率更高。
屏幕换了这种封装的同尺寸的OLED,显示效果甚至比上一个好,还便宜。FPC排线的方式也更易于安装。
AHT20变成外接的方式,考虑到温湿度传感器靠近空调出风口会更好,测得的数据更接近体感温度,改成外接方式可以自定义AHT20的安装位置。
 
 
Beta2这个版本我要花点篇幅说一下。本来我以为这是最终版了吧,易于建模、易于安装、功能都测试得很好,体积也够小。但是呢,看着那个整天变来变去、一会儿正、一会儿负的”Altitude“,突然有一个新的想法出现。
 
因为海拔高度其实是靠SPL06-001读到的气压值去计算的,而那个计算公式除了读到的Pressure这个变量外,还有一个变量,那就是P0,也就是海平面气压
P0在一般情况下如果没有指定,默认是取标准大气压1013.25hPa。
而我使用的气压高度计算公式的P0变量就是使用的标准大气压的值。但这会出现一个问题:大气压是随时会变的,也就是P0的值会受天气、季节变换、极端天气的影响而变化,甚至同一个地方的早上和晚上,气压可能都不一样。这样计算出来的海拔高度就不准确了。
 
解决办法是有的,那就是时刻修改P0的值为当地的实时修正海平面气压(QNH)。且不说如何修改,QNH的获取都是个问题。天气APP里的气压值大多数不准确,而政府气象台的网站布局更是抽象到不知道查询入口在哪里。后面发现Windy的气压值还蛮准确,手机APP也可以查询,才从Windy获取QNH的值。
 
好了,另一个问题来了,怎么修改呢?开始我真的打算加几个按键,做个菜单的。一个确认键,一个上键一个下键,给那个气压值做翻页来修改,后面感觉太蠢了,换成了串口发送修改。干了几个小时,代码写完了,写成类似AT指令这种,电脑通过串口发送指定的字符串+气压值,MCU解析串口发来的数据,修改P0的值,即时生效,那么公式可以通过正确的QNH值,计算得到正确的海拔高度。
 
再一个问题。既然这个海平面气压一直在变,那难道每次要改的时候都捧着个电脑去改吗?要想到这是应用到车上的,每次开车都带电脑?🫠 最后,我想到了一个办法。我手上有很多薅样品价薅来的蓝牙串口透传模块,我打算加个这个模块,然后手机连接蓝牙模块发送”修改P0“的指令给STM32,STM32执行相应的代码,这样就可以无线修改变量了。后面我是飞线了一个蓝牙模块尝试了一下,确实是可以这么做的,比有线串口方便很多。
 
notion image
 
 
 
想法有了,先新建文件夹吧 😂 ,实在是不想再改了。有几颗芯片难焊得一批,还有个FPC座,0.5mm间距的引脚太难焊了,加助焊剂又会导致助焊剂爬到座子里面,搞得与排线接触的那些引脚黏糊糊的。以后再说吧,要忙一阵子了,啥时候没事干了再回来弄这个 😌
 

 
 

待施工

 
 
 
Manjaro的入门配置手册BLE蓝牙串口透传模块试用
Loading...