找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32F103的摔倒报警装置源程序 MPU6050+SIM800C

  [复制链接]
跳转到指定楼层
楼主
ID:473410 发表于 2019-9-27 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  这个暑假学习了STM32,感觉功能十分强大,确实比51单片机高了几个档次。然后就在纠结做个什么作品出来,一开始的时候,本来是想做个平衡小车的,但是时间确实比较紧,还有别的事情要做,以及PID算法也没有过多的了解过,就用MPU6050加上SIM800C做了一个老人摔倒报警装置。然后用NRF24L01进行通信,将MPU的数据传输到带有SIM800C的32C8T6上,在中断种检测是否摔倒,然后向指定的号码(在程序中可改)报警。第一个是NRF和MPU的数据采集和传输代码,第二个是NRF和SIM的数据收集判断和报警装置的代码,还用到了NRF的一发多收和多发一收,以及收发切换的模式,有需要的老哥自行下载。

单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "timer.h"
  5. #include "led.h"
  6. #include "mpu6050.h"
  7. #include "inv_mpu.h"
  8. #include "inv_mpu_dmp_motion_driver.h"
  9. #include "24l01.h"



  10. extern u8 TX_ADDRESS[TX_ADR_WIDTH];
  11. extern u8 RX_ADDRESS[RX_ADR_WIDTH];


  12. //串口1发送1个字符
  13. //c:要发送的字符
  14. void usart1_send_char(u8 c)
  15. {           
  16.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
  17.         USART_SendData(USART1,c);  
  18. }

  19. //传送数据给匿名四轴上位机软件(V2.6版本)
  20. //fun:功能字. 0XA0~0XAF
  21. //data:数据缓存区,最多28字节!!
  22. //len:data区有效数据个数
  23. void usart1_niming_report(u8 fun,u8*data,u8 len)
  24. {
  25.         u8 send_buf[32];
  26.         u8 i;
  27.         if(len>28)return;        //最多28字节数据
  28.         send_buf[len+3]=0;        //校验数置零
  29.         send_buf[0]=0X88;        //帧头
  30.         send_buf[1]=fun;        //功能字
  31.         send_buf[2]=len;        //数据长度
  32.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //复制数据
  33.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //计算校验和        
  34.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //发送数据到串口1
  35. }


  36. //发送加速度传感器数据和陀螺仪数据
  37. //aacx,aacy,aacz:x,y,z三个方向上面的加速度值
  38. //gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
  39. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
  40. {
  41.         u8 tbuf[12];
  42.         tbuf[0]=(aacx>>8)&0XFF;
  43.         tbuf[1]=aacx&0XFF;
  44.         tbuf[2]=(aacy>>8)&0XFF;
  45.         tbuf[3]=aacy&0XFF;
  46.         tbuf[4]=(aacz>>8)&0XFF;
  47.         tbuf[5]=aacz&0XFF;
  48.         tbuf[6]=(gyrox>>8)&0XFF;
  49.         tbuf[7]=gyrox&0XFF;
  50.         tbuf[8]=(gyroy>>8)&0XFF;
  51.         tbuf[9]=gyroy&0XFF;
  52.         tbuf[10]=(gyroz>>8)&0XFF;
  53.         tbuf[11]=gyroz&0XFF;
  54.         usart1_niming_report(0XA1,tbuf,12);//自定义帧,0XA1
  55. }        

  56. //通过串口1上报结算后的姿态数据给电脑
  57. //aacx,aacy,aacz:x,y,z三个方向上面的加速度值
  58. //gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
  59. //roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00  ->  180.00度
  60. //pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度
  61. //yaw:航向角.单位为0.1度 0 -> 3600  对应 0 -> 360.0度
  62. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  63. {
  64.         u8 tbuf[28];
  65.         u8 i;
  66.         for(i=0;i<28;i++)tbuf[i]=0;//清0
  67.         tbuf[0]=(aacx>>8)&0XFF;
  68.         tbuf[1]=aacx&0XFF;
  69.         tbuf[2]=(aacy>>8)&0XFF;
  70.         tbuf[3]=aacy&0XFF;
  71.         tbuf[4]=(aacz>>8)&0XFF;
  72.         tbuf[5]=aacz&0XFF;
  73.         tbuf[6]=(gyrox>>8)&0XFF;
  74.         tbuf[7]=gyrox&0XFF;
  75.         tbuf[8]=(gyroy>>8)&0XFF;
  76.         tbuf[9]=gyroy&0XFF;
  77.         tbuf[10]=(gyroz>>8)&0XFF;
  78.         tbuf[11]=gyroz&0XFF;        
  79.         tbuf[18]=(roll>>8)&0XFF;
  80.         tbuf[19]=roll&0XFF;
  81.         tbuf[20]=(pitch>>8)&0XFF;
  82.         tbuf[21]=pitch&0XFF;
  83.         tbuf[22]=(yaw>>8)&0XFF;
  84.         tbuf[23]=yaw&0XFF;
  85.         usart1_niming_report(0XAF,tbuf,28);//飞控显示帧,0XAF
  86. }




  87. int main(void)
  88. {        
  89.   u8 report=1;                        //默认开启上报
  90.         u16 t=0;
  91.         u32 step_cnt;
  92.         u32 res;
  93.         u16 i;
  94.         u8 address1[5]={0x34,0x43,0x10,0x10,0x02};
  95.         u8 address2[5]={0x34,0x43,0x10,0x10,0x03};
  96.         u8 tmp_buf[33];
  97.         float pitch,roll,yaw;                 //欧拉角
  98.         short aacx,aacy,aacz;                //加速度传感器原始数据
  99.         short gyrox,gyroy,gyroz;        //陀螺仪原始数据
  100.         short temp;                                        //温度        
  101.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  102.         uart_init(500000);                 //串口初始化为500000
  103.         delay_init();        //延时初始化
  104.         LED_Init();                                          //初始化与LED连接的硬件接口
  105.         MPU_Init();                                        //初始化MPU6050
  106.         NRF24L01_Init();
  107.          
  108.          
  109.          /*u16 led0pwmval=0;
  110.         u16 a=17000;
  111.         u8 dir=1;        
  112.         delay_init();                     //延时函数初始化         
  113.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  114.         uart_init(115200);         //串口初始化为115200
  115.          LED_Init();                             //LED端口初始化
  116.          TIM3_PWM_Init(19999,71);         // 72分频,最高频率20000
  117.   while(1)
  118.         {
  119.                  delay_ms(500);         
  120.                 if(dir)led0pwmval+=500;
  121.                 else led0pwmval-=500;

  122.                  if(led0pwmval>18000)dir=0;
  123.                 if(led0pwmval==0)dir=1;               
  124.                 a+=500;
  125.                 if(a>19500) a=17500;
  126.                 TIM_SetCompare2(TIM3,a);   //以45°为基本转动单位
  127.                 LED0=!LED0;
  128.                 delay_ms(200);
  129.          }        */
  130.   while(mpu_dmp_init()&&NRF24L01_Check())        
  131.         {
  132.                 delay_ms(200);
  133.         }
  134.         while(1)
  135.         {
  136.                 NRF24L01_TX_Mode();
  137.                 if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  138.                 {
  139.                         temp=MPU_Get_Temperature();        //得到温度值
  140.                         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
  141.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据
  142.                         res=dmp_get_pedometer_step_count(&step_cnt);
  143.                         if(res)step_cnt=0;
  144.                         if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
  145.                         if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  146.                         //LED0=!LED0;
  147.                         //delay_ms(200);
  148.                         if(t%3==0)
  149.                         {   
  150.                                 for(i=0;i<5;i++)
  151.                                 {
  152.                                         TX_ADDRESS[i]=address1[i];
  153.                                         RX_ADDRESS[i]=address1[i];
  154.                                 }
  155.                           tmp_buf[0]=temp/1000+'0';
  156.                     tmp_buf[1]=temp/100%10+'0';
  157.                     tmp_buf[2]=temp/10%10+'0';
  158.                     tmp_buf[3]=temp%10+'0';
  159.                     temp=pitch*10;
  160.                     if(temp<0)
  161.                     {
  162.                             temp=-temp;
  163.                             tmp_buf[4]='-';
  164.                     }
  165.                     else
  166.                             tmp_buf[4]='+';
  167.                     tmp_buf[5]=temp/1000+'0';
  168.                     tmp_buf[6]=temp/100%10+'0';
  169.                     tmp_buf[7]=temp/10%10+'0';
  170.                     tmp_buf[8]=temp%10+'0';
  171.                                 
  172.                                 temp=roll*10;
  173.                     if(temp<0)
  174.                     {
  175.                             temp=-temp;
  176.                             tmp_buf[9]='-';
  177.                     }
  178.                     else
  179.                       tmp_buf[9]='+';
  180.                     tmp_buf[10]=temp/1000+'0';
  181.                     tmp_buf[11]=temp/100%10+'0';
  182.                     tmp_buf[12]=temp/10%10+'0';
  183.                     tmp_buf[13]=temp%10+'0';
  184.                                 
  185.                                 temp=yaw*10;
  186.                     if(temp<0)
  187.                     {
  188.                             temp=-temp;
  189.                             tmp_buf[14]='-';
  190.                     }
  191.                     else
  192.                             tmp_buf[14]='+';
  193.                     tmp_buf[15]=temp/1000+'0';
  194.                     tmp_buf[16]=temp/100%10+'0';
  195.                     tmp_buf[17]=temp/10%10+'0';
  196.                     tmp_buf[18]=temp%10+'0';
  197.                     
  198.                                 temp=step_cnt;
  199.                     if(temp<0)
  200.                     {
  201.                             temp=-temp;
  202.                             tmp_buf[19]='-';
  203.                     }
  204.                     else
  205.                             tmp_buf[19]='+';
  206.                     tmp_buf[20]=temp/1000+'0';
  207.                     tmp_buf[21]=temp/100%10+'0';
  208.                     tmp_buf[22]=temp/10%10+'0';
  209.                     tmp_buf[23]=temp%10+'0';
  210.                                 tmp_buf[27]=0+'0';//校验位
  211.                                 
  212.                     NRF24L01_TxPacket(tmp_buf);//向NRF1传输数据(航向角数据)
  213.                                 //delay_ms(10);
  214.                     
  215.                                 
  216.                                 LED0=!LED0;
  217.               delay_ms(100);
  218.                   }
  219.                         if(t%3==1)
  220.                         {
  221.                                 for(i=0;i<5;i++)
  222.                                 {
  223.                                         TX_ADDRESS[i]=address2[i];
  224.                                         RX_ADDRESS[i]=address2[i];
  225.                                 }
  226.                                 tmp_buf[0]=temp/1000+'0';
  227.                     tmp_buf[1]=temp/100%10+'0';
  228.                     tmp_buf[2]=temp/10%10+'0';
  229.                     tmp_buf[3]=temp%10+'0';
  230.                                 
  231.                                 temp=aacx*10;
  232.                     if(temp<0)
  233.                     {
  234.                             temp=-temp;
  235.                             tmp_buf[4]='-';
  236.                     }
  237.                     else
  238.                             tmp_buf[4]='+';
  239.                     tmp_buf[5]=temp/10000+'0';
  240.                     tmp_buf[6]=temp/1000%10+'0';
  241.                     tmp_buf[7]=temp/100%10+'0';
  242.                     tmp_buf[8]=temp/10%10+'0';
  243.                                 tmp_buf[9]=temp%10+'0';
  244.                                 
  245.                                 temp=aacy*10;
  246.                     if(temp<0)
  247.                     {
  248.                             temp=-temp;
  249.                             tmp_buf[10]='-';
  250.                     }
  251.                     else
  252.                       tmp_buf[10]='+';
  253.                     tmp_buf[11]=temp/10000+'0';
  254.                     tmp_buf[12]=temp/1000%10+'0';
  255.                     tmp_buf[13]=temp/100%10+'0';
  256.                     tmp_buf[14]=temp/10%10+'0';
  257.                                 tmp_buf[15]=temp%10+'0';
  258.                                 
  259.                                 temp=aacz*10;
  260.                     if(temp<0)
  261.                     {
  262.                             temp=-temp;
  263.                             tmp_buf[16]='-';
  264.                     }
  265.                     else
  266.                             tmp_buf[16]='+';
  267.                     tmp_buf[17]=temp/10000+'0';
  268.                     tmp_buf[18]=temp/1000%10+'0';
  269.                     tmp_buf[19]=temp/100%10+'0';
  270.                     tmp_buf[20]=temp/10%10+'0';
  271.                                 tmp_buf[21]=temp%10+'0';
  272.                     
  273.                                 temp=step_cnt;
  274.                     if(temp<0)
  275.                     {
  276.                             temp=-temp;
  277.                             tmp_buf[22]='-';
  278.                     }
  279.                     else
  280.                             tmp_buf[22]='+';
  281.                     tmp_buf[23]=temp/1000+'0';
  282.                     tmp_buf[24]=temp/100%10+'0';
  283.                     tmp_buf[25]=temp/10%10+'0';
  284.                     tmp_buf[26]=temp%10+'0';
  285.                                 tmp_buf[27]=1+'0';//校验位
  286.                                 
  287.                                 NRF24L01_TxPacket(tmp_buf);//向NRF2传输数据(加速度数据)
  288.                                 
  289.                                 LED0=!LED0;
  290.               delay_ms(100);
  291.                         }
  292.                         t++;
  293.                         if(t==100)t=0;
  294.                         //LED0=!LED0;
  295.             //delay_ms(200);
  296.           }
  297.                 //LED0=!LED0;
  298.           //delay_ms(200);
  299.         }         
  300. }
