概述
基于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模块与单片机的硬件连接
模块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.1rn");
strcat(pkt, "api-key:");
strcat(pkt, key);
strcat(pkt, "rn");
strcat(pkt, "Host:api.heclouds.comrn");
strcat(pkt, "Connection:closern"); //上传一次就关闭连接
strcat(pkt, "Content-Length:");
strcat(pkt, lenBuf);
strcat(pkt, "rnrn");
strcat(pkt, dataBuf);
strcat(pkt, "rn");
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<USART2_MAX_RECV_LEN) //还可以接收数据
{
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:rn%srn”, HTTP_Buf);
printf(“完成一次传输nn”);
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平台基于STM32+ESP8266,将获取数据上传至one net平台的全部内容,希望文章能够帮你解决基于STM32+ESP8266,将获取数据上传至one net平台基于STM32+ESP8266,将获取数据上传至one net平台所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复