个人项目——基于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”


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
准备参与电赛了,前段花了一段时间学习了瑞萨单片机,听说,想得特等奖的四轴队伍必须用瑞萨单片机?要不然也可以考虑其他型号的,比如STM32K60这些常用的芯片。在参赛之前做过STM32相关的四轴。下面免费分享STM32K60相关资料。 STM32电赛资料 ASCII字符表 AT24C02 Explorer STM32F4_V1.5_SCH GPIO的配置种类 PWM模式体会 STM32F4xx_Clock_Configuration_V1.0.1 STM32F4xx中文参考手册 STM32F4开发指南-库函数版本_V1.0 STM32F10x常见应用解析 STM32中断优先级 STM32中断优先级与相关使用概念 STM32中使用GPIO的总结(超强) STM32中文参考手册_V10 USART串口配置方法 K60电赛资料 [LPLD_Kinetis底层库V2]函数手册 [跟我学OSKinetis]第5课-精度时间我做主!ADC! _ 拉普兰德电子技术 [跟我学OSKinetis]第7课-PIT定时器!So easy! _ 拉普兰德电子技术 [跟我学OSKinetis]第8课-FTM的PWM、输入捕获、正交解码 _ 拉普兰德电子技术 [跟我学OSKinetis]第10课-FlexBus之SRAM、LCD的应用 _ 拉普兰德电子技术 《飞思卡尔MCU应用开发》全攻略 ARM CORTEX -M4自学笔记:基于K60 I2C学习心得 K60时钟模式 K60中文资料整合版 LQ-K60P144-SYSVB核心板原理图 串口通信:UART、SPI、I2C区别 从零入手Kinetis系统开发(1-11) 关于IAR软件的Go_to_Definition_of功能问题的解决方法 三天入门 Cortex-M4 ----Kinetis(正式版) 由入门到精通吃透PID _LQ_LPTMR_脉冲计数通过 _LQ_LPTMR_延时 00_LED验证超频 00_LQ_test_pll_LED 00_LQ_uart_int_test_pll180 00_串口验证超频 01_GPIO及LED测试 02_串口循环收发 03_串口中断收发 04_GPIO按键演示 05_PIT定时中断 06_十二位和十六位ADC串口输出 07_PWM输出FTM1 08_PWM电机控制FTM1_1通道-PWM公式更正 08_PWM舵机控制FTM0_2通道-PWM公式更正 08_PWM舵机控制FTM1_2通道-PWM公式更正 10_超频LED指示 11_LQ_IIC_8451_UART 11_LQ_moniIIC_8451_UART_g输出14位加速度值 11_LQ_moniIIC_8451_UART输出14位加速度原始值 12_GPIO中断 13_LQ_OLED演示 14_LQ_OLED显示并口数据 15_并行口演示 16_LQ_SPI0通信待验证 16_SPI_CW10
### 回答1: 您好,我可以回答您的问题。基于stc15f2k60s2的红外遥控实验,是一种基于单片机的红外遥控技术,通过发送红外信号控制电器等设备的开关。这种实验需要使用红外遥控编码解码器和红外遥控器,编写相应的程序,实现控制功能。这种实验在智能家居、电子产品等领域有着广泛的应用。 ### 回答2: 基于STC15F2K60S2单片机的红外遥控实验可以使用红外遥控模块和编程来实现。 首先,我们需要连接STC15F2K60S2单片机和红外遥控模块。将红外接收器的VCC引脚连接到单片机的5V电源引脚,GND引脚连接到单片机的GND引脚,OUT引脚连接到单片机的一个GPIO引脚(例如P0口)。然后,将红外发射器的VCC引脚连接到单片机的5V电源引脚,GND引脚连接到单片机的GND引脚,OUT引脚连接到单片机的另一个GPIO引脚(例如P1口)。 接下来,我们需要编写程序来实现红外遥控功能。可以使用Keil C51等软件来编写代码。首先,需要初始化单片机的GPIO引脚和中断,并设置中断优先级。然后,编写中断服务函数来处理从红外接收器接收到的信号。在函数中,可以读取红外信号的数据,判断是哪个按键被按下,并执行相应的操作。例如,可以通过判断红外信号的值来控制LED的亮灭。 在编写完中断服务函数后,需要在主函数中进行一些初始化设置,例如设置时钟频率和其他必要的初始化。然后,开启中断,并进入主循环。在主循环中,等待红外信号的到来,并进行相应的处理。 总的来说,基于STC15F2K60S2单片机的红外遥控实验可以通过连接红外遥控模块和编写适当的程序来实现。这样,当红外遥控器发送信号时,单片机可以接收并解析该信号,并执行相应的操作。这个实验可以用于控制各种电器设备,如电视、空调、音响等。 ### 回答3: 基于STC15F2K60S2单片机的红外遥控实验是一种用于控制红外设备的实验方法。STC15F2K60S2是一款强大的单片机,具有丰富的外设和功能,可以用来开发各种应用。 在这个实验中,我们首先需要准备一个红外发射器和一个红外接收器。红外发射器用来发射红外信号,红外接收器用来接收发送的红外信号。 接下来,我们需要用STC15F2K60S2单片机连接红外发射器和红外接收器。通过编程,我们可以控制红外发射器发送特定的红外信号,并通过红外接收器接收到发送的信号。 为了实现遥控功能,我们需要将红外发射器与各种电子设备连接,如电视、空调等。通过编写适当的代码,我们可以控制这些设备的开关、音量、频道等功能。 在编程方面,我们可以利用STC15F2K60S2单片机的内置红外协议解码模块来解码接收到的红外信号,并将其转化为对应的操作指令。然后,我们可以进一步将这些命令与电子设备的控制命令进行匹配,从而实现对设备的遥控操作。 通过这个基于STC15F2K60S2的红外遥控实验,我们可以学习到如何利用单片机和红外技术来实现对电子设备的遥控。这不仅培养了我们的编程能力,还拓宽了我们的电子技术应用知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值