文章目录
本篇文章主要介绍stm32单片机如何利用esp8266向ONENET平台发送数据。个人能力有限,如果哪里有错误,还望各位大佬评批指正!!!
上图为esp826601s的硬件原理图。GND接地;VCC接3.3V!!!(这里特别关键,不要错接成5V,否则会出错);CH-PD接3.3V;TX和RX分别接TX和RX;
1.1 注册账号
我们首先需要用手机号注册一个账号,操作非常简单。
2.2 创建一个产品
点击控制台;
选择切换成旧版;
选择多协议接入;
点击添加产品后,会弹出参数设置。这里的参数随便设置,不会影响后面操作。
确定之后,会生成一个产品,如下所示,这里的产品id需要家人们记住
之后我们点进去产品,点击设备列表添加设备,输入设备属性,特别注意这里的鉴权信息需要大家记住。
添加设备成功后,我们还需要记住设备id 。
上述就对ONENET的基础操作完成了,我们需要记住产品id、设备id、鉴权信息。
因为onenet官方有例程所以我们直接移植(白嫖)就行了.
2.1下载例程
首先我们需要进入首页的论坛、社区下载开发板资料,这里我们下载裸机的就可以了。
2.2改写程序
首先我们用keil5先打开第8个例程(这里我们打开第八个是因为这里面有很多不同协议的例程,博主用的是MQTT协议)
打开之后我们需要对下面三个文件进行修改
我们首先打开onenet.c文件,对上面的三个宏定义进行修改分别是产品id、鉴权信息、设备id。
然后点开esp8266.c文件修改两个宏定义
1.我们需要修改成我们自己的热点名和密码(因为esp8266模块是需要借助手机热点或者路由器连接onenet的);
2.如果是用的MQTT旧版,我们就不需要修改。如果是别的需要修改ip地址和端口号;
此外我们还需要对esp8266.c为文件中的unsigned char *ESP8266_GetIPD(unsigned short timeOut)函数和ESP8266_Init()函数进行修改,这里是经验之谈,如果是0的话会接受不到数据。
ESP8266_GetIPD() 函数
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{
char *ptrIPD = NULL;
do
{
if(ESP8266_WaitRecive() == REV_OK)
{
ptrIPD = strstr((char *)esp8266_buf, "IPD,");
if(ptrIPD == NULL)
{
//UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
}
else
{
ptrIPD = strchr(ptrIPD, ':');
if(ptrIPD != NULL)
{
ptrIPD++;
return (unsigned char *)(ptrIPD);
}
else
return NULL;
}
}
DelayXms(5);
timeOut--;
} while(timeOut>0);
return NULL;
}
ESP8266_Init()函数
void ESP8266_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
//ESP8266¸´Î»Òý½Å
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initure.GPIO_Pin = GPIO_Pin_14;
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Initure);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
delay_ms(250);
GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
delay_ms(500);
ESP8266_Clear();
UsartPrintf(USART_DEBUG, "\r\n0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "\r\n1. RST\r\n");
ESP8266_SendCmd("AT+RST\r\n", " ");
delay_ms(500);
ESP8266_SendCmd("AT+CIPCLOSE\r\n", " ");
delay_ms(500);
UsartPrintf(USART_DEBUG, "\r\n2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "\r\n3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "5. CIPSTART\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "6. ESP8266 Init OK\r\n");
}
主函数中的
dataPtr = ESP8266_GetIPD(0);
需要改成
dataPtr = ESP8266_GetIPD(3);
最后我们只需要在主函数中调用OneNet_SendData(void)函数就行了。不过我们需要注意的是这里由于我们用的是上传温度的例程,如果需要上传别的数据,需要对OneNet_SendData()函数中的参数进行修改。
特别说明:上面的onenet的操作步骤只是基础,如果想更好的展示数据还需创建数据流模板(模板名字应与发送数据函数里面的定义相对应)。
本人在学习esp8266的时候几乎没人指点,所以走了很多弯路,过程虽然艰辛(到处观看教学视频),但庆幸自己一步一个脚印走下来了。希望这篇文章能够给初学者学习的时候贡献一份绵薄之力。同时如果这篇文章如果有不合适的地方(个人能力有限),希望各位大佬批评指正。