个人项目——基于STM32与K60的智能设备

       最近刚考完试,小学弟找我帮他完成个项目,完成接入云的一些功能,S具体有STM32搭载S1216 GPS+北斗 双模定位模块采集经纬度,占用串口2;BMP180气压监测模块采集气压,占用IIC1,;ESP8266 WIFI模块与机智云通信,占用串口3,同时也占用了IIC2,;DHT11采集温湿度,占用PG11;MPU6050采集加速度,需要再占用一个IIC,但是STM32的IIC已经全部被占用了,正好小学弟熟悉K60,所以包括MPU6050在内的剩余模块在K60上实现;空气质量(我也没见过的模块,不是MQ系列的,头上还有个对管), 编码器采集速度。K60的数据通过串口发送给串口1。

        代码如下:

        点击下载源码

        因为我不熟悉K60,所以K60的东西我就不叙述了。本来小学弟是让我在STM32上实现所有功能的,奈何我想把ESP8266放到UART4上使用,但是无论怎么调试,还是没办法像USART1、USART2、USART3那样使用(USART是同步、异步串行通信,而UART是异步串行通信),ESP8266接到UART4上就是没有办法接入机智云,所以最终放弃了,改成了用K60去搭载MPU6050、编码器、空气质量模块,然后通过K60的串口将数据发送到STM32的串口1,在用STM32把数据发送到机智云。

        把主函数的代码贴一下:

dataPoint_t currentDataPoint;
u8 USART1_TX_BUF[USART2_MAX_RECV_LEN]; 					//串口1,发送缓存区
nmea_msg gpsx; 											//GPS信息
__align(4) u8 dtbuf[50];   								//打印缓存器
u8 wifi_sta=0;
//协议初始化
void Gizwits_Init(void)
{	
	TIM3_Int_Init(9,7199);//1MS系统定时
  usart3_init(9600);//WIFI初始化
	memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
	gizwitsInit();//缓冲区初始化
}
//显示GPS定位信息 
void Gps_Msg_Show(void)
{
 	float tp;		   	 
	tp=gpsx.longitude;	   
	//sprintf((char *)dtbuf,"Longitude:%.5f %1c   ",tp/=100000,gpsx.ewhemi);	//得到经度字符串	 
	printf("Longitude:%.5f %1c\r\n",tp/=100000,gpsx.ewhemi);
	currentDataPoint.valueLongitude = tp;
	tp=gpsx.latitude;	   
	//sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi);	//得到纬度字符串	 
	printf("Latitude:%.5f %1c   \r\n",tp/=100000,gpsx.nshemi); 
	currentDataPoint.valueLatitude = tp;	
}
 int main(void)
 { 
	u16 i,rxlen;
	 int x1=0,x2=0,x3=0;
	int keys;
	u8 wifi_con=0;//记录wifi连接状态 1:连接 0:断开  
	u8 key=0XFF;
	u8 upload=0; 
	u8 temperature;  	    
	u8 humidity; 	 
	delay_init();	    	 //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级	  
	uart_init(115200);	 	//串口初始化为9600	
	USART2_Init(38400);  //初始化串口2波特率为115200
	LED_Init();         	//LED初始化	 
	KEY_Init();				//按键初始化	
	Gizwits_Init();         //协议初始化
	DHT11_Init();
	BMP_Init();
	BMP_ReadCalibrationData();
	// POINT_COLOR=RED;
	if(SkyTra_Cfg_Rate(5)!=0)	//设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位. 
	{
		do
		{
			USART2_Init(9600);			//初始化串口3波特率为9600
	  	SkyTra_Cfg_Prt(3);			//重新设置模块的波特率为38400
			USART2_Init(38400);			//初始化串口3波特率为38400
      key=SkyTra_Cfg_Tp(100000);	//脉冲宽度为100ms
		}while(SkyTra_Cfg_Rate(5)!=0&&key!=0);//配置SkyTraF8-BD的更新速率为5Hz
		delay_ms(500);
	}
	while(1) 
	{		
		delay_ms(1);
		if(USART2_RX_STA&0X8000)		//接收到一次数据了
		{
			rxlen=USART2_RX_STA&0X7FFF;	//得到数据长度
			for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];	   
 			USART2_RX_STA=0;		   	//启动下一次接收
			USART1_TX_BUF[i]=0;			//自动添加结束符
			GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
			Gps_Msg_Show();				//显示信息	
			if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1
 		}
		if(wifi_con!=wifi_sta)
	   {
		   wifi_con=wifi_sta;
		   wifi_con?printf("connect"):printf("close");
	   }
		gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理
		if(USART_RX_STA&0x8000)//如果串口收到数据
		{					   
			x1=(USART_RX_BUF[0]-'0')*100+(USART_RX_BUF[1]-'0')*10+(USART_RX_BUF[2]-'0');
			
			x2=(USART_RX_BUF[3]-'0')*100+(USART_RX_BUF[4]-'0')*10+(USART_RX_BUF[5]-'0');
			
			x3=(USART_RX_BUF[6]-'0')*100+(USART_RX_BUF[7]-'0')*10+(USART_RX_BUF[8]-'0');
			
			USART_RX_STA=0;
		}	
		currentDataPoint.valueSpeed = x1;
		currentDataPoint.valueAcceleration = x2;
		currentDataPoint.valueAir = x3;
		DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值
		currentDataPoint.valueTemperature = temperature;
		currentDataPoint.valueHumidity = humidity;
		BMP_UncompemstatedToTrue();
		currentDataPoint.valuePressure = bmp180.p;
		//printf("\r\nPress:%ld\r\n",bmp180.p);
/*		
		LCD_ShowxNum(50,50,x1,3,24,0);
		LCD_ShowxNum(50,80,x2,3,24,0);
		LCD_ShowxNum(50,110,x3,3,24,0);
		*/
		
		 keys = KEY_Scan(0);
		if(keys==KEY1_PRES)//KEY1按键
		{
			printf("WIFI进入AirLink连接模式\r\n");
			gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
		}			
		if(keys==WKUP_PRES)//KEY_UP按键
		{  
			printf("WIFI复位,请重新配置连接\r\n");
			gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位 
			wifi_sta=0;//标志wifi已断开
		}
				
	}
}
 

        硬件连接如下:

        使用山外k60芯片采集数据,以固定格式发送:AABAABAAA,B表示小数部分,每三位数一个参数,分别是:速度、加速度、空气质量

        APP界面如下


        至此,教程结束,谢谢大家,也欢迎大家关注我的个人技术与资源分享公众号“linkutures”


猜你喜欢

转载自blog.csdn.net/tichimi3375/article/details/80628661