当前位置:   article > 正文

2024年基于STM32单片机的步数测量系统(免费开源)_mpu6050计步,2024年最新附项目源码_怎么在单片机中实现步数监测

怎么在单片机中实现步数监测

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#include “inv_mpu.h”
#include “inv_mpu_dmp_motion_driver.h”
#include “mpu6050.h”
#include <string.h>
#include “esp8266.h”
#include “timer.h”
typedef enum {no=0,yes=!no}bool;//定义一个bool类型
extern bool key_flag;
bool key_flag=no;

float weight=60,weight_index=0.8214;//假设体重为60kG,运动指数
void OLED1_showchinese(void);//第一页显示函数
void OLED_2showchinese(void);//第二页显示
int main(void)
{
u8 key_number;//获取按键值

  unsigned long	walk_count ,walk_time;//步行步数,步行时间。
delay\_init(168);		  
  LED\_Init();		
usart3\_init(115200);		//初始化串口1波特率为115200

IIC\_Init();         //MPU6050的IIC初始化
  IIC\_Init1();       //OLED的IIC初始化
OLED\_Init();       //OLED初始化 
	MPU\_Init();					//初始化MPU6050
mpu\_dmp\_init();        //初始化6050的DMP库
OLED\_init\_showchinese();
NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
TIM3\_Int\_Init(60000-1,8400-1);	//定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数400000次为40000ms 
ESP8266\_Set\_ok(USART3,"AT+RST");
delay\_ms(1000);	
ESP8266\_Set\_ok(USART3,"AT+CWMODE=3");
delay\_ms(1000);
ESP8266\_Set\_ok(USART3,"AT+CWJAP=\""Ssid"\",\""PassWord"\"");
delay\_ms(1000);
connect\_bemfa();//连接巴发云
while(1)
{
	
	key_number=KEY\_Scan(1);//读取按键返回值
if(key_number==1)//切换页面函数
	{
		key_flag=!key_flag;
	  OLED\_CLS();
	}

	
	if(key_flag==no)
		
	   {   OLED1\_showchinese();//第一页显示函数
			   //connect\_fasong(char\_step,char\_sporttime,char\_caloreis,"50" );//传输
			   LED2=!LED2;
		 }
	else
	{  
		
		   OLED\_2showchinese();
		   dmp\_get\_pedometer\_step\_count(&walk_count); 
	     dmp\_get\_pedometer\_walk\_time(&walk_time);
		   sprintf(char_step,"%lu",walk_count );//unsigend long 型变为无符号整型
		   sprintf(char_caloreis,"%.2f",walk_count\*30\*weight\*weight_index/100000);//计算消耗的能量
		   OLED\_P8x16Str(56,0,char_step );//显示计步步数
		   OLED\_P8x16Str(48,2,char_caloreis );//显示消耗能量
		   sprintf(char_sporttime,"%lu",walk_time/1000 );
		   OLED\_P8x16Str(70,4,char_sporttime);//显示运动时间
		   OLED\_P8x16Str(84,6,"50"); //显示目标步
			 delay\_ms(10);
		if(jishi==2)
			connect\_fasong(char_step,char_sporttime,char_caloreis,"50"	);//传输
		
	 }
         
		
     
                     
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

}


ESP8266.c



  • 1
  • 2
  • 3
  • 4
  • 5

#include <stdio.h>
#include “esp8266.h”
#include “string.h”
#include “sys.h”
unsigned char Receive_shuju[150];
unsigned char Okword=0;
char char_step[4],char_caloreis[6],char_sporttime[4];
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

USART\_DeInit(USART3);  //复位串口3

RCC\_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟
RCC\_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10; //GPIOB11和GPIOB10初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO\_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOB11,和GPIOB10


GPIO\_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11复用为USART3
GPIO\_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10复用为USART3 

USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
USART\_Init(USART3, &USART_InitStructure); //初始化串口3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断

USART\_Cmd(USART3, ENABLE);                    //使能串口 


NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02 ;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;		//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
NVIC\_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

}

