精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

基于STM32跑步路徑記錄

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

基于STM32跑步路徑記錄

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

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

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

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

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

2.模塊選型

2.1 主控MCU:STM32F103C8最小系統板

??STM32最小系統板:STM32系統板

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衛星系統

支持3.3V-5V供電,可以方便接入3.3V或者5V單片機系統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采用串口協議,直接接上電源,在空曠的地方只要接收到衛星信號即可返回衛星定位數據。

pYYBAGMl1V2AQhWMAARi-lW3NT4103.png#pic_center

/*
函數功能:分析BDGSV信息
函數參數:GPS_DecodeInfo:nmea信息結構體
		  buf:接收到的GPS數據緩沖區首地址
*/
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的條數
	posx=GPS_GetCommaOffset(p1,3); 					//得到可見北斗衛星總數
	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);	//得到衛星編號
			else break;
			posx=GPS_GetCommaOffset(p1,5+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_eledeg=GPS_StrtoNum(p1+posx,&dx);//得到衛星仰角 
			else break;
			posx=GPS_GetCommaOffset(p1,6+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_azideg=GPS_StrtoNum(p1+posx,&dx);//得到衛星方位角
			else break;
			posx=GPS_GetCommaOffset(p1,7+j*4);
			if(posx!=0XFF)GPS_DecodeInfo->beidou_slmsg[slx].beidou_sn=GPS_StrtoNum(p1+posx,&dx);	//得到衛星信噪比
			else break;
			slx++;
		}
		p=p1+1;//切換到下一個BDGSV信息
	}
}


4.2 衛星數量獲取

/*
函數功能:分析GNGGA信息
函數參數:
		GPS_DecodeInfo:nmea信息結構體
		buf:接收到的GPS數據緩沖區首地址
*/
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狀態
	if(posx!=0XFF)GPS_DecodeInfo->gpssta=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,7);								//得到用于定位的衛星數
	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 移動速度獲取

/*
函數功能:分析GNVTG信息
函數參數:GPS_DecodeInfo:nmea信息結構體
		  buf:接收到的GPS數據緩沖區首地址
*/

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 主函數

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數據)
  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();//更新數據到屏幕
    }
    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();//更新數據到屏幕
      DelayMs(50);
      BEEP=0;
      DelayMs(200);
      break;
    }
    DelayMs(1);
    time++;
    if(time>=50)
    {
      time=0;
      OLED_RefreshGram();//更新數據到屏幕
      LED1=!LED1;
    }
  }
  y=60;
  while(1)
  {
		if(usart2_flag)//獲取GPS數據
		{
			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);//獲取衛星數量
      GPS_GNVTG_InfoGet(&GPS_DecodeInfo,usart2_rx_buff);//獲取移動速度
      GPS_GNRMC_InfoGet(&GPS_DecodeInfo,usart2_rx_buff);//獲取經緯度		
			printf("衛星數量: %d\r\n",GPS_DecodeInfo.posslnum);
			E_data=GPS_DecodeInfo.longitude;
			N_data=GPS_DecodeInfo.latitude;
			printf("經度:%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)//衛星數量超過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();//更新數據到屏幕
  }
}

5.注意事項

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




審核編輯:劉清


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

    關注

    6032

    文章

    44525

    瀏覽量

    633257
  • GPS技術
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10245
  • sram
    +關注

    關注

    6

    文章

    764

    瀏覽量

    114638
  • STM32F103
    +關注

    關注

    33

    文章

    476

    瀏覽量

    63496
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    多臺倉儲AGV協作全局路徑規劃算法的研究

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

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

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

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

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

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

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

    4G執法記錄儀,5G執法記錄

    4G執法記錄儀,5G執法記錄儀系統設計
    的頭像 發表于 04-14 17:08 ?684次閱讀
    4G執法<b class='flag-5'>記錄</b>儀,5G執法<b class='flag-5'>記錄</b>儀

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

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

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

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

    求問電子設計自學路徑

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

    TSMaster 總線記錄功能操作指南

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

    電源路徑的基本概念

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

    labview怎么記錄時間和數據

    LabVIEW可以用于記錄時間和數據,以下是一個詳細的教程,介紹如何使用LabVIEW進行時間和數據記錄。 時間和數據記錄是許多實驗和監測應用的關鍵部分。LabVIEW是一種強大的數據獲取和處理
    的頭像 發表于 12-27 17:00 ?3540次閱讀

    WT2605C-32N語音芯片:跑步機音樂新搭檔,暢享健康奔跑旋律

    在現代健身領域,唯創知音的WT2605C-32N藍牙音頻MP3音樂解碼語音芯片IC作為音樂解碼的新搭檔,為跑步機帶來了更為智能、富有音樂節奏的健康奔跑體驗,引領跑步健身的新時代。1.藍牙連接,自由
    的頭像 發表于 12-13 09:19 ?470次閱讀
    WT2605C-32N語音芯片:<b class='flag-5'>跑步</b>機音樂新搭檔,暢享健康奔跑旋律

    weblogic修改jdk路徑

    路徑的情況。本文將詳細介紹如何在WebLogic中修改JDK路徑。 一、背景介紹 Java Development Kit(JDK)是Java開發人員必備的工具包,用于編譯、運行和調試Java程序
    的頭像 發表于 12-05 14:46 ?1258次閱讀