找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8799|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

基于STM32F103的摔倒報警裝置源程序 MPU6050+SIM800C

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:473410 發(fā)表于 2019-9-27 11:21 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  這個暑假學(xué)習(xí)了STM32,感覺功能十分強(qiáng)大,確實(shí)比51單片機(jī)高了幾個檔次。然后就在糾結(jié)做個什么作品出來,一開始的時候,本來是想做個平衡小車的,但是時間確實(shí)比較緊,還有別的事情要做,以及PID算法也沒有過多的了解過,就用MPU6050加上SIM800C做了一個老人摔倒報警裝置。然后用NRF24L01進(jìn)行通信,將MPU的數(shù)據(jù)傳輸?shù)綆в蠸IM800C的32C8T6上,在中斷種檢測是否摔倒,然后向指定的號碼(在程序中可改)報警。第一個是NRF和MPU的數(shù)據(jù)采集和傳輸代碼,第二個是NRF和SIM的數(shù)據(jù)收集判斷和報警裝置的代碼,還用到了NRF的一發(fā)多收和多發(fā)一收,以及收發(fā)切換的模式,有需要的老哥自行下載。

單片機(jī)源程序如下:
  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發(fā)送1個字符
  13. //c:要發(fā)送的字符
  14. void usart1_send_char(u8 c)
  15. {           
  16.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循環(huán)發(fā)送,直到發(fā)送完畢   
  17.         USART_SendData(USART1,c);  
  18. }

  19. //傳送數(shù)據(jù)給匿名四軸上位機(jī)軟件(V2.6版本)
  20. //fun:功能字. 0XA0~0XAF
  21. //data:數(shù)據(jù)緩存區(qū),最多28字節(jié)!!
  22. //len:data區(qū)有效數(shù)據(jù)個數(shù)
  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字節(jié)數(shù)據(jù)
  28.         send_buf[len+3]=0;        //校驗(yàn)數(shù)置零
  29.         send_buf[0]=0X88;        //幀頭
  30.         send_buf[1]=fun;        //功能字
  31.         send_buf[2]=len;        //數(shù)據(jù)長度
  32.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //復(fù)制數(shù)據(jù)
  33.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //計算校驗(yàn)和        
  34.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //發(fā)送數(shù)據(jù)到串口1
  35. }


  36. //發(fā)送加速度傳感器數(shù)據(jù)和陀螺儀數(shù)據(jù)
  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上報結(jié)算后的姿態(tài)數(shù)據(jù)給電腦
  57. //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
  58. //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
  59. //roll:橫滾角.單位0.01度。 -18000 -> 18000 對應(yīng) -180.00  ->  180.00度
  60. //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應(yīng) -90.00 -> 90.00 度
  61. //yaw:航向角.單位為0.1度 0 -> 3600  對應(yīng) 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;                        //默認(rèn)開啟上報
  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;                //加速度傳感器原始數(shù)據(jù)
  99.         short gyrox,gyroy,gyroz;        //陀螺儀原始數(shù)據(jù)
  100.         short temp;                                        //溫度        
  101.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  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();                     //延時函數(shù)初始化         
  113.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  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°為基本轉(zhuǎn)動單位
  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);        //得到加速度傳感器數(shù)據(jù)
  141.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺儀數(shù)據(jù)
  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);//用自定義幀發(fā)送加速度和陀螺儀原始數(shù)據(jù)
  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';//校驗(yàn)位
  211.                                 
  212.                     NRF24L01_TxPacket(tmp_buf);//向NRF1傳輸數(shù)據(jù)(航向角數(shù)據(jù))
  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';//校驗(yàn)位
  286.                                 
  287.                                 NRF24L01_TxPacket(tmp_buf);//向NRF2傳輸數(shù)據(jù)(加速度數(shù)據(jù))
  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. }
復(fù)制代碼

所有資料51hei提供下載:
MPU6050-NRF24L01.7z (246.32 KB, 下載次數(shù): 166)
SIM800C.7z (224.43 KB, 下載次數(shù): 161)

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏18 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:335251 發(fā)表于 2019-10-20 13:19 | 只看該作者
大佬,想做一個,有實(shí)物圖片嗎?
回復(fù)

使用道具 舉報

板凳
ID:473410 發(fā)表于 2019-10-30 18:12 | 只看該作者
ymc1001 發(fā)表于 2019-10-20 13:19
大佬,想做一個,有實(shí)物圖片嗎?

你私聊我吧,給你發(fā)圖片,東西都是手焊的,模塊是買的
回復(fù)

使用道具 舉報

地板
ID:632085 發(fā)表于 2019-10-30 18:48 | 只看該作者
還是可以的
回復(fù)

使用道具 舉報

5#
ID:473410 發(fā)表于 2019-11-2 10:24 | 只看該作者

這是用32做的第一個東西,還比較粗糙
回復(fù)

使用道具 舉報

6#
ID:71535 發(fā)表于 2019-11-2 19:00 | 只看該作者
寄存器版本很難得了,好多工程師改用庫了。寄存器版本能幫助理解32系統(tǒng)。
回復(fù)

使用道具 舉報

7#
ID:473410 發(fā)表于 2019-11-2 22:04 | 只看該作者
waerdeng 發(fā)表于 2019-11-2 19:00
寄存器版本很難得了,好多工程師改用庫了。寄存器版本能幫助理解32系統(tǒng)。

確實(shí),用寄存器能更好的理解32,但是用庫函數(shù)就會方便些,魚和熊掌不可兼得
回復(fù)

使用道具 舉報

8#
ID:664234 發(fā)表于 2020-2-29 22:30 | 只看該作者
請問樓主32和sim800c要分開供電嗎
回復(fù)

使用道具 舉報

9#
ID:757694 發(fā)表于 2020-5-21 19:42 | 只看該作者
大佬能發(fā)下原理圖嗎 新手 ,設(shè)計要用到但基礎(chǔ)實(shí)在太差了
回復(fù)

使用道具 舉報

10#
ID:724849 發(fā)表于 2020-8-19 12:12 | 只看該作者
希望能發(fā)下原理圖。 謝謝
回復(fù)

使用道具 舉報

11#
ID:888720 發(fā)表于 2021-3-5 16:08 | 只看該作者
老哥,能發(fā)一下原理圖或者實(shí)物接線看看嗎?感激不盡!
回復(fù)

使用道具 舉報

12#
ID:970301 發(fā)表于 2021-12-24 20:19 | 只看該作者
剛好想做小車摔倒檢測,謝謝了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表