找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3253|回复: 1
打印 上一主题 下一主题
收起左侧

基于STM8S单片机的跌倒报警仪设计

[复制链接]
跳转到指定楼层
楼主
1.1、报警装置发展现状和发展趋势
近年来,随着计算机技术、网络技术、传感器技术等高科技技术的发展,以及半导体制造工艺的提高,智能设备的性能有了很大的提高。
目前跌倒报警装置是通过无线对讲系统研发的,它外观相对精美,但是设计忽略了一个问题,人性化,因为大多数产品不够人性化,另外,部分设备需要进行操作按钮、实施对讲,就更不现实。当前智能装备了较多的传感器和智能系统,为设计成功研制提供了研究平台。
1.2研究的意义和价值
利用智能设备进行跌倒检测是一个可行的且有很大推广潜力的技术,同时甚至可以完成两个工作:跌倒检测和救助通信。这样不仅可以降低系统成本,实时监测人体活动,还可以结合GPS确定用户的跌倒位置。第一时间发现跌倒事件发生地点。因此,基于智能设备的上述优点,本文设计了一种装置小巧,携带方便的智能跌倒监控设备。

联系QQ:824238920



单片机源程序如下:
  1. #include <SoftwareSerial.h>
  2. #include <MsTimer2.h>
  3. #include "Wire.h"
  4. #include "I2Cdev.h"
  5. #include "MPU6050.h"

  6. MPU6050 accelgyro;
  7. #define NUM     10
  8. #define NUM_XYZ 6
  9. //int16_t ax[NUM], ay[NUM], az[NUM];
  10. //int16_t gx[NUM], gy[NUM], gz[NUM];
  11. int16_t agxyz[NUM_XYZ][NUM];
  12. long Sumagxyz[NUM_XYZ];
  13. long Avgagxyz[NUM_XYZ];

  14. bool blinkState = false;

  15. const int BEEP = 10;
  16. const int KEY_0 = 8;
  17. const int LED   = 9;
  18. static unsigned char index = 0;
  19. static unsigned char Send = 3;
  20. static unsigned char Key_State = 0;
  21. static unsigned char Waring    = 0;
  22. static unsigned char BEEP_State = 0;

  23. static unsigned char Tmr20msFlag = 0;
  24. static unsigned char gMainLoop100msCnt  = 1;  
  25. static unsigned char gMainLoop500msCnt  = 2;
  26. static unsigned char gMainLoop1000msCnt = 3;
  27. static unsigned char gSchedularType     = 0;
  28. static int lastKEY0 = 0;

  29. char nmeaSentence[68];
  30. String last_latitude  = "";
  31. String last_longitude = "";

  32. String Set_latitude  = "";
  33. String Set_longitude = "";

  34. String g_latitude     = "";
  35. String g_longitude    = "";
  36. SoftwareSerial mySerial(2, 3); // RX, TX
  37. void flash()
  38. {                        
  39.   Tmr20msFlag = 1;
  40.   //Serial.println("20ms");
  41. }

  42. void  Task_20ms(void)
  43. {
  44.     KeyCheck();
  45.     if(Key_State)
  46.     {  
  47.         GetData();
  48.     }
  49. }

  50. void  Task_100ms(void)
  51. {
  52.     if(Key_State)
  53.     {  
  54.        if( (Check()) && ( Waring == 0))
  55.        {
  56.            Waring = 1;
  57.            Send   = 0;
  58.        }
  59.     }
  60.     else
  61.     {
  62.        Waring = 0;
  63.     }
  64.     if( Waring == 0 )
  65.     {
  66.         BEEP_State = HIGH;
  67.     }
  68.     else
  69.     {
  70.         BEEP_State = !BEEP_State;
  71.     }
  72.     digitalWrite(BEEP,BEEP_State); //蜂鸣器响
  73.     //Serial.println("100ms");   
  74. }

  75. void  Task_500ms(void)
  76. {
  77.     if(Waring == 1)
  78.     {
  79.         if( Send == 0 )
  80.         {
  81.             SendGPS0();
  82.             Send = 1;
  83.         }
  84.         else
  85.         {  
  86.             SendGPS1();  
  87.             Send = 0;
  88.         }
  89.     }
  90.     else
  91.     {
  92.         //Waring==0;
  93.     }
  94.   //Serial.println("500ms);
  95. }

  96. void  Task_1000ms(void)
  97. {
  98.     //Serial.println("1000ms");
  99. }

  100. void GetData(void)
  101. {
  102.     int16_t lax, lay, laz;
  103.     int16_t lgx, lgy, lgz;
  104.     accelgyro.getMotion6(&lax, &lay, &laz, &lgx, &lgy, &lgz);   
  105.     agxyz[0][index] = lax;    agxyz[1][index] = lay,    agxyz[2][index] = laz;
  106.     agxyz[3][index] = lgx,    agxyz[4][index] = lgy,    agxyz[5][index] = lgz;
  107.     if( index > NUM )   index = 0;
  108. }

  109. bool Check(void)
  110. {
  111.    bool reval = 0;
  112.    unsigned char i= 0;
  113.    unsigned char j= 0;
  114.    for( i = 0;i < NUM_XYZ; i++ )
  115.    {
  116.         Sumagxyz[i] = agxyz[i][0]+agxyz[i][1]+agxyz[i][2]+agxyz[i][3]+agxyz[i][4]+agxyz[i][5]+agxyz[i][6]+agxyz[i][7]+agxyz[i][8]+agxyz[i][9];
  117.         Avgagxyz[i] = Sumagxyz[i]/NUM;
  118.         Sumagxyz[i] = 0;
  119.         for( j = 0;j < NUM; j++ )
  120.         {
  121.             Sumagxyz[i] = Sumagxyz[i] + (agxyz[i][j] -Avgagxyz[i])*(agxyz[i][j] -Avgagxyz[i]);
  122.         }
  123.         Avgagxyz[i]= Sumagxyz[i]/NUM;  
  124.         Avgagxyz[i]= Avgagxyz[i]/10000;;
  125.    }
  126.    if((Avgagxyz[0]>100)&&(Avgagxyz[1]>100)&&(Avgagxyz[2]>100))
  127.    {
  128.      reval = 1;
  129.    }
  130.     return reval;
  131. }

  132. void  Task_IDLE(void)
  133. {
  134.      KeyCheck();
  135.      if(Key_State)
  136.      {  
  137.           GetGPS();
  138.      }
  139.      else
  140.      {
  141.      }
  142.    //Serial.println("IDLE");
  143. }

  144. void KeyCheck(void)
  145. {
  146.   int lKEY0 = digitalRead(KEY_0);
  147.   if(( lKEY0 != lastKEY0) && (lKEY0 == 1 ))
  148.   {
  149.      Key_State = !Key_State;
  150.      if(Key_State)
  151.      {  
  152.           digitalWrite(LED,LOW);
  153.           Serial.println("Lock");
  154.      }
  155.      else
  156.      {
  157.           digitalWrite(LED,HIGH);
  158.           Serial.println("UnLock");
  159.      }
  160.   }
  161.   lastKEY0 = lKEY0;
  162. }

  163. String parseGprmcLat(String s)
  164. {
  165.     int pLoc = 0;  int lEndLoc = 0;   int dEndLoc = 0;   String lat;
  166.     if(s.substring(0,4) == "GPRM")
  167.     {   
  168.         for(int i = 0; i < 5; i++)
  169.         {
  170.             if(i < 3)   {   pLoc    = s.indexOf(',', pLoc+1);                                                        }
  171.             if(i == 3)  {   lEndLoc = s.indexOf(',', pLoc+1);    lat = s.substring(pLoc+1, lEndLoc);                 }
  172.             else        {   dEndLoc = s.indexOf(',', lEndLoc+1); lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);  }
  173.         }
  174.         return lat;
  175.     }
  176. }

  177. String parseGprmcLon(String s)
  178. {
  179.     int pLoc = 0;   int lEndLoc = 0;   int dEndLoc = 0;   String lon;
  180.     if(s.substring(0,4) == "GPRM")
  181.     {
  182.         for(int i = 0; i < 7; i++)
  183.         {
  184.             if(i < 5)   {    pLoc    = s.indexOf(',', pLoc+1);                                                         }
  185.             if(i == 5)  {    lEndLoc = s.indexOf(',', pLoc+1);     lon = s.substring(pLoc+1, lEndLoc);                 }
  186.             else        {    dEndLoc = s.indexOf(',', lEndLoc+1);  lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);  }
  187.         }
  188.         return lon;
  189.     }  
  190. }

  191. String DataChange(String s)
  192. {
  193.    int i=0;   int pLoc = 0;  int lEndLoc = 0;
  194.    String DD=""; String FF=""; String NE="";
  195.    String FFo="";   char FF0[20]="";   
  196.    float n=0.0;
  197.    String Output="";
  198.    
  199.    pLoc    = s.indexOf('.',0);
  200.    lEndLoc = s.indexOf(' ',0);
  201.    
  202.    DD = s.substring(0, pLoc-2);   
  203.    FF = s.substring(pLoc-2,lEndLoc);
  204.    NE = s.substring(lEndLoc+1,lEndLoc+2);
  205.    
  206.    n = FF.toFloat()/60;  dtostrf(n,0,10,FF0);
  207.    for(i=1;i<10;i++)   {    FFo += FF0[i];    }
  208.    
  209.    Output = NE+": "+DD+FFo;
  210.    return Output;
  211. }

  212. void GetGPS(void)
  213. {
  214.     String latitude  = "";                 //纬度
  215.     String longitude = "";                 //经度
  216.     while (mySerial.available())
  217.     {
  218.         char c = mySerial.read();
  219.         switch(c)
  220.         {
  221.             case '
  222.                     mySerial.readBytesUntil('*', nmeaSentence, 67);  
  223.                     latitude  = parseGprmcLat(nmeaSentence);
  224.                     longitude = parseGprmcLon(nmeaSentence);
  225.                     if(latitude > "") {  
  226.                         //Serial.println("latitude: " + latitude);
  227.                         //g_latitude = latitude;
  228.                         g_latitude = DataChange(latitude);  
  229.                     }                  
  230.                     if(longitude> "") {  
  231.                       //Serial.println("longitude: " + longitude);  
  232.                       //g_longitude = longitude;  
  233.                       g_longitude = DataChange(longitude);  
  234.                     }
  235.                     break;
  236.            default:
  237.                 break;
  238.         }
  239.     }
  240. }

  241. void SendGPS0()
  242. {
  243.     if( ( g_latitude  != last_latitude  ) && ( g_latitude  > "" ) )
  244.     {
  245.         Serial.println("latitude: "  + g_latitude );
  246.     }
  247.     last_latitude = g_latitude;

  248. }
  249. void SendGPS1()
  250. {
  251.     if(( g_longitude != last_longitude ) && ( g_longitude > "" ))
  252.     {
  253.         Serial.println("longitude: " + g_longitude);
  254.     }
  255.     last_longitude = g_longitude;
  256. }

复制代码


所有资料51hei提供下载(只发了主程序文件):
【代码】基于STM8S的跌倒报警仪设计 code.rar (1.98 KB, 下载次数: 42)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272824 发表于 2018-5-12 23:56 | 只看该作者
怎么没有硬件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表