RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32跑步路徑記錄

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-09-18 09:30 ? 次閱讀

基于STM32跑步路徑記錄

隨著科技不斷進步,電子化設(shè)備不斷進入涌入我們的日常生活。生活水平的提高,各項健身運動應(yīng)運而生,然后,健身運動不能盲目進行,科學(xué)的健身方式才能有效的提升我們自身的身體素質(zhì)。

現(xiàn)如今各自手環(huán)手表的出現(xiàn), 通過智能手環(huán),用戶可以記錄日常生活中的鍛煉、睡眠、部分還有飲食等實時數(shù)據(jù),并將這些數(shù)據(jù)與手機、平等同步,起到通過數(shù)據(jù)指導(dǎo)健康生活的作用。

智能手環(huán)作為可穿戴設(shè)備,其功能還是比較強大的,其開發(fā)涉及智能手環(huán)MCU數(shù)據(jù)指令到藍牙IC的傳輸、藍牙到APP的數(shù)據(jù)通信協(xié)議、APP到手機內(nèi)部的通信調(diào)試邏輯實現(xiàn)、APP數(shù)據(jù)到云端服務(wù)器的數(shù)據(jù)庫算法設(shè)計等一系列的開發(fā)。支持多種運動監(jiān)控模式,可以實時監(jiān)控身體的各項性能指標(biāo)。

我國智能手環(huán)產(chǎn)品真正大范圍進入消費市場是在2012年以后,一方面是這一時期步入4G時代以后手機智能化趨勢加快,與手機一樣具備數(shù)據(jù)分享的智能手環(huán)的出現(xiàn)給智能手環(huán)的研究和應(yīng)用打開了另一個世界。另一方面是更多實用性功能快速出現(xiàn),手環(huán)不僅僅是用來記錄身體特征的單純工具,同時也可以滿足通話、移動支付、人體識別、智能提醒功能以及分享功能,極大的擴寬了手環(huán)的應(yīng)用人群。佩戴智能手環(huán)帶來健康、科技、自信有品位的良好感受,成為了高科技產(chǎn)品的典型之一。

??基于STM32的跑步路記錄主要用于記錄用戶在日常身體鍛煉中,可設(shè)置跑步路徑,跑步路線規(guī)劃,在50~80m前提醒拐彎,蜂鳴器報警提示;記錄跑步路徑,顯示當(dāng)前位置,通過按鍵設(shè)置跑步距離。

2.模塊選型

2.1 主控MCU:STM32F103C8最小系統(tǒng)板

??STM32最小系統(tǒng)板:STM32系統(tǒng)板

pYYBAGMl1VqAadOtAALXCNzhAsY724.png#pic_center

2.2 OLED顯示屏:0.96寸SPI/IIC接口

??顯示屏幕:OLED屏幕

poYBAGMl1VqAeYm6AAG1S6bL93A707.png#pic_center

2.3 GPS定位模塊

GPS定位:GPS模塊 北斗模塊 雙模定位 ATGM336H

pYYBAGMl1VqADX-SAAGLWKsdK4I204.png#pic_center

支持北斗/GPS/GLONASS衛(wèi)星系統(tǒng)

支持3.3V-5V供電,可以方便接入3.3V或者5V單片機系統(tǒng)3、板載可充電電子,可加速熱啟動搜星過程

默認波特率9600,波特率可設(shè)置

TTL電平UART接口,用戶連接單片機的串口TTL電平或者USB-TTL模塊測試。

帶有SMA和 IPEX兩種天線接口,方便選擇自己需要的外置天線。

帶有PPS授時輸出引腳,方便做時鐘同步等應(yīng)用。

poYBAGMl1VuAcSN1AAJWRsuDDFA662.png#pic_centerpYYBAGMl1VuALeEnAAOOC8U2fBs276.png#pic_center

2.4 蜂鳴器

??蜂鳴器:有源蜂鳴器

poYBAGMl1VuANwshAAHuk9Zbvm0921.png#pic_center

3.電路設(shè)計

poYBAGMl1VyAJQlhAAGj2YUgI74662.png#pic_center

4.實物展示

pYYBAGMl1VyAPjb8AAYQaG5owXc416.png#pic_centerpoYBAGMl1V2AbU4tAAbxna4FSIQ113.png#pic_center

4.軟件設(shè)計

4.1 GPS定位信息獲取

??ATGM336H采用串口協(xié)議,直接接上電源,在空曠的地方只要接收到衛(wèi)星信號即可返回衛(wèi)星定位數(shù)據(jù)。

