一.硬件方案, U3 Q) z# R9 d( z! _: l* ~
本系统由STM32单片机核心板、ADXL345加速度传感器、GSM、指示灯、按键电率+蜂鸣器报警及电源组成。: a" ?* V; r' K u% l) L+ @+ X
m* }! e4 s0 D' k# t7 o8 l
二.设计功能; \: O4 ^% f' V4 _! w3 t2 p2 Y& b
(1)板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦倾角传感器检测到平放即摔倒,蜂鸣器报警,且摔倒的时间持续超过15秒短信报警(15秒是为了确定老人已经跌倒且15秒钟都没有自行爬起来,需要报警提醒周围的人帮忙)。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。
! y8 k: e) ^# s# ?4 J(2)触发GSM模块实现短信的发送, 设备将会向人员发送信息“help me!”!: v' S3 b( ~* R. V
(3)短信处理及初始化有状态指示灯指示。
2 l. j. V% Q( K. ^9 c: t, z(4)GSM上电有几秒初始化,系统供电电源至少要支持5V/2A。
. F7 E1 K4 s) H4 C" P% W4 L: W1 y1 K
) C, O3 n. |9 `* \6 T# I三.设计原理图
5 C9 ]3 f9 @4 B; p3 T(1)原理图主要采用AD软件进行设计,如图:) G1 A$ k9 V, O$ q" `# k
9 F* g v+ V* J& c
7 s( X/ t7 z2 ^% \$ ]# m* E' |& t) [. M
(2)PCB图如下:! L# A3 h! i* |) @! H
6 n9 u6 I, q" {. K: r3 i
# S, E& s, C/ N
4 P: }2 h7 x9 e
四.软件设计
% ~8 p# y9 l& A/ _* {主程序源码% \% U% h1 S8 L# E) m
" g m; m# I2 A
- int main(void)
, l! Y5 v. s3 F - {
' Y- p: `3 C# N" V Z( W9 E - delay_init(); //延时函数初始化
4 e. U6 U1 i* O - NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级6 _) d0 n/ _2 T i) f: w" Y
- LED_Init(); //初始化与LED连接的硬件接?
8 a ~9 i' V8 D0 u: b) n5 A+ [ - KEY_Init();
0 y: x' B7 M7 j3 z) B( R% R - uart_init(9600);$ H7 X O( M5 g5 _# S* z( x
- TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms" C$ Q2 m9 O6 B& _% I. r
- ( ~! e! z% } g' F' p% @
- buzzer = 1;//初始化
! t6 I/ b! v' m/ l1 g, G' t" o1 v - delay_ms(100);7 {7 T8 h" S; l0 h7 C3 {) s+ P
- buzzer = 0; //关蜂鸣器" E8 V' q& r/ z. P6 _
- led_gsm = 0;& U* V( g& D2 X6 u' R9 \
-
1 I* _2 T2 @4 K4 ?, h( A/ W - Init_ADXL345();//初始化 adxl345
" g9 Y; E* W; @/ I4 A5 K1 @0 H$ e - if(Single_Read_ADXL345(0X00)==0xe5) //读取寄存器值 看是否初始化成功7 l! u& r; r# G6 V5 T) C+ a( X3 i
- {% I) F k# N, E$ E) y0 w
- delay_ms(5);
& Q( v- k, e; k8 T - }$ O5 a: D. U e. L
- else
8 y3 T; X X- H! ?0 n" \ - {
) P$ i- Q5 U. O. n - delay_ms(3);
0 ~8 }8 m e, I$ _ - }6 S# S5 P" G9 T+ L" q% b8 w. Y
6 i! x1 W$ I8 G- i- i=50;
7 G* O! n; T& Y1 c6 ^) ~$ R m - while(i--) delay_ms(100);//延时
* {5 h" w% k& b3 N: I -
+ A6 H/ [3 O. U4 {1 o! ~! o - UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集 L0 B2 C0 q: r7 w
- i=10;6 D0 d6 W/ `; T; O) m) m* ^6 h
- while(i--) delay_ms(100);//延时" p& D' X* D9 q3 O" _% y
- 1 E* N6 ]2 V& U5 j, }
- UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
# x% f1 h0 |$ m - i=10;
& o4 J- K* h, p - while(i--) delay_ms(100);//延时0 L$ }$ x6 @5 I
-
* _ x3 G v% x l. s9 O - led_gsm =1;
( c7 g8 d, Z8 Q% z. \* R - while(1)0 z! ~& ^( T+ F. |$ S# |: |
- { 3 F( |5 o- Z* I" @- k
- if(ReadAdxl345== 1) //定时读取adxl345数据
& ~1 G' v- i& c - {
) u" g! f0 s+ v$ N2 e2 F+ y, L( [) c - ReadAdxl345= 0;% N) J) G1 R. k5 |& {
- ReadData_x(); //三轴检测函数% n/ t! D8 }1 P1 r. @# G+ \# R
- CheckNum++;
; i5 }% l: M1 B) N% S3 G6 ^ - if((temp_X<550)||(temp_X>10000)) //该数据为检测值 不是固定的 一个大概的 角度6 y& M J4 L( G L- y
- {! d( M& h1 P' M# T {
- ErrorNum++;& P6 k7 ]7 F& ~7 }
- }8 D6 i$ }" y+ }' Y. A: Q4 }
- if(CheckNum>=5) //进行5次处理# @$ l8 P% g- ^- U/ Y
- {% B0 N* g- D8 G1 {
- if(keyLater>=3) //非按键下) {+ S) N% b6 s, a
- {
|' V9 q1 o4 }" B! r - if(ErrorNum>=1) //角度出现错误 5次出息3次情况; U/ E9 b0 j3 p4 a8 K% B8 U8 j- z
- {" w% q# l/ s! ]1 x7 Z- T
- buzzer = 1; //打开蜂鸣器
; p+ \$ [: R' \8 v: {$ x) N - }
4 N( N* y0 q! z' B/ ^( Z& I - else
$ L9 a% U! |/ S3 b, D: C1 } - {
8 A) c3 b5 g7 z8 c' V - buzzer = 0; //关闭蜂鸣器) y6 r% z& ]( l P9 c
- reportLater=0; //上报延时计数' I$ E1 R4 g. }* v; m' \" A( D
- }
! k: ~4 Z( T' `0 a, p$ ?( h - }
& H P9 A% \; A$ [ - ErrorNum=0; //清空滤波计数
' n( ^2 h9 E* d4 ~2 [1 Y - CheckNum=0; $ E: b+ B; \4 E% Y/ Q9 N0 W
- }
; Y1 b- I6 g, K' l - }- O9 ~! L) U z- i8 p9 T
4 b1 y! O$ o% @, Z) m/ h- if(reportLater>=15) //15s
) n8 }& K# j. }0 r( g3 G( X; a - {& N9 d7 B3 Z4 z* {
- led_gsm = 0;//打开led: \5 I; x3 o- D2 s7 w2 N0 l
-
. p. N" m* ?8 V1 E& f2 [: ~- v - UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
/ L5 Z( w. K( F& D: a1 o - i=3;
F( ?8 q) |8 B$ c - while(i--) delay_ms(100);//延时
9 R$ G( ]! J9 q -
7 T7 `3 `, Y9 n; N - UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
) T' B" H# |0 p% O; }. S3 f - i=3;/ ?! s; N( i/ e" b, ?5 V0 \1 M
- while(i--) delay_ms(100);//延时7 A' v Y. `! K1 I# a2 Y
- UART_SendStr(USART1 ,"AT+CMGS="+8615555183057"\r\n",26); //测试号
' F* H. m2 L4 Y) i/ m G- p - // UART_SendStr(USART1 ,"AT+CMGS="+8618105140357"\r\n",26); //可以修改电话号码6 o m0 V4 @0 x+ k d# \# h4 I# E
- i=3;1 M1 y) }. d9 \& _* F- R) i- q1 F: s
- while(i--) delay_ms(100);//延时6 _) U2 E7 O6 U. P, y" Z! y2 j
- U5 @: }5 z# S. m& v
- printf("help me !"); //发送短信息内容2 U7 D6 @5 ]" J7 |4 X+ h
- delay_ms(200);//延时$ b* C' g$ }* |4 |7 k5 h( ~
- & U' J$ |6 u7 t/ M+ E: B' A
- UART_SendStr(USART1 ,( char *)Crtl_Z, 1); //发送+ s! X# D* E! Z6 W2 K$ e
- i=40;
" j w( P3 R% j6 { - while(i--) delay_ms(100);//延时
1 v4 u9 V& \1 D |0 o -
2 N. a) S. X. q; F - led_gsm =1; //led关闭0 f5 }. l6 `/ F, L, D& i ]
- reportLater=0; //上报标志清空# M- c2 c9 u X; q
- keyLater=0; //按键清零延时处理
z/ X) q0 G! |0 e, c) A& Y - }
; [) C, @ Z: e0 I9 Z M -
3 U, u' I+ X% h, `; F" K# y - if(key==0) //按键处理. S, s! e7 F" R5 R& L0 p
- {
5 s C# @+ q5 j1 ~: P: T - delay_ms(3); //按键消抖动5 }4 @7 w" q/ T8 Y! k: M
- if(key ==0) //按键处理
* d7 [$ U% j! O4 h2 a: O3 y! H - {* U) s& g1 K% A$ p
- reportLater=0; //按键延时上报
3 x. H; c `0 I% e - buzzer = 0; //关闭蜂鸣器
, ~1 F' c! f/ s6 P; s" L% A' y" X - keyLater=0; //按键延时处理
; ~1 a: x X& [( o) A - }
( Z8 b+ ^( Y" D, g9 g - }
; F* B4 _. V( p! N+ G0 j; O, V -
9 |2 |6 W4 L( v% N5 U - }7 I% G9 e% c7 h/ ^/ `, {% l+ K! t
- }9 L- j* J" n9 E
复制代码
* t( U9 k+ D3 g7 l! H, n( Z
+ D3 W9 x% h& i9 @. I; q- O* b8 Y
0 t: l. I/ C" K7 { |