当前位置:   article > 正文

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

51温度上传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);
}		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

}

串口中断服务函数,在此处接收下发的命令并控制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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/115728
推荐阅读