900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 基于stm32的物联网 智能家居控制系统

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

时间:2022-11-11 10:24:15

相关推荐

基于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灯,按键以及蜂鸣器。

下图是onenet平台的监控界面

三、代码修改

(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"

主函数

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())//接入OneNETdelay_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的使用

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。