91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

基于STM32跑步路徑記錄

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-09-18 09:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

基于STM32跑步路徑記錄

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

現(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信息結(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)緯度來決定當前位置。因此實現(xiàn)功能方式類似于公交報站實現(xiàn)方式,所有路徑需要提交采集路線,進行路徑保存。




審核編輯:劉清


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

    關注

    6076

    文章

    45501

    瀏覽量

    670818
  • GPS技術
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10603
  • sram
    +關注

    關注

    6

    文章

    821

    瀏覽量

    117496
  • STM32F103
    +關注

    關注

    34

    文章

    496

    瀏覽量

    67786
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    LAT1171+STM32F745 USART1 Bootloader 失敗原因分析與解決

    使用 STM32F745 進行產(chǎn)品開發(fā)的時候,出現(xiàn)了使用 STM32CubeProgramer 無法通過 USART1 Bootloader 進行程序升級的問題。為了解決客戶的問題,我在 NUCLEO-F746ZG 開發(fā)板上,復現(xiàn)了同樣的現(xiàn)象,本文針對這個現(xiàn)象,分析了該問
    發(fā)表于 01-11 17:33 ?0次下載

    ESP32 編譯過程中 bootloader 配置階段的 CMake 緩存沖突錯誤,記錄

    CMake 識別的源碼路徑與緩存中記錄的不一致。 錯誤原因分析 這個錯誤提示非常明確: CMake 當前嘗試使用 D:/v5.5.1/frameworks/esp-idf-v5.5.1 路徑
    發(fā)表于 12-23 07:07

    電能質(zhì)量在線監(jiān)測裝置的暫態(tài)事件記錄的事件記錄容量是多少?

    電能質(zhì)量在線監(jiān)測裝置的暫態(tài)事件記錄容量分為 事件臺賬容量 (僅記錄事件關鍵參數(shù))和 波形記錄容量 (完整記錄事件波形數(shù)據(jù))兩類,容量大小與設備等級、存儲配置密切相關,且普遍支持外部存儲
    的頭像 發(fā)表于 12-10 17:50 ?1295次閱讀
    電能質(zhì)量在線監(jiān)測裝置的暫態(tài)事件<b class='flag-5'>記錄</b>的事件<b class='flag-5'>記錄</b>容量是多少?

    電源管理芯片在跑步機中的應用

    跑步是一項全民性的健身運動,跑步機作為一種現(xiàn)代化健身器材,已經(jīng)越來越多地融入到人們的日常生活當中。
    的頭像 發(fā)表于 09-30 11:40 ?1600次閱讀
    電源管理芯片在<b class='flag-5'>跑步</b>機中的應用

    京東:調(diào)用用戶行為API分析購買路徑,優(yōu)化頁面跳轉(zhuǎn)邏輯

    ? ?在電商平臺的激烈競爭中, 用戶購買路徑的流暢性 直接影響轉(zhuǎn)化率。京東通過深度整合用戶行為API,構(gòu)建了完整的購買路徑分析體系,顯著優(yōu)化了頁面跳轉(zhuǎn)邏輯。以下是關鍵技術實現(xiàn)路徑: 一、用戶行為
    的頭像 發(fā)表于 09-18 14:38 ?673次閱讀
    京東:調(diào)用用戶行為API分析購買<b class='flag-5'>路徑</b>,優(yōu)化頁面跳轉(zhuǎn)邏輯

    鐵路巡檢升級:云翎智能高精度執(zhí)法記錄儀+指揮調(diào)度系統(tǒng)實現(xiàn)故障秒級響應

    數(shù)據(jù)實時回傳;結(jié)合AI智能調(diào)度算法,動態(tài)優(yōu)化響應路徑,將故障識別與資源調(diào)度效率提升至秒級。云翎智能高精度巡檢執(zhí)法記錄儀一、系統(tǒng)核心架構(gòu)與技術實現(xiàn)高精度執(zhí)法記錄儀硬件
    的頭像 發(fā)表于 07-29 22:37 ?788次閱讀
    鐵路巡檢升級:云翎智能高精度執(zhí)法<b class='flag-5'>記錄</b>儀+指揮調(diào)度系統(tǒng)實現(xiàn)故障秒級響應

    STM32CUBEIDE使用UCOS的時候,頭文件路徑已經(jīng)添加了,依舊提示未找到路徑怎么解決?

    在使用UCOS的時候,頭文件路徑已經(jīng)添加了,他依舊提示未找到路徑怎么解決
    發(fā)表于 07-25 06:28

    智能路徑調(diào)度:AI驅(qū)動負載均衡的異常路徑治理實踐

    在AI驅(qū)動的數(shù)據(jù)中心網(wǎng)絡環(huán)境中,傳統(tǒng)的“盡力而為”和“無差別均分”負載均衡策略已力不從心。基于路徑綜合質(zhì)量的動態(tài)WCMP機制,通過實時感知路徑狀態(tài)、果斷剔除異常、智能調(diào)度“健康”資源,有效解決了AI流量對網(wǎng)絡高可靠、高性能的核心訴求。
    的頭像 發(fā)表于 07-03 16:26 ?1208次閱讀
    智能<b class='flag-5'>路徑</b>調(diào)度:AI驅(qū)動負載均衡的異常<b class='flag-5'>路徑</b>治理實踐

    【正點原子STM32MP257開發(fā)板試用】系統(tǒng)更新

    【正點原子STM32MP257開發(fā)板試用】系統(tǒng)更新 本文介紹了正點原子 STM32MP257 開發(fā)板實現(xiàn)固件上傳與系統(tǒng)更新的主要流程。 項目介紹 前期準備工作包括:官方資料更新記錄查詢、固件下載
    發(fā)表于 06-17 18:35

    AGV小車中的動態(tài)路徑規(guī)劃算法揭秘

    在現(xiàn)代倉儲、物流和制造業(yè)中,自動導引車(AGV)的身影日益普遍。它們?nèi)缤趧诘墓は?,在復雜的環(huán)境中自主穿梭,高效地完成物料搬運任務。而支撐AGV實現(xiàn)智能導航的核心技術之一,便是路徑規(guī)劃。特別是當環(huán)境
    的頭像 發(fā)表于 06-17 15:54 ?1735次閱讀
    AGV小車中的動態(tài)<b class='flag-5'>路徑</b>規(guī)劃算法揭秘

    言必信_如何選擇適合跑步機的電源濾波器

    本文主要介紹了跑步機電源濾波器的作用、選擇與使用要點,以及濾波器的插入損耗特性。在選擇跑步機電源濾波器時,應考慮電源參數(shù)電壓、電流、電磁兼容標準要求、插入損耗特性以及安規(guī)認證與安全性。
    的頭像 發(fā)表于 06-09 17:12 ?737次閱讀
    言必信_如何選擇適合<b class='flag-5'>跑步</b>機的電源濾波器

    基于STM32的衛(wèi)星GPS路徑記錄儀(附完整源代碼)實例項目下載

    基于STM32的衛(wèi)星GPS路徑記錄儀(附完整源代碼)實例項目推薦下載!
    發(fā)表于 05-29 21:35

    每周推薦!基于STM32開發(fā)項目實例下載(含PCB、原理圖、源碼等)

    、論文等) 基于STM32的武警哨位聯(lián)動報警系統(tǒng)設計,支持以太網(wǎng)和WIFI通信(硬件、源碼、論文等) 項目實例下載! 4、基于STM32的衛(wèi)星GPS路徑記錄儀(附完整源代碼) 基
    發(fā)表于 05-26 14:01

    基于STM32的衛(wèi)星GPS路徑記錄儀(附完整源代碼)

    基于STM32的衛(wèi)星GPS路徑記錄儀(附完整源代碼) 項目實例下載! 純分享帖,需要者可點擊附件免費獲取完整資料~~~【免責聲明】本文系網(wǎng)絡轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時間告知,刪
    發(fā)表于 05-23 20:48

    從人工記錄到智能巡檢:云翎智能單北斗記錄儀如何重塑電力巡檢

    從人工記錄到智能巡檢,云翎智能單北斗記錄儀以其高精度定位、實時數(shù)據(jù)傳輸與智能管理能力,徹底重塑了電力設施的檢查流程。通過北斗衛(wèi)星導航系統(tǒng)的核心技術優(yōu)勢,云翎智能單北斗記錄儀實現(xiàn)了對電力巡檢人員的精準
    的頭像 發(fā)表于 04-03 14:58 ?856次閱讀
    從人工<b class='flag-5'>記錄</b>到智能巡檢:云翎智能單北斗<b class='flag-5'>記錄</b>儀如何重塑電力巡檢