pYYBAGMl1V2AQhWMAARi-lW3NT4103.png#pic_center

/*
函數(shù)功能:分析BDGSV信息
函數(shù)參數(shù):GPS_DecodeInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_BDGSV_InfoGet(GPS_Msg *GPS_DecodeInfo,u8 *buf)
{
	u8 *p,*p1,dx;
	u8 len,i,j,slx=0;
	u8 posx;
	p=buf;
	p1=(u8*)strstr((const char *)p,"$BDGSV");
	if(!p1)return; //沒有查找成功
	len=p1[7]-'0';								//得到BDGSV的條數(shù)
	posx=GPS_GetCommaOffset(p1,3); 					//得到可見北斗衛(wèi)星總數(shù)
	if(posx!=0XFF)GPS_DecodeInfo->beidou_svnum=GPS_StrtoNum(p1+posx,&dx);
	for(i=0; ibeidou_slmsg[slx].beidou_num=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星編號
			else break;
			posx=GPS_GetCommaOffset(p1,5+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_eledeg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星仰角 
			else break;
			posx=GPS_GetCommaOffset(p1,6+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_azideg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星方位角
			else break;
			posx=GPS_GetCommaOffset(p1,7+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_sn=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星信噪比
			else break;
			slx++;
		}
		p=p1+1;//切換到下一個BDGSV信息
	}
}


4.2 衛(wèi)星數(shù)量獲取

/*
函數(shù)功能:分析GNGGA信息
函數(shù)參數(shù):
		GPS_DecodeInfo:nmea信息結(jié)構(gòu)體
		buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_GNGGA_InfoGet(GPS_Msg *GPS_DecodeInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	p1=(u8*)strstr((const char *)buf,"$GNGGA");
	if(!p1)return; //沒有查找成功
	posx=GPS_GetCommaOffset(p1,6);								//得到GPS狀態(tài)
	if(posx!=0XFF)GPS_DecodeInfo->gpssta=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,7);								//得到用于定位的衛(wèi)星數(shù)
	if(posx!=0XFF)GPS_DecodeInfo->posslnum=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,9);								//得到海拔高度
	if(posx!=0XFF)GPS_DecodeInfo->altitude=GPS_StrtoNum(p1+posx,&dx);
}

4.3 移動速度獲取

/*
函數(shù)功能:分析GNVTG信息
函數(shù)參數(shù):GPS_DecodeInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/

void GPS_GNVTG_InfoGet(GPS_Msg *GPS_DecodeInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	p1=(u8*)strstr((const char *)buf,"$GNVTG");
	if(!p1)return; //沒有查找成功
	posx=GPS_GetCommaOffset(p1,7);								//得到地面速率
	if(posx!=0XFF)
	{
		GPS_DecodeInfo->speed=GPS_StrtoNum(p1+posx,&dx);
		if(dx<3)GPS_DecodeInfo->speed*=GPS_GetPow(10,3-dx);	 	 		//確保擴大1000倍
	}
}

4.4 主函數(shù)

int main()
{
  u8 key;
  char buff[100];
	u32 E_data=0,E_data2=0,N_data=0,N_data2=0;
	LEDInit();
  KEYInit();
  Beep_Init();
	USARTx_Init(USART1,115200);
	USARTx_Init(USART2,9600);//串口3初始化(接收GPS數(shù)據(jù))
  TIMx_Init(TIM2,72,20000);//定時20ms,用定時器2輔助usart1接收
	TIMx_Init(TIM3,72,20000);
	USARTx_Sendstr(USART1,"串口1初始化成功\r\n");
	OLED_Init();//OLED初始化
  u8 x=5;
  u8 y=16;
  u8 stat=0xff;
  u8 stat2=0;
  u16 time=0;
  u16 distance=400;
AA:
  while(1)
  {
    /*距離選擇*/
    OLED_ClearGram();
    OLED_Display_Font(32,0,16,2);
    OLED_Display_Font(32+16,0,16,3);
    OLED_Display_Font(32+16*2,0,16,4);
    OLED_Display_Font(32+16*3,0,16,5);
    OLED_Display_str(24,16,16,(u8 *)"400 M");
    OLED_Display_str(24,16*2,16,(u8 *)"1000 M");
    OLED_Display_str(24,16*3,16,(u8 *)"2000 M");
    OLED_Display_str(128-30,y,16,(u8 *)"<--");
    key=GetKeyVual(1);
    if(key==1)//距離選擇
    {
      if(y<48)y+=16;
      else y=16;   
      OLED_RefreshGram();//更新數(shù)據(jù)到屏幕
    }
    else if(key==2)//確認
    {
      BEEP=1;
      if(y==16)distance=400;
      else if(y==32)distance=1000;
      else if(y==48)distance=2000;
      OLED_RefreshGram();//更新數(shù)據(jù)到屏幕
      DelayMs(50);
      BEEP=0;
      DelayMs(200);
      break;
    }
    DelayMs(1);
    time++;
    if(time>=50)
    {
      time=0;
      OLED_RefreshGram();//更新數(shù)據(jù)到屏幕
      LED1=!LED1;
    }
  }
  y=60;
  while(1)
  {
		if(usart2_flag)//獲取GPS數(shù)據(jù)
		{
			usart2_rx_buff[usart2_cnt]='\0';
			//printf("%s\r\n",usart2_rx_buff);
			usart2_flag=0;
			usart2_cnt=0;
			GPS_GNGGA_InfoGet(&GPS_DecodeInfo,usart2_rx_buff);//獲取衛(wèi)星數(shù)量
      GPS_GNVTG_InfoGet(&GPS_DecodeInfo,usart2_rx_buff);//獲取移動速度
      GPS_GNRMC_InfoGet(&GPS_DecodeInfo,usart2_rx_buff);//獲取經(jīng)緯度		
			printf("衛(wèi)星數(shù)量: %d\r\n",GPS_DecodeInfo.posslnum);
			E_data=GPS_DecodeInfo.longitude;
			N_data=GPS_DecodeInfo.latitude;
			printf("經(jīng)度:%c,%d \r\n",GPS_DecodeInfo.ewhemi,E_data);
			printf("緯度:%c,%d\r\n",GPS_DecodeInfo.nshemi,N_data);		
      printf("移動速度:%.1f. km/h\r\n",GPS_DecodeInfo.speed/1000.0);
    }
    if(GPS_DecodeInfo.posslnum>=3 && stat2==0)//衛(wèi)星數(shù)量超過3顆開始定位
    {
      printf("stat2==%d\n",stat2);
      BEEP=1;
      DelayMs(1000);
      BEEP=0;
      stat2=1;
      
    }
    key=GetKeyVual(1);
    if(key==1 && stat2==1)//開始
    {
      LED1=!LED1;
      stat=0;
      x=5;
      y=60;
    }
    else if(key==2)//退出
    {
      LED3=LED2=1;
      LED1=!LED1;
      stat=0xff;
      stat2=0;
      y=16;
      goto AA;//重新選擇距離
    }
    OLED_ClearGram();
    OLED_Display_Font(15,35,16,2);
    OLED_Display_Font(15+16,35,16,3);
    snprintf(buff,sizeof(buff),":%d M",distance);
    OLED_Display_str(15+16*2,35,16,(u8 *)buff);
    OLED_Display_Font(15,15,16,0);
    OLED_Display_Font(15+16,15,16,1);
    //snprintf(buff,sizeof(buff),":%.fkm/h",GPS_DecodeInfo.speed/1000.0);
    snprintf(buff,sizeof(buff),":%.fkm/h",GPS_DecodeInfo.speed/1000.0);
    OLED_Display_str(15+16*2,15,16,(u8 *)buff);
    OLED_DrawRectangle(5, 5, 124, 60);
    OLED_DrawRectangle(4, 4, 125, 61);
    gui_circle(x, y,1,3,1);
    if(stat==0)
    {
      if(N_data-N_data2>=4)
      {
        x+=2;
        N_data2=N_data;
      }
    }
    else if(stat==1)
    {
      if(N_data-N_data2>=2 || N_data2-N_data>=2)
      {
        N_data2=N_data;
        y--;
      }
    }
    else if(stat==2)
    {
      if(N_data2-N_data>=3)
      {
        N_data2=N_data;
        x-=2;
      }
    }
    else if(stat==3)
    {
      if(N_data-N_data2>=3 || N_data2-N_data>=3)
      {
        N_data2=N_data;
        y+=2;
      }
    }
    if(x>=124 && y==60)
    {
      x=124;
      stat=1;
    }
    else if(y==5 && x>=124)
    {
      x=124;
      stat=2;
    }
    else if(x<=5 && y==5)
    {
      x=5;
      stat=3;
    }
    else if(x==5 && y>=60 && (stat==3 || stat==4))
    {
      BEEP=1;
      DelayMs(100);
      BEEP=0;
      stat=4;
      LED1=LED2=1;
      LED3=!LED3;
      y=60;
      x=5;
      
    }
    if(time>=20)
    {
      time=0;
      if(stat==0xff)
      {
        LED3=LED2=1;
        LED1=!LED1;
      }
      else if(stat<=3)
      {
        LED1=LED3=1;
        LED2=!LED2;
      }
    }
    DelayMs(1);
    time++;
    OLED_RefreshGram();//更新數(shù)據(jù)到屏幕
  }
}

