C51接入OneNET-实现数据上传和命令下发

功能介绍:
使用51单片机将温度数据上传到OneNET云平台,同时可以实现远程控制LED灯的功能。

前提准备:
1、有OneNET的账号
2、刷入 OneNET 提供的 ESP8266 固件参考文章
需要下载的固件位置:
在这里插入图片描述
下载注意:
在这里插入图片描述
硬件准备:
1、C51单片机
2、WIFI模块esp8266-01s或者esp8266-01
3、USB转串口模块,用于烧录固件

模块接线:
ESP8266-01S: TX–P30 RX–P31 VCC–3.3V GND–GND
ESP8266-01: TX–P30 RX–P31 VCC–3.3V GND–GND EN–3.3V
DS18B20: IO–P37
在下载程序前,应该先断开WIFI模块的接线,不然程序烧写不了。
演示图片:
1、实物图
我用的是esp8266-01,所以EN引脚要接3.3V
在这里插入图片描述
2、设备在线状态
在这里插入图片描述
3、上传的温度数据
在这里插入图片描述

4、下发命令
在设备列表中的详情/数据流/更多可以找到下发命令
发送字符串LED0打开P2_0引脚处的LED灯,发送LED1关闭LED灯
在这里插入图片描述
在这里插入图片描述

代码实现:
/**************************************************************************************
接线:
ESP826601S: TX–P30 RX–P31 VCC–3.3V GND–GND
DS18B20: IO–P37
需要烧写 OneNET 提供的 ESP8266 固件
***************************************************************************************/
#include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器
#include “usart.h”
#include “delay.h”
#include “stdio.h”
#include “18b20.h”

sbit led=P2^0; //将单片机的P0.0端口定义为led
unsigned char xdata dataBuf[36]= {0};//定义显示区域临时存储数组

//定义两全局变量,在串口接收中断改变其值
char WIFI_OK = 0;
char OneNET_OK = 0;

void main()
{
int temp1;
float temperature;
Init_DS18B20();

//UART_init();//串口初始化
set52_baudrate(11.0592, 115200);//串口初始化
DelayMs(1000);

UART_SendStr("AT+CWJAP=XIAOCHUN02,3118003167\r\n",32); //手动连接WiFi,参数分别代表热点名称、密码
while(WIFI_OK != 1);  //当连上WIFI后WIFI_OK==1

UART_SendStr("AT+IOTCFG=879125822,486413,0713\r\n",33);//配置登录信息,参数分别代表设备ID、产品ID、鉴权信息
while(OneNET_OK != 1);  //当登陆OneNET后OneNET_OK==1

UART_SendStr("AT+IOTSEND=0,data,100\r\n",23);	//发送数据流,参数分别代表数据是数值类型、数据流名、数据值
DelayMs(1000);

while(1)
{
	temp1=ReadTemperature();		 //读取温度
	temperature=(float)temp1*0.0625; //温度值转换
	
	sprintf(dataBuf,"AT+IOTSEND=0,data,%.1f\r\n",temperature);  //将温度数据放入dataBuf数组中
	
	UART_SendStr(dataBuf,36);	//发送数据流
	
	DelayMs(2000);
}		

}

串口中断服务函数,在此处接收下发的命令并控制LED灯
```c
static  char  uart_buf[32]={0};   //用于保存串口数据
static  unsigned char uart_cnt=0; //用于定位串口数据的位置
extern char WIFI_OK;              //判断WIFI是否连接
extern char OneNET_OK;            //判断OneNET是否登陆
void UART_SER (void) interrupt 4 	//串行中断服务程序
{
	if(RI)                        //判断是接收中断产生
	{
		RI=0;                      //标志位清零
		//接收串口数据
		uart_buf[uart_cnt] =SBUF;  
		uart_cnt++;

		
		//判断是否是下发的指令
		if(uart_buf[uart_cnt-4]=='L'&&uart_buf[uart_cnt-3]=='E'&&uart_buf[uart_cnt-2]=='D'&&uart_buf[uart_cnt-1] == '0')  
		{
			led = 0;       //开灯
			uart_cnt = 0;  //清零,重新计数
		}
		else if(uart_buf[uart_cnt-4]=='L'&&uart_buf[uart_cnt-3]=='E'&&uart_buf[uart_cnt-2]=='D'&&uart_buf[uart_cnt-1] == '1')  
		{
			led = 1;       //关灯
			uart_cnt = 0;
		}
		//添加其他命令
		
		
		
		//WIFI连接成功后会返回字符串:+Event:WIFI GOT IP
		else if(uart_buf[uart_cnt-4]=='T'&&uart_buf[uart_cnt-3]==' '&&uart_buf[uart_cnt-2]=='I'&&uart_buf[uart_cnt-1] == 'P')
		{
			WIFI_OK = 1;
			uart_cnt = 0;
		}
		//OneNET成功登陆后会返回字符串:+Event:Connect:0
		else if(uart_buf[uart_cnt-4]=='c'&&uart_buf[uart_cnt-3]=='t'&&uart_buf[uart_cnt-2]==':'&&uart_buf[uart_cnt-1] == '0')
		{
			OneNET_OK = 1;
			uart_cnt = 0;
		}
		
		if(uart_cnt>28)   //防止数组越界
		{
			uart_cnt = 0;
		}
	}
	if(TI)  //如果是发送标志位,清零
	TI=0;
} 

更新:
1、程序很简单,但也不够稳定,如果设备不能在线,可以尝试多复位几次。----2022-03-28
2、已经更新代码了,解决了需要复位好几次,靠运气接上OneNET的BUG。----2022-04-10

最后:
需要代码的可以自行下载。代码下载链接
下载操作:
在这里插入图片描述

  • 7
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值