赞
踩
功能介绍:
使用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
最后:
需要代码的可以自行下载。代码下载链接
下载操作:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。