//发送字节
void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)
{
USART_SendData(USARTx,Data);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}

/********************************************************************
名称:WIFI模块设置函数
作用: 启动模块,以便可以实现无线接入和控制,并等待OK回复
********************************************************************/
void ESP8266_Set_ok(USART_TypeDef* USARTx, char *str)
{
uint16_t i = 0;
do{
USART_SendByte(USARTx, *(str + i));
i++;
}while(*(str + i) !=‘\0’);
delay_us(5);
USART_SendByte( USART3,‘\r’);
delay_us(5);
USART_SendByte( USART3,‘\n’);

while(USART\_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
while(!Okword);
	Okword=0;
  • 1
  • 2
  • 3

}
没有等待OK
void ESP8266_Set(USART_TypeDef* USARTx, char *str)
{
uint16_t i = 0;
do{
USART_SendByte(USARTx, *(str + i));
i++;
}while(*(str + i) !=‘\0’);
delay_us(5);
USART_SendByte( USART3,‘\r’);
delay_us(5);
USART_SendByte( USART3,‘\n’);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

}
/********************************************************************
名称:WIFI模块设置函数
作用: 启动模块,没有回车换行
********************************************************************/
void ESP8266_Set_Only(USART_TypeDef* USARTx, char *str)
{
uint16_t i = 0;
do{
USART_SendByte(USARTx, *(str + i));
i++;
}while(*(str + i) !=‘\0’);

while(USART\_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  • 1

}

void USART3_IRQHandler()
{

static int im=0;

//当 RDR 移位寄存器的内容已传输到 USART\_DR 寄存器时,该位由硬件置 1
if (USART\_GetITStatus(USART3,USART_IT_RXNE)!=RESET)//获取中断标志位,为1
	{
			   Receive_shuju[im] = USART\_ReceiveData( USART3 );
		     im++;
		  
		  	USART\_ClearITPendingBit(USART3,USART_IT_RXNE);	//清除中断标志位
		if((Receive_shuju[im-2]=='O')&&(Receive_shuju[im-1]=='K'))//接收到OK之后 Okword为1
		{
			im=0;
			Okword=1;
		}
			
	}
	if( im>140)
		im=0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

/********************************************************************
名称:心跳函数
作用:发送心跳。如果一分钟不发送心跳,服务器就会认为设备掉线,故建议30s发送一次心跳
在中断1中调用,和发送数据函数,留一个就行,发送数据也相当于心跳
********************************************************************/
void Ping(void)
{
ESP8266_Set(USART3,“cmd=0&msg=ping”); //发送心跳
}

void connect_topic(void)
{
//发送订阅指令,原格式为:cmd=1&uid=***UID***&topic=***Topic***
ESP8266_Set_Only(USART3,“cmd=1&uid=”);
ESP8266_Set_Only(USART3,Uid);
ESP8266_Set_Only(USART3,“&topic=”);

    //\*\*\*\*\*\*\*\*\*\*\*\* 需要修改以下部分 \*\*\*\*\*\*\*\*\*\*\*\*

    ESP8266\_Set\_Only(USART3,Topic);


    
   delay\_us(5);
    USART\_SendByte(USART3,'\r');//回车
   delay\_us(5);
    USART\_SendByte(USART3,'\n');   //换行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

}

void connect_bemfa(void)
{

    ESP8266\_Set(USART3,"AT+CIPMODE=1"); //开启透明传输模式
    delay\_ms(1000);
    ESP8266\_Set(USART3,"AT+CIPSTART=\"TCP\",\"bemfa.com\",8344");  // 连接服务器和端口
    delay\_ms(1000);
    ESP8266\_Set(USART3,"AT+CIPSEND"); //进入透传模式,下面发的都会无条件传输
    delay\_ms(1000);
    
    connect\_topic(); //连接订阅主题
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中…(img-Q0a1C0OP-1715629085714)]
[外链图片转存中…(img-GcgDD89Q-1715629085715)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/763482
推荐阅读
相关标签
  

闽ICP备14008679号