基于STM32的摔倒预警系统
闲来无事,用手头STM32做个项目。
成品功能:
摔倒预警。当老人发生摔倒时,自动进行求救,给一个人发短信,附带位置信息。
思考:如何确定老人是摔倒了?
方法:我打算用两到三个测量高度的传感器。分别放在脚腕、手腕、和头。当三个高度一直时表明老人是躺着的,再根据其他辅助信息,比如时间,地点等去确定老人是不是真的摔倒了。
从网上找半天,发现敏感的大气压强传感器可以确定高度,精确到15cm,符合我的预期。
材料
- STM32F103ZET6芯片开发板
- 液晶显示屏
- 杜邦线
- 两块BMP280模块
- GSM模块
- GPS模块
- 超声波模块
- 用keil5进行开发
开始制作。
制作过程
首先测试BMP280模块,得到期望的数据后再测试GPS模块,找到地址(经纬度)数据。再测试GSM,通过AT指令使其可以发短信(也可测试打电话,本项目用不到),然后在板子中测试,再测试GPS,找到地址(经纬度)数据。测试完成后加入超声波模块,最后完成代码逻辑。
BMP280模块
这个模块有SPI和IIC两种连接方式,我们这里采用iic因为我们其他两个模块都要用串口,我们还要调试,就没有那么多串口可以用。根据网上找的BMP280驱动连接板子后可以看到我们希望得到的数据。先用两路BMP进行测试。结果如图所示。
部分代码
void bmp280GetData(float* pressure,float* temperature,float* asl)
{
static float t;
static float p;
bmp280GetPressure();
t=bmp280CompensateT(bmp280RawTemperature)/100.0;
p=bmp280CompensateP(bmp280RawPressure)/25600.0;
presssureFilter(&p,pressure);
*temperature=(float)t; /*单位度*/
// *pressure=(float)p ; /*单位hPa*/
*asl=bmp280PressureToAltitude(pressure); /*转换成海拔*/
}
再微调数据,是两个传感器测得同位置数据一致。
GPS模块调试
GPS(ATK-NEO-6M GPS)模块
设置好后,模块接收NMEA码并解析出我们需要的数据。
例如:
每个都代表着不同的数据。可以参考:GPS的NMEA码的详细解释定义
具体的模块已经配置好了,我们使用就可以了。
硬件连接
- 将模块插入到开发板的ATK-MODULE接口(靠下插)即可。
2. 短接: USART3_RX 和 GBC_TX 以及 USART3_TX 和 GBC_RX。
代码测试
- 将原子哥的代码下载到板子中进行测试。
- 通电测试(我开始在室内,等了好久都没有数据,后来搬到室外就有数据了,第一次连接需要等一会儿,在室外有数据之后,再回到室内就还有数据。)
- 这样即表示成功
GSM模块(ATK-SIM800C)AT调试
首先用AT指令测试模块,达到可以发短信,打电话。
下边是部分AT指令:
AT | 返回 | 作用 |
---|---|---|
AT | OK | 模块通讯正常 |
AT+CPIN? | +CPIN:READY | 查询 SIM 卡的状态,主要是 PIN 码 |
AT+CSQ | +CSQ: 24,0 | 查询信号质量 |
AT+COPS? | +COPS:0,0,”CHINA MOBILE” | 查询当前运营商 |
AT+CGMI | SIMCOM_Ltd | 查询模块制造商 |
AT+CGMM | SIMCOM_SIM800C | 查询模块型号 |
AT+CGSN | 866104023267696 | 查询产品序列号(集 IMEI 号) |
AT+CNUM | +CNUM:””,”136******”,”129”,7,4 | 查询本机号码 |
ATE1 | OK | 设置回显模式(默认开启) |
ATD10086; | OK | 用于拨打任意电话号码 |
ATA | OK | 应答电话 |
ATH | OK | 挂断电话 |
AT+CMGF=1 | OK | 置短消息模式,设置为文本模式 |
AT+CSCS=“GSM” | OK | 用于设置 TE 字符集,纯英文为GSM,中英文为UCS2 |
AT+CMGS | > | 用于发短信 |
英文短信的发送
- 设置字符集为
AT+CSCS="GSM"
; - 设置文本模式为
AT+CMGF=1
; - 发送短信的目的人为
AT+CMGS="18********"
; - 然后模块返回:
>
,此时我们输入我们需要发送的内容:ATK-SIM800C MSG SEND TEST
; - 在发送完内容以后, 最后以十六进制(HEX)格式单独发送(不用添加回车):
1A
(即 0X1A),即可启动一次短信发送。 - 稍等片刻,在短信成功发送后,模块返回如: +CMGS: 39,的确认信息,表示短信成功发送
中文短信的发送
- 首先发送
AT+CMGF=1
, 设置为文本模式; - 设置文本模式参数
AT+CSMP=17,167,2,25
; - 设置字符集为
AT+CSCS="UCS2"
; - 首先要用将号码和发送内容转换为UNICODE 字符串,
1.号码182********,转换后的 UNICODE 字符串(去掉空格后)为:
2.00310038003200390030003100390035003600330032
3.ATK-SIM800C 中英文短信发送测试,装换后的 UNICODE 字符串为:
4.00410054004B002D00530049004D003800300030004300204E2D82F1658777ED4FE153D
190016D4B8BD5
由于使用了 UCS2字符集,所有字符/数字/汉字,都必须使用 UNICODE 编码
- 发送:
AT+CMGS=”00310038003200390030003100390035003600330032”
,这个指
令,然后模块返回:>
- 此时我们输入我们需要发送的内容:
00410054004B002D00530049004D003800300030004300204E2D82F1658777ED4FE153D 190016D4B8BD5
注意,此可以不用发送回车了; - 在发送完内容以后,最后以十六进制(HEX)格式当独发送(不用添加回
车):1A
(即 0X1A),启动一次短信发送。
一次中英文短信发送成功。
GSM模块板子调试
硬件连接
模块需要独立供电,推荐 12V1A 电源。
板子PA3连接STXD,PA2连接SRXD,模块GND连接板子GND
代码测试
下载原子哥【正点原子】GSMGPRS模块ATK-SIM800C例程
- 初始化
- 拨号测试
- 短信测试
功能都正常我们就开始修改代码
- 去掉所有跟短信没有关系的代码;
- 将短信目的写成确定的;
- 将短信内容改为:
我摔倒了!我在********高度*****。
- 进行测试,收到的短信内容为
这样就可以了。
最后完善代码逻辑。
当两个高度一直时标记,等待五秒,还未站起来就发送短信进行求助。
最后附上完整的项目文件。自行下载。
这个项目到这里就算完了。
还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。
禁止转载!!!
博客:https://blog.csdn.net/weixin_42320020/?type=blog
QQ:2039723308
VX:Shiboven