51单片机与ESP8266连接新版本OneNET并上云,多协议接入和MasteKey,可视化

前言

该教程适用于新版本的OneNET物联网开放平台,并帮助找到MasteKey实现51单片机与ESP8266通过串口通信发数据至OneNET平台,并帮助找到多协议接入入口,以及可视化教程后文附带代码。你是否出现了AT指令无回应,或者HTTP请求错误(400 Bad Request)等问题,这一篇文章带你解决所有问题,胎教式教程(需要掌握一些串口通信的知识)

代码和文章用到的文件下载

下载方式在该文章的最上方点击及免费下载(可能免费下载需要做一些官方的东西,微信视频号顶置的视频数为 :0)
文件内容包含该文章所有用到的东西

内容包含

  1. 注册OneNET账号
  2. 创建一个属于你自己的关于HTTP的产品
  3. 用TTL转接口连接ESP8266,调试并发送数据
  4. 用ESP8266连接单片机发送数据到OneNET平台
  5. 创建可视化项目(让你的数据可视化)

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.3V3V3
GNDGND
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用串口的方式发送数据至云服务器的最基础教程,代码可以再根据你的实际需求更改
注:代码可能存在一些不规范的地方,欢迎指正!

评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

送外卖的CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值