你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32单片机老人防跌倒报警系统GSM短信上报加速度

[复制链接]
STMCU小助手 发布时间:2022-5-12 11:19
一.硬件方案" 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
I]162~F`84EBYX}@`[IAJRI.png
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
  1. int main(void)0 N6 A- J; I- C) o6 \8 k. j
  2. {        0 c/ _, P0 m  ^9 p
  3.         delay_init();                     //延时函数初始化; q  D: \, H1 g$ q' h/ R2 Z! }
  4.         NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级# g/ o! _7 F5 o! a2 R  y
  5.         LED_Init();                          //初始化与LED连接的硬件接?0 N4 ^4 K' D  L, L) V
  6.         KEY_Init();8 w( H5 x- @5 i' c1 r% U
  7.         uart_init(9600);
    " C$ |( [8 V' u$ f; \9 V; w
  8.         TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms( ]* ?  K9 P: G, Z6 _

  9. 2 s& G$ e9 c2 H; w
  10.         buzzer = 1;//初始化+ [% m' i+ E8 O
  11.         delay_ms(100);, C3 _) |( x4 C- Q, ?  J! J0 R" e
  12.         buzzer = 0; //关蜂鸣器! O5 }1 _; }' D! C2 B* M. n
  13.         led_gsm = 0;
    ( ]' o7 z) y# {1 k( y: q" u0 s
  14.         ( S( i6 `6 M' G4 N2 E
  15.   Init_ADXL345();//初始化 adxl345' h) W3 M* P+ R0 k- a/ T
  16.   if(Single_Read_ADXL345(0X00)==0xe5)        //读取寄存器值 看是否初始化成功% d% a$ Y; _" t( n4 V
  17.   {
    + ~; m, q! s, y$ q5 V
  18.     delay_ms(5);
    ! C$ P' D" T3 G% V
  19.   }/ O4 q& P( _0 r0 g6 C
  20.   else1 e/ \& C: y: }5 M- s9 r
  21.   {
    " B/ K: [/ f2 `
  22.     delay_ms(3);
    8 F9 W" g0 r. ]
  23.   }% w4 e  E, K; r) s$ H- E8 c7 V1 p% q

  24. ' o7 G6 Z) O: N. h# h  \+ J+ X  B- L
  25.         i=50;! P0 ^3 D* _3 B& j9 I4 c  R
  26.         while(i--) delay_ms(100);//延时
    & `: d" b* E. O# _6 J
  27.         
    4 S  Z9 i) i; R# Q) \. b* g
  28.         UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
    # K) N, ^5 K5 B, s
  29.         i=10;; B' e" s& \& P9 x* r8 j0 D9 F# r
  30.         while(i--) delay_ms(100);//延时. K) L6 ^: Q9 W9 W9 n

  31. + G7 K3 ?" b3 Z7 w; J! U
  32.         UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
    & h3 T8 \3 {* ~8 y0 _2 p2 D0 W
  33.         i=10;9 s8 h! G; c4 x0 n8 U2 y- {% g5 f
  34.         while(i--) delay_ms(100);//延时
    3 n1 G0 o* {  `
  35.         
    ' i1 `' R  [6 ]3 Z' q+ _
  36.         led_gsm =1;
    3 h0 h, H( l) ?; i" m
  37.         while(1)
    $ {6 p3 |9 A% l6 G! E
  38.         {  
    % r2 Y8 v) }2 n( g, H
  39.     if(ReadAdxl345== 1)   //定时读取adxl345数据+ N3 {% n0 M- E# L% |2 `
  40.     {4 Q7 ^% v2 E  B& ^$ |* t  z
  41.       ReadAdxl345= 0;
    7 J6 S. {: z& x3 C7 r
  42.       ReadData_x();                                                  //三轴检测函数  z. M# |5 ]& n/ U- M
  43.       CheckNum++;5 Z& t' j9 _# e+ u
  44.       if((temp_X<550)||(temp_X>10000))       //该数据为检测值 不是固定的 一个大概的 角度0 Z. c! B8 o* |  ]6 b  U
  45.       {
    ) Q  ~+ Z+ n5 y  c
  46.         ErrorNum++;
    & w* l6 t. k6 _5 k& ?
  47.       }7 O3 Q# n: s+ S1 `% b
  48.       if(CheckNum>=5)                  //进行5次处理
    / [5 D1 i5 s: }/ V8 Z' w
  49.       {
    3 ^5 t8 u5 P( A' m8 H3 i9 _
  50.         if(keyLater>=3)                  //非按键下# G! H1 K; B' o" M, O" H& g" \
  51.         {
    7 q$ D( p1 O, L9 u4 p
  52.           if(ErrorNum>=1)           //角度出现错误 5次出息3次情况
    . I4 h+ b- ^  W! ?' o) x5 i
  53.           {6 |! i1 T2 ?0 ~5 C3 W  b* ^8 z4 G( k2 }
  54.             buzzer = 1;           //打开蜂鸣器) h2 T: o6 [, L2 h+ S
  55.           }7 _" ?8 v' `8 @" O. h; e9 ?
  56.           else
    / e& Q( _# I4 L  ]0 ]6 h& V
  57.           {                                        % d2 p* \" q" a5 G0 N
  58.             buzzer = 0;                //关闭蜂鸣器
    ' Q! P7 @( L3 g4 d
  59.             reportLater=0;                //上报延时计数
    5 r3 y% R0 N4 x/ s
  60.           }                                       
    5 A% ^) Y7 F9 z' l) b' C0 c
  61.         }" h* t. V# Q4 i" Z7 R* ?0 `
  62.         ErrorNum=0;                  //清空滤波计数
    . J8 V" P2 x5 I5 o; z
  63.         CheckNum=0;        + [, s9 ]% [4 ~. a1 \2 }: A
  64.       }0 T% E6 Z8 c* y; @3 {6 n7 {4 Q
  65.     }/ m" _8 ^" g+ i$ y+ E
  66. # `' G! f" o* d9 w& w" ~# R7 j
  67.     if(reportLater>=15)        //15s
    2 @4 m# K' i- i0 o! W- s
  68.     {
    5 ^+ E+ H0 g& D
  69.       led_gsm = 0;//打开led5 t3 i' o3 E# ^7 y
  70.                         
    4 f1 U1 ^2 `& F4 b, J% N
  71.       UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
    3 }% e$ `+ Q; D& V' l' i
  72.       i=3;' D! g( P; }# D. Q3 @# r9 w
  73.       while(i--) delay_ms(100);//延时1 N% k: \0 |; Q/ s
  74.                         / [& E/ N8 x1 l2 X9 I5 E
  75.       UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本0 q2 W! c, ?& c$ o  q: `  P
  76.       i=3;+ [8 W9 M1 }4 X$ L; w+ n
  77.       while(i--) delay_ms(100);//延时* g& s$ v/ @5 u! @
  78.                         UART_SendStr(USART1 ,"AT+CMGS="+8615555183057"\r\n",26); //测试号
    4 c( B9 `2 `* q2 v6 I/ X; T
  79. //      UART_SendStr(USART1 ,"AT+CMGS="+8618105140357"\r\n",26);  //可以修改电话号码
    4 y9 y) F  B0 Y0 Q, w4 R( y0 q
  80.       i=3;
    9 a3 m, l/ }6 @  w; t7 P: z
  81.       while(i--) delay_ms(100);//延时
      q6 d0 ?% h3 I. r
  82.                         
    ) |. m: u% y* t/ a1 P& b5 |+ C4 D
  83.       printf("help me !"); //发送短信息内容# e8 ?/ H. u0 E; v; @, H6 u
  84.       delay_ms(200);//延时
    0 q  ?! X4 V  K  ]. Y0 m' O
  85.                         
    6 o) @- y: v1 c# B1 }/ E$ N1 z
  86.       UART_SendStr(USART1 ,( char *)Crtl_Z, 1);        //发送
    7 ]0 Q. x/ O$ [+ }
  87.       i=40;* L( @( i6 O* p/ u9 ^
  88.       while(i--) delay_ms(100);//延时4 q- N4 T, `" C* d$ o6 b, y
  89.                         5 ]2 {( n" T. T! a7 p( ]
  90.       led_gsm =1;                //led关闭" @% o  {! x' x6 m, ]: m0 v# l
  91.       reportLater=0;        //上报标志清空
    7 t: v: R# `  v
  92.       keyLater=0;        //按键清零延时处理& }5 f9 v% w9 U/ ^4 ]
  93.     }
    6 K* [7 Y5 H, C$ J4 l% _
  94.                 - X0 c5 b0 B$ w% ?# V& g
  95.     if(key==0)                 //按键处理5 _; r% v( ~+ D' U0 L: ]( T% ?
  96.     {
    # `0 b$ x' O5 Y" W3 N' e+ A
  97.       delay_ms(3);          //按键消抖动
    9 l3 o* Z- g% |  m
  98.       if(key ==0)                 //按键处理! x4 h; Y, Y4 r" x9 |  H! q
  99.       {# ^4 n8 p* V7 j. O* j8 H% Y7 x3 @
  100.         reportLater=0;          //按键延时上报
    ) v7 ~0 @0 U1 E6 p0 ~! A
  101.         buzzer = 0;                 //关闭蜂鸣器+ N  I* Q, V- K
  102.         keyLater=0;                //按键延时处理
    % S  l  N% K3 o) ~& k' a
  103.       }
    & F2 W7 R# u3 C$ C, g
  104.     }+ K  ?7 D2 E, B- _
  105.         
    : V) P, P3 H, B( U5 l- r: H
  106.         }7 ~" Q! U* h; I  p2 T- Q
  107. }+ 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
赞 收藏 评论0 发布时间:2022-5-12 11:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版