一.硬件方案" T( L# k! ^4 N# x
本系统由STM32单片机核心板、ADXL345加速度传感器、GSM、指示灯、按键电率+蜂鸣器报警及电源组成。, X. O; o& |' I4 v% [
8 W. H' N+ |/ f0 E9 ^5 j- g二.设计功能9 {% V$ v; A/ ]1 C0 @, g" }. s
(1)板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦倾角传感器检测到平放即摔倒,蜂鸣器报警,且摔倒的时间持续超过15秒短信报警(15秒是为了确定老人已经跌倒且15秒钟都没有自行爬起来,需要报警提醒周围的人帮忙)。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。, R0 y8 g' V4 U
(2)触发GSM模块实现短信的发送, 设备将会向人员发送信息“help me!”!9 @. c+ X4 k, d
(3)短信处理及初始化有状态指示灯指示。
( r3 d$ x; h7 @! |(4)GSM上电有几秒初始化,系统供电电源至少要支持5V/2A。
5 ~7 d! Q+ w8 F3 q+ j+ T2 Z8 m
2 G4 ^6 g- t3 [, \% w) K- \0 _三.设计原理图
4 i$ F) D) m. o' K! ~2 w4 d(1)原理图主要采用AD软件进行设计,如图:
* P5 b4 y: F7 d/ O0 |
5 y# s H* G% g6 H% r6 y$ l
# r! ^8 t9 U' o/ c f! g; r1 a6 _
* Y& y& F+ C1 j2 q. L* F
(2)PCB图如下:
' ?( o& ]6 _" p: C% I: M& F" y% ?. v, g; {/ Y
2 w- Q+ l" ]7 w( ` |
4 r/ @9 v5 Z1 M: s8 H; |四.软件设计8 x, { Z% d8 z( ^4 J# a% ]5 K
主程序源码
# o+ |0 Q6 C8 |3 ^) R5 o1 J; u* @4 |6 X, v) o2 O7 A1 q+ T2 M
- int main(void)0 N6 A- J; I- C) o6 \8 k. j
- { 0 c/ _, P0 m ^9 p
- delay_init(); //延时函数初始化; q D: \, H1 g$ q' h/ R2 Z! }
- NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级# g/ o! _7 F5 o! a2 R y
- LED_Init(); //初始化与LED连接的硬件接?0 N4 ^4 K' D L, L) V
- KEY_Init();8 w( H5 x- @5 i' c1 r% U
- uart_init(9600);
" C$ |( [8 V' u$ f; \9 V; w - TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms( ]* ? K9 P: G, Z6 _
2 s& G$ e9 c2 H; w- buzzer = 1;//初始化+ [% m' i+ E8 O
- delay_ms(100);, C3 _) |( x4 C- Q, ? J! J0 R" e
- buzzer = 0; //关蜂鸣器! O5 }1 _; }' D! C2 B* M. n
- led_gsm = 0;
( ]' o7 z) y# {1 k( y: q" u0 s - ( S( i6 `6 M' G4 N2 E
- Init_ADXL345();//初始化 adxl345' h) W3 M* P+ R0 k- a/ T
- if(Single_Read_ADXL345(0X00)==0xe5) //读取寄存器值 看是否初始化成功% d% a$ Y; _" t( n4 V
- {
+ ~; m, q! s, y$ q5 V - delay_ms(5);
! C$ P' D" T3 G% V - }/ O4 q& P( _0 r0 g6 C
- else1 e/ \& C: y: }5 M- s9 r
- {
" B/ K: [/ f2 ` - delay_ms(3);
8 F9 W" g0 r. ] - }% w4 e E, K; r) s$ H- E8 c7 V1 p% q
' o7 G6 Z) O: N. h# h \+ J+ X B- L- i=50;! P0 ^3 D* _3 B& j9 I4 c R
- while(i--) delay_ms(100);//延时
& `: d" b* E. O# _6 J -
4 S Z9 i) i; R# Q) \. b* g - UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
# K) N, ^5 K5 B, s - i=10;; B' e" s& \& P9 x* r8 j0 D9 F# r
- while(i--) delay_ms(100);//延时. K) L6 ^: Q9 W9 W9 n
+ G7 K3 ?" b3 Z7 w; J! U- UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
& h3 T8 \3 {* ~8 y0 _2 p2 D0 W - i=10;9 s8 h! G; c4 x0 n8 U2 y- {% g5 f
- while(i--) delay_ms(100);//延时
3 n1 G0 o* { ` -
' i1 `' R [6 ]3 Z' q+ _ - led_gsm =1;
3 h0 h, H( l) ?; i" m - while(1)
$ {6 p3 |9 A% l6 G! E - {
% r2 Y8 v) }2 n( g, H - if(ReadAdxl345== 1) //定时读取adxl345数据+ N3 {% n0 M- E# L% |2 `
- {4 Q7 ^% v2 E B& ^$ |* t z
- ReadAdxl345= 0;
7 J6 S. {: z& x3 C7 r - ReadData_x(); //三轴检测函数 z. M# |5 ]& n/ U- M
- CheckNum++;5 Z& t' j9 _# e+ u
- if((temp_X<550)||(temp_X>10000)) //该数据为检测值 不是固定的 一个大概的 角度0 Z. c! B8 o* | ]6 b U
- {
) Q ~+ Z+ n5 y c - ErrorNum++;
& w* l6 t. k6 _5 k& ? - }7 O3 Q# n: s+ S1 `% b
- if(CheckNum>=5) //进行5次处理
/ [5 D1 i5 s: }/ V8 Z' w - {
3 ^5 t8 u5 P( A' m8 H3 i9 _ - if(keyLater>=3) //非按键下# G! H1 K; B' o" M, O" H& g" \
- {
7 q$ D( p1 O, L9 u4 p - if(ErrorNum>=1) //角度出现错误 5次出息3次情况
. I4 h+ b- ^ W! ?' o) x5 i - {6 |! i1 T2 ?0 ~5 C3 W b* ^8 z4 G( k2 }
- buzzer = 1; //打开蜂鸣器) h2 T: o6 [, L2 h+ S
- }7 _" ?8 v' `8 @" O. h; e9 ?
- else
/ e& Q( _# I4 L ]0 ]6 h& V - { % d2 p* \" q" a5 G0 N
- buzzer = 0; //关闭蜂鸣器
' Q! P7 @( L3 g4 d - reportLater=0; //上报延时计数
5 r3 y% R0 N4 x/ s - }
5 A% ^) Y7 F9 z' l) b' C0 c - }" h* t. V# Q4 i" Z7 R* ?0 `
- ErrorNum=0; //清空滤波计数
. J8 V" P2 x5 I5 o; z - CheckNum=0; + [, s9 ]% [4 ~. a1 \2 }: A
- }0 T% E6 Z8 c* y; @3 {6 n7 {4 Q
- }/ m" _8 ^" g+ i$ y+ E
- # `' G! f" o* d9 w& w" ~# R7 j
- if(reportLater>=15) //15s
2 @4 m# K' i- i0 o! W- s - {
5 ^+ E+ H0 g& D - led_gsm = 0;//打开led5 t3 i' o3 E# ^7 y
-
4 f1 U1 ^2 `& F4 b, J% N - UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
3 }% e$ `+ Q; D& V' l' i - i=3;' D! g( P; }# D. Q3 @# r9 w
- while(i--) delay_ms(100);//延时1 N% k: \0 |; Q/ s
- / [& E/ N8 x1 l2 X9 I5 E
- UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本0 q2 W! c, ?& c$ o q: ` P
- i=3;+ [8 W9 M1 }4 X$ L; w+ n
- while(i--) delay_ms(100);//延时* g& s$ v/ @5 u! @
- UART_SendStr(USART1 ,"AT+CMGS="+8615555183057"\r\n",26); //测试号
4 c( B9 `2 `* q2 v6 I/ X; T - // UART_SendStr(USART1 ,"AT+CMGS="+8618105140357"\r\n",26); //可以修改电话号码
4 y9 y) F B0 Y0 Q, w4 R( y0 q - i=3;
9 a3 m, l/ }6 @ w; t7 P: z - while(i--) delay_ms(100);//延时
q6 d0 ?% h3 I. r -
) |. m: u% y* t/ a1 P& b5 |+ C4 D - printf("help me !"); //发送短信息内容# e8 ?/ H. u0 E; v; @, H6 u
- delay_ms(200);//延时
0 q ?! X4 V K ]. Y0 m' O -
6 o) @- y: v1 c# B1 }/ E$ N1 z - UART_SendStr(USART1 ,( char *)Crtl_Z, 1); //发送
7 ]0 Q. x/ O$ [+ } - i=40;* L( @( i6 O* p/ u9 ^
- while(i--) delay_ms(100);//延时4 q- N4 T, `" C* d$ o6 b, y
- 5 ]2 {( n" T. T! a7 p( ]
- led_gsm =1; //led关闭" @% o {! x' x6 m, ]: m0 v# l
- reportLater=0; //上报标志清空
7 t: v: R# ` v - keyLater=0; //按键清零延时处理& }5 f9 v% w9 U/ ^4 ]
- }
6 K* [7 Y5 H, C$ J4 l% _ - - X0 c5 b0 B$ w% ?# V& g
- if(key==0) //按键处理5 _; r% v( ~+ D' U0 L: ]( T% ?
- {
# `0 b$ x' O5 Y" W3 N' e+ A - delay_ms(3); //按键消抖动
9 l3 o* Z- g% | m - if(key ==0) //按键处理! x4 h; Y, Y4 r" x9 | H! q
- {# ^4 n8 p* V7 j. O* j8 H% Y7 x3 @
- reportLater=0; //按键延时上报
) v7 ~0 @0 U1 E6 p0 ~! A - buzzer = 0; //关闭蜂鸣器+ N I* Q, V- K
- keyLater=0; //按键延时处理
% S l N% K3 o) ~& k' a - }
& F2 W7 R# u3 C$ C, g - }+ K ?7 D2 E, B- _
-
: V) P, P3 H, B( U5 l- r: H - }7 ~" Q! U* h; I p2 T- Q
- }+ i/ _4 E' W, I+ `# N
复制代码 2 t6 k- |/ H( V& A
0 P( L4 m" L' \, [" D
6 H9 F7 R |" {0 G* e8 W |