前言
该教程适用于新版本的OneNET物联网开放平台,并帮助找到MasteKey实现51单片机与ESP8266通过串口通信发数据至OneNET平台,并帮助找到多协议接入入口,以及可视化教程后文附带代码。你是否出现了AT指令无回应,或者HTTP请求错误(400 Bad Request)等问题,这一篇文章带你解决所有问题,胎教式教程(需要掌握一些串口通信的知识)
代码和文章用到的文件下载
下载方式在该文章的最上方点击及免费下载(可能免费下载需要做一些官方的东西,微信视频号顶置的视频数为 :0)
文件内容包含该文章所有用到的东西
内容包含
- 注册OneNET账号
- 创建一个属于你自己的关于HTTP的产品
- 用TTL转接口连接ESP8266,调试并发送数据
- 用ESP8266连接单片机发送数据到OneNET平台
- 创建可视化项目(让你的数据可视化)
1.注册OneNet
官网 :https://open.iot.10086.cn/
2.创建产品(内容包含:多协议接入,MasteKey)
登录成功后进入到该页面
点击进入开发者中心
进入后点击右上角有一个“费用中心”
进去后,第一步先点击左上角类似齿轮的东西
第二步点击多协议接入
进入后点击上方有个HTTP,之后点击添加产品,产品名称根据你自己的需求来定,用WIFI
添加之后,这个页面包含你设备的MasteKey,你可以拿记事本记下来,以免每次都需要验证码查看
点击左边的列表
添加产品,根据自己的需求来创建
最后创建结束,这样就创建成功了,设备id也有了
3.调试ESP8266
直接将ESP8266与USB转TTL模块插在电脑上即可(没有转接模块的话可以网上购买一个)
3.1.ESP8266固件烧录(根据实际情况执行)
ESP8266默认波特率为115200,使用XCOM串口助手,选择对应的串口号COM10:USB-SERIAL CH340(不插单片机则剩下的那个就是ESP8266的串口),波特率改为115200
如果你选择好后,发送AT指令有回复OK,则不需要烧录固件,如果没有回复的话,看看选项是否选择正确,实在不行就烧录固件吧
有关文件都放在这个文章最上方,点击及下载
下面分别由AT固件和烧录软件,我们首先要找到AT固件文件夹中的一个8位 1024kb大小的bin文件
bin文件如下图第一个
找到后记住这个文件位置,或者将这个文件复制到桌面 再找到图中这个选中的应用程序,打开
打开后(这些文件需要解压),选中第一个
除了串口不一致,其他都一致
配置完成之后,点击下面的ERASE准备,然后点击START开始,如果下面有进度条,则等待进度条完成,如果没有则点击ESP8266的USB接口处有个复位,再来一遍(确保bin文件是1024kb的8位的文件),串口号也要与你的ESP8266一致
完成后及可以复位,ESP8266则烧录固件成功,可以进行下一步了
3.2.关于调试ESP8266的串口助手(XCOM)
在文章最上方下载文件 下载XCOM串口助手
3.3. 调试步骤
建议按照下列步骤,如果出错了(例如ERROR),可以发送AT-RST
(重置当前指令,从步骤一再开始),WIFI连接需要时间,等候一会即可
所有符号都是英文符号注意分辨
1.先在串口选择处选择你当前ESP8266的端口,然后ESP8266波特率默认为115200
2.先发送指令“AT”,看是否回复“OK”
3.发送下面的指令改波特率为9600:AT+UART=9600,8,1,0,0
看看是否回复ok,如果不是,则手打一遍,要英文输入法
4.发送 :AT+CWMODE=1
//如果不行则把后面的1改为3
5.打开手机热点 :让ESP8266连接WIFI(手机开热点要2.4G的)
6.连接WIFI :发送指令 :AT+CWJAP="ESP","123456789"
//前面是你手机的WIFI账号,后面是密码 连接成功会显示“WIFI CONNECTEDND GOT IP” 该功能可能会需要等待5~15秒左右如果连过一次后,WiFi设置没改变,则这一步可以跳过
7.和OneNet服务器建立连接 发送指令AT+CIPSTART="TCP","183.230.40.33",80
要回应连接成功才可进行下一步
8.透明传输模式AT+CIPMODE=1
9.传输数据AT+CIPSEND
每次指令成功后会发出“OK”,
最后一步很重要,这只是个发送“A”字符的测试
发送HTTP请求 同样在发送指令那里输入,直接粘贴过去 需要填入你自己的设备和Master-KeyAPI
POST /devices/你的设备ID/datapoints?type=3 HTTP/1.1
api-key:你的设备密钥
Host:api.heclouds.com
Connection:close
Content-Length:16
Content-Type: application/json
{"Data": "A"}
如果出现
>HTTP/1.1 400 Bad Request
Server: nginx
Date: Mon, 05 Jun 2023 13:44:12 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
这种情况 则说明你的HTTP请求格式出错了,那么再仔细看看哪里没复制好
你的密钥和设备ID在上文已经说明如何查看了
发送HTTP请求成功后会显示
最下面显示0错误,SUCC成功则代表发送成功
在OneNET
在多协议接入——>>设备列表——>>右边的数据流那里可以看到你发送的数据
有数据则发送成功,没有的话就再操作一遍
4.使用51单片机与ESP8266连接发送数据至OneNET
用4个杜邦线接线方式,如下图
51单片机 | ESP8266 |
---|---|
3.3V | 3V3 |
GND | GND |
P3^1(TXD) | RX |
P3^0(RXD) | TX |
连接好后,将代码(文章末尾有给出)烧录至单片机后,等待ESP8266WIFI连接成功后,复位单片机,打开XCOM的单片机串口即可发送数据了
如果串口数据一直显示AT,那么重新烧录文件或者关闭单片机再上电试一试 如果串口一直显示????,那么将代码最上方的unsigned char Usart_Receive[200]={0};
中数组大小调低
如果串口显示数据发送后,但服务器没接收到数据,则打开单片机,等ESP8266连上WIFI再复位单片机
成功发送了数据后
5.建立可视化项目
依然是OneNET平台上,下面将用图片进行讲解
1.找到数据可视化(进入开发者后中心的左上角)
2.进入后
3.点击编辑
4.添加东西
5.关联数据
添加数据源
**下面的Key是Master-Key**
最后记得可视化那里要选择数据源,例如:第一个表为Data1,选择你创建的数据源名字:Data1即可,最后点右上方的保存
6.发布项目,可以输入网址查看你的最终效果了
7.效果预览
文章用的代码如下
#include <REGX52.H>
#include <string.h>
#include <stdio.h>
unsigned char Usart_Receive[100]={0}; //串口传输数据的大小
unsigned char Usart_Cnt=0; //数据下标
bit Usart_AT_flage; //传输成功标识
unsigned char dat; //串口发送
void Delay(unsigned int xms) //1ms延时函数
{
unsigned char i ,j;
while(xms--)
{
i = 2;j = 239;
do
{
while(--j);
} while(--i);
}
}
void Init(void)//初始化串口
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
REN=1;
}
void Sent_ZF(unsigned char dat) //串口发送字符
{
ES = 0;
TI=0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void AT_Send_String(unsigned char *string) //串口发送字符串
{ while(*string)
{
Sent_ZF(*string++);
Delay(6);
}
}
void ESP8266_Init()//用串口向ESP8266发送命令
{
while(1)
{
AT_Send_String("AT\r\n"); //发送AT指令
Delay(4000); //延时6s,让ESP8266WIFI模块连上自己的WIFI
if(Usart_AT_flage ==1) //发送成功后退出
{
Usart_AT_flage = 0;
break;
}
}
Delay(1000);
while(1)
{
AT_Send_String("AT+CWMODE=1\r\n"); //设置为模式1
Delay(2000);
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
Delay(1000);
// while(1)
// {
// AT_Send_String("AT+CWJAP=\"ESP\",\"123456789\"\r\n"); //连接网络 ,输入自己的网络名的密码
// delay1s();
// delay1s();
// if(Usart_AT_flage ==1)
// {
// Usart_AT_flage = 0;
// break;
// }
// }
while(1)
{
AT_Send_String("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"); //连接OneNET域名和端口
Delay(3000);
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
Delay(1000);
while(1)
{
AT_Send_String("AT+CIPMODE=1\r\n"); //指令
Delay(3000);
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
Delay(1000);
while(1)
{
AT_Send_String("AT+CIPSEND\r\n"); //指令
Delay(3000);
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
Delay(1000);
}
void sendnumber() //发送HTTP请求
{
static int Data1 = 0,Data2 = 0;
char http_request[] = "POST /devices/1093849562/datapoints?type=3 HTTP/1.1\r\n"
"api-key:Zsi3=7w0CKL7NaEryTo7mZjO834=\r\n"
"Host:api.heclouds.com\r\n"
"Content-Length:150\r\n"
"Content-Type: application/json\r\n\r\n"
"{\"Data1\": 1 ,\"Data2\": 1 }";
sprintf(http_request,
"POST /devices/1093849562/datapoints?type=3 HTTP/1.1\r\n"
"api-key:Zsi3=7w0CKL7NaEryTo7mZjO834=\r\n"
"Host:api.heclouds.com\r\n"
"Content-Length:150\r\n"
"Content-Type: application/json\r\n\r\n"
"{\"Data1\": %d ,\"Data2\": %d }",
Data1,Data2);
Data1 += 1;
Data2 += 1;
// 在适当的位置调用这个函数
while(1)
{
AT_Send_String(http_request); //发送
Delay(3000);
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
}
void main()
{
Delay(3000);
Init(); //初始化
ESP8266_Init();
while(1)
{
sendnumber(); //执行
//Delay(1000);
}
}
void InterruptUART(void) interrupt 4 //串口中断
{
if(RI)
{
RI=0;
Usart_Receive[Usart_Cnt]=SBUF;
Delay(1);
Usart_Cnt++;
if(Usart_Receive[Usart_Cnt]=='\0')
{
Usart_Cnt=0;
Usart_AT_flage=1;
}
}
else
TI=0;
}
总结
这只是一个如何用单片机与ESP8266用串口的方式发送数据至云服务器的最基础教程,代码可以再根据你的实际需求更改
注:代码可能存在一些不规范的地方,欢迎指正!