基于stm32的物联网、智能家居控制系统

文章目录

  • 前言
  • 一、环境介绍
  • 二、功能说明
  • 三、代码修改
  • 总结


前言

使用onenet平台进行远程传输数据和远程控制开发板,但由于onenet官方给的代码只对他家的开发板比较友好,对于初学者来说修改这些代码相对麻烦,所以我就分享STM32C8T6接入onenet云平台的代码,这款单片机是我们做课程设计中比较常用,以后大家在我这份代码的基础上进行修改即可,希望可以帮到大家。
假设你已经有了onenet账号,以及创建了一个MQTT协议的产品,并在产品中添加一个设备。如果你没有,以后再讲。

一、环境介绍

(1)单片机采用:STM32F103C8T6或者F1其他系列单片机
(2)上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。
(3)开发软件:keil5
(4)硬件连接功能:ESP8266接在STM32的串口上。通过AT指令与ESP8266进行通信。

二、功能说明

通过OneNet物联网服务器实现设备数据远程上传、下发,实现数据交互(不清楚OneNet物联网服务器功能的可以百度一下进入官网看简介)。之前的OneNet服务器不支持标准MQTT协议登录的,现在官网更新之后支持标准的MQTT协议,此设计使用STM32+ESP8266使用标准MQTT协议登录Onenet服务器,实现数据交互。实现步骤OneNet官方提供了很详细的文档,可以参考一下。
下图是单片机实物图,包括esp826,温湿度传感器,光照传感器,RGB灯,按键以及蜂鸣器。
基于stm32的物联网、智能家居控制系统_第1张图片


下图是onenet平台的监控界面
基于stm32的物联网、智能家居控制系统_第2张图片

三、代码修改

(1)数据上传部分代码:
这部分代码就是将我们的数据上传的ONENET云平台,
这里的数据流有:temperatureValue、humidityValue、lamp、key,这里的名字要和onenet平台上的名字相同
需要上传的数据:温度,湿度,光照度,灯的开关值
如果想要上传新的数据流,就复制memset、 sprintf、strcat三个函数的代码,写上你的数据流名称和需要上传的数据。

unsigned char OneNet_FillBuf(char *buf)
{
	char text[32];
	memset(text, 0, sizeof(text));
	strcpy(buf, ",;");
	
	memset(text, 0, sizeof(text));
	sprintf(text, "temperatureValue,%d;", temp);  //温度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "humidityValue,%d;", humi); //湿度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "lamp,%d;", Light);    //光照度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "key,%d;", key_velue);   //红灯开关
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "key1,%d;", key1_velue);  //蓝灯开关 
	strcat(buf, text);
	
	return strlen(buf);
}

(2)命令下发部分代码:
主要看后面的if-esle if代码,关键是看你元件属性里的EDP命令内容。这里就在if语句里面对LED灯进行了远程控制。如果想要下发新的命令,可以再写一个else if语句。

	dataPtr = strchr(req_payload, ':');					//搜索':'
	if(dataPtr != NULL && result != -1)					//如果找到了
	{
		dataPtr++;
		while(*dataPtr >= '0' && *dataPtr <= '9')		//判断是否是下发的命令控制数据
		{
			numBuf[num++] = *dataPtr++;
		}
		num = atoi((const char *)numBuf);			 //转为数值形式
		if(strstr((char *)req_payload, "open"))		 //搜索"key"
		{
//			printf("open = %d\r\n", num);            //num就是key:{V}中V的值
			key_velue = num;                		 //更新数据到云平台
			PAout(5) =! num;                 	     //控制LED灯,低电平点亮
		}
		else if(strstr((char *)req_payload, "led1"))
		{
			key1_velue = num;                		 //更新数据到云平台
			PAout(6) =! num;                 			 //控制LED灯,低电平点亮
		}	
	}

(3)连接onenet需要修改的代码

#define ESP8266_WIFI_INFO		"AT+CWJAP=\"smarthome\",\"12345678\"\r\n"   //wifi名称及,密码
#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"   //onenet ip地址

下面是你在onenet创建时候的设备ID等

#define PROID		"451066"
#define AUTH_INFO	"1234"
#define DEVID		"757218324"

基于stm32的物联网、智能家居控制系统_第3张图片
主函数

int main(void)
{
	unsigned short timeCount = 0;	//发送间隔变量
	unsigned char *dataPtr = NULL;
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	EXTIX_Init();
	Usart1_Init(9600);
	Usart2_Init(115200); //8266通信串口
	LED_Init();
	KEY_Init();
	BEEP_Init();	
	DHT11_Init();
	Init_BH1750();
	OLED_Init();
	OLED_ColorTurn(0);		//0正常显示,1 反色显示
    OLED_DisplayTurn(0);	//0正常显示 1 屏幕翻转显示
	OLED_Clear();
	TIM2_Int_Init(4999,7199);
	TIM3_Int_Init(2499,7199);

	UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
	
	ESP8266_Init();
	while(OneNet_DevLink())			//接入OneNET
		delay_ms(500);

	OneNet_Subscribe(decPubTopic, 1);   //订阅主题
	while(1)
	{
		if(timeCount % 40 == 0)
		{
			sensor_read_data();
//			if(alar_is_free == 10)
//			{
//				if((temp  > 40 )&&(humi > 100 )&&( Light >500))PAout(5) = 1;
//				else PAout(5) = 0;
//			}
//			if(alar_is_free < 10)alar_is_free++;
		}
	
		if(++timeCount >= 200)
		{
			UsartPrintf(USART_DEBUG, "OneNet_Publish\r\n");
			sprintf(PUB_BUF,"{\"temperature\":%d,\"humidity\":%d,\"lamp\":%d}",temp,humi,Light);
			OneNet_Publish("devSubTopic", PUB_BUF);
			UsartPrintf(USART_DEBUG, "OneNet_SendData\r\n");

			OneNet_SendData();				//发送数据至onenet平台
			
			timeCount = 0;
			ESP8266_Clear();   //清空缓存
		}
		
		dataPtr = ESP8266_GetIPD(3);
		if(dataPtr != NULL)
			OneNet_RevPro(dataPtr);
		delay_ms(10);
	} 
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了stm32连接onenet的使用

你可能感兴趣的:(stm32,单片机)