使用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灯,按键以及蜂鸣器。
(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()) //接入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的使用