赞
踩
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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" );//传输 } }
}
ESP8266.c
#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
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寄存器
}
//发送字节
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;
}
没有等待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);
}
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; }
/********************************************************************
名称:心跳函数
作用:发送心跳。如果一分钟不发送心跳,服务器就会认为设备掉线,故建议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'); //换行
}
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(); //连接订阅主题
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中…(img-Q0a1C0OP-1715629085714)]
[外链图片转存中…(img-GcgDD89Q-1715629085715)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。