文章目录
前言一、环境介绍二、功能说明三、代码修改总结前言
使用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的使用