一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

基于STM32跑步路徑記錄

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

基于STM32跑步路徑記錄

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

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

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

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

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

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,波特率可設置

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

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

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

poYBAGMl1VuAcSN1AAJWRsuDDFA662.png#pic_centerpYYBAGMl1VuALeEnAAOOC8U2fBs276.png#pic_center

2.4 蜂鳴器

??蜂鳴器:有源蜂鳴器

poYBAGMl1VuANwshAAHuk9Zbvm0921.png#pic_center

3.電路設計

poYBAGMl1VyAJQlhAAGj2YUgI74662.png#pic_center

4.實物展示

pYYBAGMl1VyAPjb8AAYQaG5owXc416.png#pic_centerpoYBAGMl1V2AbU4tAAbxna4FSIQ113.png#pic_center

4.軟件設計

4.1 GPS定位信息獲取

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

pYYBAGMl1V2AQhWMAARi-lW3NT4103.png#pic_center

/*
函數(shù)功能:分析BDGSV信息
函數(shù)參數(shù):GPS_DecodeInfo:nmea信息結構體
		  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信息結構體
		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信息結構體
		  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)緯度來決定當前位置。因此實現(xiàn)功能方式類似于公交報站實現(xiàn)方式,所有路徑需要提交采集路線,進行路徑保存。




審核編輯:劉清


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

    關注

    6058

    文章

    44821

    瀏覽量

    644704
  • GPS技術
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10364
  • sram
    +關注

    關注

    6

    文章

    780

    瀏覽量

    115531
  • STM32F103
    +關注

    關注

    33

    文章

    481

    瀏覽量

    64844
收藏 人收藏

    評論

    相關推薦

    FRED的光路和光路歷史記錄

    用戶之后使用診斷工具,如光路追跡路徑報告、雜散光報告、圖像偽影診斷工具,以及在分析表面中使用射線選擇過濾器。 創(chuàng)建/用戶線光歷史記錄文件 此選項保存每條光線的每個交點的坐標數(shù)據(jù),可以用于重新繪制選定路徑的光線軌跡。通常,這是通
    發(fā)表于 03-07 08:55

    DS1678實時事件記錄器技術手冊

    DS1678為實時時鐘(RTC)事件記錄儀,用來記錄每次觸發(fā)/INT引腳的非周期、異步事件的時間和日期。該器件記錄第一次事件發(fā)生時的秒、分、時、星期、日期、月、年及世紀信息,并開啟16位歷時
    的頭像 發(fā)表于 02-27 15:27 ?245次閱讀
    DS1678實時事件<b class='flag-5'>記錄</b>器技術手冊

    初次啟動沖擊記錄儀時具體該如何操作?別著急,答案就在視頻教程里!#數(shù)據(jù)記錄儀 #沖擊記錄儀 #沖擊監(jiān)測

    數(shù)據(jù)記錄
    虹科工業(yè)物聯(lián)網(wǎng)技術
    發(fā)布于 :2025年02月10日 10:38:12

    QCC3040藍牙模塊助力跑步機功能升級

    跑步機或者健身車中應用主端音頻藍牙模組的方案主要涉及到音頻傳輸和無線控制,提供一個無縫、無線的運動體驗。一、音頻傳輸主端音頻藍牙模組ANS-BT302DM使用QCC3040方案,可以用于無線音頻
    的頭像 發(fā)表于 01-09 15:07 ?425次閱讀
    QCC3040藍牙模塊助力<b class='flag-5'>跑步</b>機功能升級

    霍爾傳感器的應用——跑步

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

    霍爾元件DH220在跑步機中的應用

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

    霍爾開關給跑步機帶來精準感應

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

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

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

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

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

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

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

    佑美:綠光心率監(jiān)測技術與AI在智能跑步機領域的應用

    隨著科技的迅猛發(fā)展,健身設備的智能化趨勢愈加明顯。Umay佑美作為杭州亞運會的官方指定供應商,近期推出了其最新款U4跑步機,整合了綠光心率監(jiān)測與人工智能(AI)健康訓練指導系統(tǒng)。這一創(chuàng)新不僅提升
    的頭像 發(fā)表于 09-24 16:04 ?1372次閱讀

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

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

    精準記錄,高效分析:單北斗現(xiàn)場記錄儀在各行各業(yè)的應用

    在這個信息爆炸、效率至上的時代,每一個細節(jié)的記錄與分析都成為了推動行業(yè)進步的關鍵力量。單北斗現(xiàn)場記錄儀,作為集高精度定位、高清視頻錄制、智能數(shù)據(jù)分析于一體的創(chuàng)新設備,正悄然改變著各行各業(yè)的作業(yè)模式
    的頭像 發(fā)表于 08-28 11:46 ?588次閱讀
    精準<b class='flag-5'>記錄</b>,高效分析:單北斗現(xiàn)場<b class='flag-5'>記錄</b>儀在各行各業(yè)的應用

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

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

    干貨分享 數(shù)據(jù)記錄儀自動測量與記錄加速度:振動,顛簸,沖擊和定位

    什么是加速度數(shù)據(jù)記錄儀?我們?nèi)绾?b class='flag-5'>記錄振動?顛簸或沖擊是什么意思?我們可以使用什么方法來檢測因沖擊而造成的貨物損壞?“快速峰值”是什么意思?一篇文章讓你弄懂所有問題!
    的頭像 發(fā)表于 07-04 14:46 ?610次閱讀
    干貨分享  數(shù)據(jù)<b class='flag-5'>記錄</b>儀自動測量與<b class='flag-5'>記錄</b>加速度:振動,顛簸,沖擊和定位