复制代码

所有资料51hei提供下载:
MPU6050-NRF24L01.7z (246.32 KB, 下载次数: 157)
SIM800C.7z (224.43 KB, 下载次数: 153)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:335251 发表于 2019-10-20 13:19 | 只看该作者
大佬,想做一个,有实物图片吗?
回复

使用道具 举报

板凳
ID:473410 发表于 2019-10-30 18:12 | 只看该作者
ymc1001 发表于 2019-10-20 13:19
大佬,想做一个,有实物图片吗?

你私聊我吧,给你发图片,东西都是手焊的,模块是买的
回复

使用道具 举报

地板
ID:632085 发表于 2019-10-30 18:48 | 只看该作者
还是可以的
回复

使用道具 举报

5#
ID:473410 发表于 2019-11-2 10:24 | 只看该作者

这是用32做的第一个东西,还比较粗糙
回复

使用道具 举报

6#
ID:71535 发表于 2019-11-2 19:00 | 只看该作者
寄存器版本很难得了,好多工程师改用库了。寄存器版本能帮助理解32系统。
回复

使用道具 举报

7#
ID:473410 发表于 2019-11-2 22:04 | 只看该作者
waerdeng 发表于 2019-11-2 19:00
寄存器版本很难得了,好多工程师改用库了。寄存器版本能帮助理解32系统。

确实,用寄存器能更好的理解32,但是用库函数就会方便些,鱼和熊掌不可兼得
回复

使用道具 举报

8#
ID:664234 发表于 2020-2-29 22:30 | 只看该作者
请问楼主32和sim800c要分开供电吗
回复

使用道具 举报

9#
ID:757694 发表于 2020-5-21 19:42 | 只看该作者
大佬能发下原理图吗 新手 ,设计要用到但基础实在太差了
回复

使用道具 举报

10#
ID:724849 发表于 2020-8-19 12:12 | 只看该作者
希望能发下原理图。 谢谢
回复

使用道具 举报

11#
ID:888720 发表于 2021-3-5 16:08 | 只看该作者
老哥,能发一下原理图或者实物接线看看吗?感激不尽!
回复

使用道具 举报

12#
ID:970301 发表于 2021-12-24 20:19 | 只看该作者
刚好想做小车摔倒检测,谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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