色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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均比較小,所以此示例并未調用地圖接口實現,而是通過直接判斷經緯度來決定當前位置。因此實現功能方式類似于公交報站實現方式,所有路徑需要提交采集路線,進行路徑保存。




審核編輯:劉清


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

    關注

    6035

    文章

    44553

    瀏覽量

    634727
  • GPS技術
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10257
  • sram
    +關注

    關注

    6

    文章

    767

    瀏覽量

    114677
  • STM32F103
    +關注

    關注

    33

    文章

    477

    瀏覽量

    63603
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    4G執法記錄儀,5G執法記錄儀系統設計
    的頭像 發表于 04-14 17:08 ?718次閱讀
    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 ?705次閱讀
    TSMaster 總線<b class='flag-5'>記錄</b>功能操作指南

    電源路徑的基本概念

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

    labview怎么記錄時間和數據

    LabVIEW可以用于記錄時間和數據,以下是一個詳細的教程,介紹如何使用LabVIEW進行時間和數據記錄。 時間和數據記錄是許多實驗和監測應用的關鍵部分。LabVIEW是一種強大的數據獲取和處理
    的頭像 發表于 12-27 17:00 ?3857次閱讀
    主站蜘蛛池模板: 偷窥美女3| 青草影院内射中出高潮-百度| 暖暖 日本 视频 在线观看免费| qvod激情图片| 无人区乱码区1卡2卡三卡在线| 天美传媒MV高清免费看| 成人免费网址在线| 51精品少妇人妻AV一区二区| 97视频免费上传播放| 免费在线观看黄色网址| 99re久久热在这里精品| 欧美精品99久久久啪啪| x8国产精品视频| 肉多荤文高h羞耻校园| 国产黄a三级三级三级| 雪恋电影完整版免费观看| 国产中文在线| 性生片30分钟| 国产中文欧美日韩在线| 天天影视香色欲综合网| 国产精品99久久久精品无码| 探花口爆颜射乳交日韩| 国产伦精品一区二区三区免费| 天天看高清影视在线18| 国产免费人成在线视频有码| 天天久久影视色香综合网| 国产睡熟迷奷系列精品| 亚洲区视频| 久久热免费视频| 97一期涩涩97片久久久久久久 | 国产精品99久久久久久AV下载| 秋霞av伦理片在线观看| FREECHINESE东北群交| 日本久久精品毛片一区随边看| 出租屋交换人妻 全文| 三级黃60分钟| 果冻传媒最新视频在线观看| 亚洲视频 在线观看| 麻豆AV无码蜜臀AV色哟| 爱情岛aqdlttv| 亚州免费一级毛片|