5.注意事項

??由于采用的是STM32F103實現(xiàn)本功能,該CPU主頻僅有72MHZ,SRAM和flash均比較小,所以此示例并未調(diào)用地圖接口實現(xiàn),而是通過直接判斷經(jīng)緯度來決定當(dāng)前位置。因此實現(xiàn)功能方式類似于公交報站實現(xiàn)方式,所有路徑需要提交采集路線,進行路徑保存。




審核編輯:劉清


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634594
  • GPS技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    10257
  • sram
    +關(guān)注

    關(guān)注

    6

    文章

    767

    瀏覽量

    114674
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    477

    瀏覽量

    63600
收藏 人收藏

    評論

    相關(guān)推薦

    霍爾傳感器的應(yīng)用——跑步

    1. 速度檢測 跑步機通過霍爾開關(guān)與磁性輪的結(jié)合,精確監(jiān)測跑帶的速度。磁性輪安裝在跑步機電機軸或滾筒上,隨著跑帶的轉(zhuǎn)動產(chǎn)生周期性磁場變化,霍爾開關(guān)檢測到這些變化后將信號傳遞至控制系統(tǒng),用于計算速度
    的頭像 發(fā)表于 12-03 14:38 ?151次閱讀
    霍爾傳感器的應(yīng)用——<b class='flag-5'>跑步</b>機

    霍爾元件DH220在跑步機中的應(yīng)用

    在現(xiàn)代健身器材中,跑步機無疑是家庭和健身房中的???。而霍爾元件作為一種關(guān)鍵的傳感設(shè)備,在提升跑步機性能方面發(fā)揮著重要作用。本文將詳細介紹霍爾元件在跑步機中的應(yīng)用原理、優(yōu)勢以及它對用戶體驗的提升。
    的頭像 發(fā)表于 11-28 15:06 ?156次閱讀

    霍爾開關(guān)給跑步機帶來精準(zhǔn)感應(yīng)

    跑步是一項全民性的運動,跑步機作為一種現(xiàn)代健身器材,已經(jīng)越來越多地融入到人們的日常生活當(dāng)中。它不僅提供了便捷的運動方式,更為我們的健康帶來了諸多益處。那么霍爾開關(guān)在跑步機中起到什么作用呢? 1.速度
    的頭像 發(fā)表于 11-06 15:47 ?197次閱讀
    霍爾開關(guān)給<b class='flag-5'>跑步</b>機帶來精準(zhǔn)感應(yīng)

    多臺倉儲AGV協(xié)作全局路徑規(guī)劃算法的研究

    多AGV動態(tài)路徑規(guī)劃需解決沖突避免,核心在整體協(xié)調(diào)最優(yōu)。規(guī)劃時考慮道路設(shè)計、擁堵、最短路徑和交通管制,用A*算法避免重復(fù)路徑和轉(zhuǎn)彎,同時需交通管制防相撞。創(chuàng)新響應(yīng)需求是關(guān)鍵,良好路徑規(guī)
    的頭像 發(fā)表于 10-28 17:38 ?254次閱讀
    多臺倉儲AGV協(xié)作全局<b class='flag-5'>路徑</b>規(guī)劃算法的研究

    交流電動機與跑步機直流電機的區(qū)別是什么?

    交流電動機(AC Motor)和跑步機直流電機(DC Motor)是兩種不同類型的電機,它們在結(jié)構(gòu)、工作原理、效率、應(yīng)用場景等方面存在一些區(qū)別。 交流電動機與跑步機直流電機的區(qū)別 在現(xiàn)代工業(yè)
    的頭像 發(fā)表于 10-21 14:05 ?382次閱讀

    跑步機的心聲——N8900藍牙音頻芯片賦予智能健身新維度

    國內(nèi)健身器材市場年銷售中跑步機占比超過一半,顯示出其在健身器材領(lǐng)域的重要地位。國家衛(wèi)生部門的公開講話中提到,健康產(chǎn)業(yè)對國民經(jīng)濟的貢獻具有無限前景,并強調(diào)了政府對健康產(chǎn)業(yè)的積極引導(dǎo)和支持。預(yù)計健康產(chǎn)業(yè)
    的頭像 發(fā)表于 09-30 08:02 ?241次閱讀
    <b class='flag-5'>跑步</b>機的心聲——N8900藍牙音頻芯片賦予智能健身新維度

    記錄到管理:單北斗工作記錄儀如何優(yōu)化工作流程

    在這個快節(jié)奏的時代,每一分效率的提升都是企業(yè)競爭力的關(guān)鍵。從繁瑣的手工記錄到智能化的數(shù)據(jù)管理,技術(shù)的飛躍正悄然改變著我們的工作方式。頂堅單北斗工作記錄儀如何成為優(yōu)化工作流程的得力助手,實現(xiàn)從記錄
    的頭像 發(fā)表于 08-30 11:09 ?268次閱讀
    從<b class='flag-5'>記錄</b>到管理:單北斗工作<b class='flag-5'>記錄</b>儀如何優(yōu)化工作流程

    大小鼠也需要跑步機——ZL-013小動物實驗跑步

    簡單介紹: 小動物實驗跑步機(動物實驗跑臺),可實現(xiàn)大、小鼠通用。 所有參數(shù)設(shè)置均在儀器上的觸摸屏上完成,方便快捷。觸屏還能夠監(jiān)測實驗進度,顯示實驗結(jié)果,方便實時觀察數(shù)據(jù),修正實驗。小動物實驗跑步
    發(fā)表于 08-26 15:38

    4G執(zhí)法記錄儀,5G執(zhí)法記錄

    4G執(zhí)法記錄儀,5G執(zhí)法記錄儀系統(tǒng)設(shè)計
    的頭像 發(fā)表于 04-14 17:08 ?717次閱讀
    4G執(zhí)法<b class='flag-5'>記錄</b>儀,5G執(zhí)法<b class='flag-5'>記錄</b>儀

    更改stm32cubemx固件包下載路徑后不能下載固件包,為什么?

    更改stm32cubemx固件包下載路徑后不能下載固件包
    發(fā)表于 04-08 06:24

    STM32CubeMx生成工程后下次再打開,Project Manager就不能修改工程名和保存路徑了怎么解決?

    STM32CubeMx生成工程后下次再打開,Project Manager就不能修改工程名和保存路徑了,有什么辦法解決嗎?
    發(fā)表于 04-02 08:27

    求問電子設(shè)計自學(xué)路徑

    新手小白也想自己做出小車、小電視甚至小機器人等等有意思的項目,有C語言基礎(chǔ)并且對stm32有了一丁點基礎(chǔ)的了解,但是硬件、電路設(shè)計以及更高階的程序語言仍然一竅不通。請問自學(xué)路徑是怎么樣的(硬件和軟件)?如何從0開始入門呢?如果有推薦的網(wǎng)課或者書籍,那就更好啦!謝謝各位大佬
    發(fā)表于 03-23 21:42

    TSMaster 總線記錄功能操作指南

    總線記錄主要是指對CAN、LIN、FlexRay,Ethernet等總線系統(tǒng)的通信數(shù)據(jù)進行記錄和分析,是工程師在故障診斷、性能分析和數(shù)據(jù)記錄方面的重要工具,作為TSMaster軟件中使用率很高
    的頭像 發(fā)表于 03-05 08:21 ?703次閱讀
    TSMaster 總線<b class='flag-5'>記錄</b>功能操作指南

    電源路徑的基本概念

    電源路徑是指電流從電源到負載的傳輸路徑。在電路中,電源是提供電能的設(shè)備,而負載則是消耗電能的設(shè)備。電源路徑的穩(wěn)定性和效率對電路的性能和可靠性有著重要的影響。本文將介紹電源路徑的基本概念
    的頭像 發(fā)表于 01-18 15:39 ?807次閱讀
    電源<b class='flag-5'>路徑</b>的基本概念

    labview怎么記錄時間和數(shù)據(jù)

    LabVIEW可以用于記錄時間和數(shù)據(jù),以下是一個詳細的教程,介紹如何使用LabVIEW進行時間和數(shù)據(jù)記錄。 時間和數(shù)據(jù)記錄是許多實驗和監(jiān)測應(yīng)用的關(guān)鍵部分。LabVIEW是一種強大的數(shù)據(jù)獲取和處理
    的頭像 發(fā)表于 12-27 17:00 ?3843次閱讀
    RM新时代网站-首页