基于STM32+ESP8266,将获取数据上传至one net平台

基于STM32+ESP8266,将获取数据上传至one net平台

本文基于正点原子STM32F1战舰版,以及正点原子ESP8266

需要用到的硬件:
开发板,WiFi模块,USB转TTL模块

需要用到的编程软件及调试软件:
keil5,XCOM串口调试助手

1、AT指令配置WiFi模块

测试WiFi模块: AT 返回ok
配置为AP+Station模式: AT+CWMODE=3
重启模块:AT+RST
设置连接模式,0代表单一连接,1代表多连接: AT+CIFSR
连接到WiFi路由器: AT+CWJAP=“热点名称”,“热点密码”
建立远程TCP连接远程: AT+CIPSTART=“TCP”,“183.230.40.33”,80
设置为透传模式:AT+CIPMODE=1
进入透传: AT+CIPSEND

2、ESP8266模块与单片机的硬件连接基于STM32+ESP8266,将获取数据上传至one net平台_第1张图片

模块RXD——单片机TXD
模块TXD——单片机RXD
模块VCC——单片机3.3V
模块GND——单片机GND

3、STM32WiFi初始化

(1)one net平台注册自己的产品获取自己产品对应的设备ID以及API key

#define API_KEY “产品API KEY”
#define DEV_ID “设备ID号”

(2)http协议post数据格式

可以参考这篇博文
https://blog.csdn.net/Kurozaki_Kun/article/details/78646960

以下为我的代码

uint32_t HTTP_PostPkt(char *pkt, char *key, char *devid, char *dsid, char *val,char *k1,char *k2,char *k3,char *k4) //,char *k5,char *k6,char *k7,char *k8
{
char dataBuf[100] = {0};
char lenBuf[10] = {0};
*pkt = 0;

sprintf(dataBuf, "{%s:%s,%s:%s,%s:%s}", dsid, val,k1,k2,k3,k4);    //数据有多少就加多少对  ,k5,k6,k7,k8  ,%s:%s,%s:%s
sprintf(lenBuf, "%d", strlen(dataBuf));

strcat(pkt, "POST /devices/");
strcat(pkt, devid);
strcat(pkt, "/datapoints?type=3 HTTP/1.1\r\n");

strcat(pkt, "api-key:");
strcat(pkt, key);
strcat(pkt, "\r\n");

strcat(pkt, "Host:api.heclouds.com\r\n");
strcat(pkt, "Connection:close\r\n");  //上传一次就关闭连接
strcat(pkt, "Content-Length:");
strcat(pkt, lenBuf);
strcat(pkt, "\r\n\r\n");

strcat(pkt, dataBuf);
strcat(pkt, "\r\n");
	
return strlen(pkt);

}

(2)数据获取

本文需要上传至one net平台的数据有大气温度,大气湿度,以及土壤湿度

sprintf(temp1, “%.2f”,(float)Bme.Temp/100);
sprintf(temp3, “%.2f”,(float)Bme.Hum/100);
sprintf(temp7, “%.2f”,(float)Num);

(3)利用串口2将post数据发送到one net平台

串口2中断服务函数

void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);
if(USART2_RX_STA {
TIM_SetCounter(TIM2,0);//计数器清空
if(USART2_RX_STA==0)
TIM2_Set(1); //使能定时器2的中断
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}

void OneNET_transfer(void)
{
USART2_Clear();
len = HTTP_PostPkt(HTTP_Buf, API_KEY, DEV_ID, ““Temp””, temp1,"“Hum”",temp3,"“Num”",temp7);
USART2_Write(USART2, (unsigned char *)(HTTP_Buf), len);
printf(“send HTTP msg:\r\n%s\r\n”, HTTP_Buf);
printf(“完成一次传输\n\n”);
delay_ms(1500);
}

(4)main函数

void main()
{
init_all();//本代码的所有初始化
while(1)
{
sprintf(temp1, “%.2f”,(float)Bme.Temp/100);
sprintf(temp3, “%.2f”,(float)Bme.Hum/100);
sprintf(temp7, “%.2f”,(float)Num);
OneNET_transfer();
}
}

你可能感兴趣的:(基于STM32+ESP8266,将获取数据上传至one net平台)