找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5338|回复: 7
打印 上一主题 下一主题
收起左侧

巴法云+STC89C52单片机+ESP-01在线远程控制多个设备 源程序等资料

  [复制链接]
跳转到指定楼层
楼主
一直想试试远程控制设备,τ 宝成品还是小贵,之前买的ESP8266-01(IO口太少,而且机智云、腾讯云等感觉又太麻烦)
这几天接触到巴法云,感觉挺简单的,试了官方的示例(用的是MCU的ESP8266-12E+Arduino)但感觉浪费IO口
然后继续百度搜资料,找到了巴法云-简书,发现了这个ESP8266-01+STC89C52的示例(官方代码备注详细,简单易懂)
后经摸索修改成了能同时控制二个设备的代码,能用控制台控制,也能用天猫精灵控制(APP控制还没有时间测试)

还需低成本远程控制多个设备的,可以添加NRF24L01当主机, 从机用NRF24L01+单片机实现




以下是巴法云的控制台,我添加了二个设备,跟代码里的一致



以下是附件内容,大家按顺序操作即可,工具和引脚接线统统有图有说明

  1. /*********************************************************************
  2. 题目:STC89C51/52+ESP8266-01/01S实现在线远程控制多个设备
  3. 代码:以下为利用巴法云2个订阅主题分别控制2个IO口的代码(方便新手理解及扩展)
  4. 注意:晶振一定是11.0592MHz。
  5. 关于UID:在巴法云注册登陆,即可看到自己UID,推送微信消息,需要手机绑定微信,bemfa.com在控制台进行绑定即可。
  6. 注意:新买的ESP8266-01默认是115200波特率,需要利用串口调试助手更改esp8266波特率为9600
  7.                         更改方法:USB转串口板连接到ESP8266,波特率115200,发送  AT+UART=9600,8,1,0,0   //末尾有回车换行
  8.                          USB转串口板接线方法:tx--rx ,rx--tx,gnd-gnd,3.3v--3.3v,EN--3.3v //esp8266--USB转串口板
  9. 官方文档见官网:www点cloud.bemfa点com/docs/#/?id=_51-tcp%e5%88%9b%e5%ae%a2%e4%ba%91
  10. 注册、登陆页面:cloud.bemfa点com/u_login.php

  11. STC89C51/52与ESP8266-01/01S的接线方式(注意-需要先将本程序烧录到单片机后断电,接上ESP8226-01/01S,然后上电):
  12. STC89C51/52           ESP8266-01
  13.     P30----------------TX
  14.     P31----------------RX

  15. 以下代码只有几处需要根据你的实际情况修改, 已注明"需要修改此部分", 其它地方不需要修改
  16. ********************************************************************/
  17. #include <reg52.h>  
  18. #include <stdio.h>
  19. #include <string.h> //包含头文件
  20. #define uint unsigned int
  21. #define uchar unsigned char


  22. //************ 需要修改以下部分 ************
  23. #define Ssid  "wifi名称"                                        //WIFI名称,,修改为自己路由器的WIFI名称,好像不支持中文
  24. #define PassWord  "wifi密码"        //WIFI密码,修改为自己路由器的
  25. #define Uid  "密钥"                //巴法云UID密钥,控制台获取

  26. #define TopicLed1  "LedA002" //巴法云控制台创建,名称自定义,app订阅主题要和这个推送主题一致(如需控制多个主题,只要填其中一个即可)
  27. #define TopicLed2  "LedB002" //巴法云控制台创建,名称自定义,app订阅主题要和这个推送主题一致(如需控制多个主题,只要填其中一个即可)
  28. sbit LED1 = P2^0; //灯1, 对应订阅主题LedA002
  29. sbit LED2 = P2^1; //灯2, 对应订阅主题LedB002
  30. //************ 需要修改以上部分 ************



  31. /*****************相关变量**************/
  32. uchar Receive;  //接收到的字节
  33. uchar i,i2,count; //定时器所用变量
  34. uint n;                                         //接收到字节的个数
  35. uchar flag=0; //标志位,检查是否有数据通过串口发到MCU
  36. uchar connected = 0;  //标志位,检查是否已连接服务器
  37. uchar Recive_table[100]; //用于接收wifi模块反馈到MCU上的数据

  38. /*******************************************************************
  39. 名称:延时函数
  40. 作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......
  41. ********************************************************************/
  42. void ms_delay(uint t)
  43. {
  44.       uint i,j;
  45.       for(i=t;i>0;i--)
  46.        for(j=110;j>0;j--);
  47. }

  48. void us_delay(uchar t)
  49. {
  50.       while(t--);
  51. }



  52. /********************************************************************
  53. 名称:波特率发生器函数
  54. 作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器,
  55. 各自不同的载入值计算式,具体根据寄存器相关设置来参考计算,以实现
  56. 异步串行通讯。(经测试,两种设置方式均可用,可任选一种。)
  57. ********************************************************************/
  58. void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
  59. {
  60.         SCON=0x50;     //设置为串行口以方式1工作,8位异步通讯,允许接收中断。
  61.         //一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。
  62.         PCON=0x80;     //SMOD波特率选择位为1,SMOD=1.
  63.         TMOD=0x21;    //设置定时器1为波特率发生器,工作在模式2,8位自动装载
  64.         TH1=0xFA ;//波特率9600 ,TH1=256-FOSC/16/12/波特率
  65.         TL1=TH1;
  66.         EA=1;                            //总中断打开
  67.         ES=0;                             //关闭串口中断
  68.         TR1=1;                     //启动定时器1

  69.         TH0=0xD8;                  //定时10ms
  70.         TL0=0xF0;
  71.         ET0=1;
  72.         TR0=1;
  73. }




  74. /********************************************************************
  75. 名称:串口发送函数
  76. 功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266)
  77. ********************************************************************/
  78. void Send_Uart(uchar value)
  79. {
  80.       ES=0;         //关闭串口中断
  81.       TI=0;         //清发送完毕中断请求标志位
  82.       SBUF=value;     //发送
  83.       while(TI==0);    //等待发送完毕
  84.       TI=0;         //清发送完毕中断请求标志位
  85.       ES=1;         //允许串口中断
  86. }
  87. /********************************************************************
  88. 名称:串口发送数据
  89. 作用: 通过串口发送指令到WIFI模块,以便可以实现无线接入和控制,带回车换行
  90. ********************************************************************/
  91. void SerialSend(uchar *puf) // 数组指针*puf指向字符串数组               
  92. {

  93.       while(*puf!='\0')    //遇到空格跳出循环
  94.       {
  95.            Send_Uart(*puf);  //向WIFI模块发送控制指令。
  96.            us_delay(5);
  97.            puf++;      
  98.       }
  99.       us_delay(5);
  100.       Send_Uart('\r');//回车
  101.       us_delay(5);
  102.       Send_Uart('\n');   //换行
  103. }   

  104. /********************************************************************
  105. 名称:串口发送数据
  106. 作用: 通过串口发送指令到WIFI模块,不带回车换行
  107. ********************************************************************/
  108. void SerialSend_byte(uchar *puf) // 数组指针*puf指向字符串数组               
  109. {

  110.       while(*puf!='\0')    //遇到空格跳出循环
  111.       {
  112.            Send_Uart(*puf);  //向WIFI模块发送控制指令。
  113.            us_delay(5);
  114.            puf++;      
  115.       }
  116. }   


  117. /********************************************************************
  118. 名称:心跳函数
  119. 作用:发送心跳。如果一分钟不发送心跳,服务器就会认为设备掉线,故建议30s发送一次心跳
  120. 在中断1中调用,和发送数据函数,留一个就行,发送数据也相当于心跳
  121. ********************************************************************/
  122. void Ping(void)
  123. {        
  124.   SerialSend("cmd=0&msg=ping"); //发送心跳
  125. }

  126. void connect_topic(uchar x){
  127.         //发送订阅指令,原格式为:cmd=1&uid=***UID***&topic=***Topic***
  128.         SerialSend_byte("cmd=1&uid=");
  129.         SerialSend_byte(Uid);
  130.         SerialSend_byte("&topic=");
  131.         
  132.         //************ 需要修改以下部分 ************
  133.         if(x==1){
  134.                 SerialSend_byte(TopicLed1);
  135.         } else if(x==2){
  136.                 SerialSend_byte(TopicLed2);
  137.         }
  138.         //************ 需要修改以上部分 ************
  139.         
  140.         us_delay(5);
  141.         Send_Uart('\r');//回车
  142.         us_delay(5);
  143.         Send_Uart('\n');   //换行
  144. }

  145. void connect_bemfa(void){
  146.         connected = 1;
  147.         SerialSend("AT+CIPMODE=1"); //开启透明传输模式
  148.         ms_delay(1000);
  149.         SerialSend("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344");  // 连接服务器和端口
  150.         ms_delay(1000);
  151.         SerialSend("AT+CIPSEND"); //进入透传模式,下面发的都会无条件传输
  152.         ms_delay(1000);
  153.         
  154.         //************ 需要修改以下部分 ************
  155.         connect_topic(1); //连接第1个订阅主题
  156.         ms_delay(1000);
  157.         connect_topic(2); //连接第2个订阅主题
  158.         ms_delay(1000);
  159.         //************ 需要修改以上部分 ************
  160.                
  161.         connected = 1; //表示连接成功,可以发送数据了
  162. }


  163. /********************************************************************
  164. 名称:主函数
  165. 作用:程序的执行入口
  166. ********************************************************************/
  167. void main()
  168. {   
  169.                 memset(Recive_table,'\0',sizeof Recive_table);//重置数组
  170.                 Uart_Init();//使用独立的波特率发生器


  171.                 ms_delay(1000);
  172.                 SerialSend("AT+RST");     //重新启动wifi模块
  173.                 ms_delay(1000);
  174.                 SerialSend("AT");     //重新启动wifi模块
  175.                 ms_delay(1000);
  176.                 SerialSend("AT+CWMODE=3"); //设置路由器模式 1 station模式 2 AP路由器模式 3 station+AP混合模式
  177.                 ms_delay(1000);
  178.                 SerialSend("AT+CWJAP=\""Ssid"\",\""PassWord"\"");//设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
  179.                 ms_delay(8000);
  180.                 connect_bemfa(); //连接巴法云服务器

  181.                 while(1)
  182.                 {
  183.                                 if(flag == 1){                                       
  184.                                         //************ 需要修改以下部分 ************
  185.                                         //实际收到到指令:cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002&msg=on
  186.                                         //字符串匹配,当检测到字符串msg=on时,执行开灯
  187.                                         //如果有多个主题,可以加上主题名字以区分不同设备控制命令,如: if(strstr(Recive_table,"light002&msg=on"))
  188.                                         if(strstr(Recive_table,"LedA002&msg=on")){ //当检测到字符串msg=on时,执行开灯
  189.                                                         LED1=0; //引脚置高电平
  190.                                         } else if(strstr(Recive_table,"LedA002&msg=off")){ //当检测到字符串msg=off时,执行关灯
  191.                                                         LED1=1; //引脚置低电平
  192.                                         } else if(strstr(Recive_table,"LedB002&msg=on")){
  193.                                                         LED2=0;
  194.                                         } else if(strstr(Recive_table,"LedB002&msg=off")){
  195.                                                         LED2=1;
  196.                                         }
  197.                                         //************ 需要修改以上部分 ************

  198.                                         else if(strstr(Recive_table,"ERROR")){ //如果掉线或网络故障,重新连接
  199.                                                         connect_bemfa(); //连接巴法云服务器
  200.                                         }
  201.                                         memset(Recive_table,'\0',sizeof Recive_table);//重置数组
  202.                                         flag=0;
  203.                                 }
  204.                 }         
  205. }

  206. /********************************************************************************
  207. 名称:串行通讯中断
  208. 作用:发送或接收结束后进入该函数,对相应的标志位清零, 实现模块对数据正常的收发

  209. *********************************************************************************/

  210. void Uart_Interrupt() interrupt 4        
  211. {
  212.                 if(RI==1)
  213.                 {
  214.                                  RI=0;
  215.                                  Receive=SBUF;        //MCU接收wifi模块反馈回来的数据
  216.                                  Recive_table[i]=Receive;      
  217.                                  i++;         
  218.                                  if((Receive =='\n')){
  219.                                                 i=0;
  220.                                                 flag = 1;
  221.                                 }
  222.                 }
  223.                 else TI=0;
  224. }

  225. //定时发送心跳,或发送传感器数据
  226. //心跳建议30s发一次,一分钟不发数据,服务器会认为设备掉线
  227. void timer0isr(void) interrupt 1  
  228. {
  229.                 TH0=0xD8;
  230.                 TL0=0xF0;
  231.                 i2++;
  232.                 if(i2==100)
  233.                 {
  234.                                 i2=0;
  235.                                 count++;
  236.                                 if(count>=40) //40秒,可自行修改
  237.                                 {
  238.                                         if(connected == 1){
  239.                                                                 Ping();   //发送心跳
  240.                                         }

  241.                                         count=0;
  242.                                 }               
  243.                 }        
  244. }
复制代码

附件在2楼

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:424598 发表于 2020-11-2 23:57 | 只看该作者
附件在二楼

巴法云ESP8266-01.zip

12.27 MB, 下载次数: 136, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:782563 发表于 2021-2-2 13:01 | 只看该作者
想请问一下电路如何连接
回复

使用道具 举报

地板
ID:134870 发表于 2021-3-26 22:38 | 只看该作者
51黑有你更精彩
回复

使用道具 举报

5#
ID:857072 发表于 2021-4-4 21:10 | 只看该作者

51黑有你更精彩记号
回复

使用道具 举报

6#
ID:83626 发表于 2021-10-4 20:15 | 只看该作者
下载来玩一下,正好手里有配件。
回复

使用道具 举报

7#
ID:518395 发表于 2022-3-30 21:10 | 只看该作者
最近在学着用巴法云,谢谢楼主!
回复

使用道具 举报

8#
ID:901516 发表于 2022-4-17 16:51 | 只看该作者
楼主知道如何用51发数据去巴法云平台吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表