找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7540|回復(fù): 7
收起左側(cè)

巴法云+STC89C52單片機(jī)+ESP-01在線遠(yuǎn)程控制多個(gè)設(shè)備 源程序等資料

  [復(fù)制鏈接]
ID:424598 發(fā)表于 2020-11-2 23:48 | 顯示全部樓層 |閱讀模式
一直想試試遠(yuǎn)程控制設(shè)備,τ 寶成品還是小貴,之前買(mǎi)的ESP8266-01(IO口太少,而且機(jī)智云、騰訊云等感覺(jué)又太麻煩)
這幾天接觸到巴法云,感覺(jué)挺簡(jiǎn)單的,試了官方的示例(用的是MCU的ESP8266-12E+Arduino)但感覺(jué)浪費(fèi)IO口
然后繼續(xù)百度搜資料,找到了巴法云-簡(jiǎn)書(shū),發(fā)現(xiàn)了這個(gè)ESP8266-01+STC89C52的示例(官方代碼備注詳細(xì),簡(jiǎn)單易懂)
后經(jīng)摸索修改成了能同時(shí)控制二個(gè)設(shè)備的代碼,能用控制臺(tái)控制,也能用天貓精靈控制(APP控制還沒(méi)有時(shí)間測(cè)試)

還需低成本遠(yuǎn)程控制多個(gè)設(shè)備的,可以添加NRF24L01當(dāng)主機(jī), 從機(jī)用NRF24L01+單片機(jī)實(shí)現(xiàn)

IMG_20201102_210654.jpg


以下是巴法云的控制臺(tái),我添加了二個(gè)設(shè)備,跟代碼里的一致
巴法云控制臺(tái)示例.png


以下是附件內(nèi)容,大家按順序操作即可,工具和引腳接線統(tǒng)統(tǒng)有圖有說(shuō)明
2345截圖20201102233307.png
  1. /*********************************************************************
  2. 題目:STC89C51/52+ESP8266-01/01S實(shí)現(xiàn)在線遠(yuǎn)程控制多個(gè)設(shè)備
  3. 代碼:以下為利用巴法云2個(gè)訂閱主題分別控制2個(gè)IO口的代碼(方便新手理解及擴(kuò)展)
  4. 注意:晶振一定是11.0592MHz。
  5. 關(guān)于UID:在巴法云注冊(cè)登陸,即可看到自己UID,推送微信消息,需要手機(jī)綁定微信,bemfa.com在控制臺(tái)進(jìn)行綁定即可。
  6. 注意:新買(mǎi)的ESP8266-01默認(rèn)是115200波特率,需要利用串口調(diào)試助手更改esp8266波特率為9600
  7.                         更改方法:USB轉(zhuǎn)串口板連接到ESP8266,波特率115200,發(fā)送  AT+UART=9600,8,1,0,0   //末尾有回車(chē)換行
  8.                          USB轉(zhuǎn)串口板接線方法:tx--rx ,rx--tx,gnd-gnd,3.3v--3.3v,EN--3.3v //esp8266--USB轉(zhuǎn)串口板
  9. 官方文檔見(jiàn)官網(wǎng):www點(diǎn)cloud.bemfa點(diǎn)com/docs/#/?id=_51-tcp%e5%88%9b%e5%ae%a2%e4%ba%91
  10. 注冊(cè)、登陸頁(yè)面:cloud.bemfa點(diǎn)com/u_login.php

  11. STC89C51/52與ESP8266-01/01S的接線方式(注意-需要先將本程序燒錄到單片機(jī)后斷電,接上ESP8226-01/01S,然后上電):
  12. STC89C51/52           ESP8266-01
  13.     P30----------------TX
  14.     P31----------------RX

  15. 以下代碼只有幾處需要根據(jù)你的實(shí)際情況修改, 已注明"需要修改此部分", 其它地方不需要修改
  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名稱(chēng)"                                        //WIFI名稱(chēng),,修改為自己路由器的WIFI名稱(chēng),好像不支持中文
  24. #define PassWord  "wifi密碼"        //WIFI密碼,修改為自己路由器的
  25. #define Uid  "密鑰"                //巴法云UID密鑰,控制臺(tái)獲取

  26. #define TopicLed1  "LedA002" //巴法云控制臺(tái)創(chuàng)建,名稱(chēng)自定義,app訂閱主題要和這個(gè)推送主題一致(如需控制多個(gè)主題,只要填其中一個(gè)即可)
  27. #define TopicLed2  "LedB002" //巴法云控制臺(tái)創(chuàng)建,名稱(chēng)自定義,app訂閱主題要和這個(gè)推送主題一致(如需控制多個(gè)主題,只要填其中一個(gè)即可)
  28. sbit LED1 = P2^0; //燈1, 對(duì)應(yīng)訂閱主題LedA002
  29. sbit LED2 = P2^1; //燈2, 對(duì)應(yīng)訂閱主題LedB002
  30. //************ 需要修改以上部分 ************



  31. /*****************相關(guān)變量**************/
  32. uchar Receive;  //接收到的字節(jié)
  33. uchar i,i2,count; //定時(shí)器所用變量
  34. uint n;                                         //接收到字節(jié)的個(gè)數(shù)
  35. uchar flag=0; //標(biāo)志位,檢查是否有數(shù)據(jù)通過(guò)串口發(fā)到MCU
  36. uchar connected = 0;  //標(biāo)志位,檢查是否已連接服務(wù)器
  37. uchar Recive_table[100]; //用于接收wifi模塊反饋到MCU上的數(shù)據(jù)

  38. /*******************************************************************
  39. 名稱(chēng):延時(shí)函數(shù)
  40. 作用:毫秒級(jí)延時(shí),微妙級(jí)延時(shí)函數(shù),為數(shù)據(jù)收發(fā)完成作等待.......
  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. 名稱(chēng):波特率發(fā)生器函數(shù)
  54. 作用:波特率發(fā)生器可以是T1定時(shí)器實(shí)現(xiàn),也可以是MCU內(nèi)部獨(dú)立的波特率發(fā)生器,
  55. 各自不同的載入值計(jì)算式,具體根據(jù)寄存器相關(guān)設(shè)置來(lái)參考計(jì)算,以實(shí)現(xiàn)
  56. 異步串行通訊。(經(jīng)測(cè)試,兩種設(shè)置方式均可用,可任選一種。)
  57. ********************************************************************/
  58. void Uart_Init()//使用定時(shí)器1作為波特率發(fā)生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
  59. {
  60.         SCON=0x50;     //設(shè)置為串行口以方式1工作,8位異步通訊,允許接收中斷。
  61.         //一幀信息為10位,1位起始位,8位數(shù)據(jù)位(低位在先),1位停止位。
  62.         PCON=0x80;     //SMOD波特率選擇位為1,SMOD=1.
  63.         TMOD=0x21;    //設(shè)置定時(shí)器1為波特率發(fā)生器,工作在模式2,8位自動(dòng)裝載
  64.         TH1=0xFA ;//波特率9600 ,TH1=256-FOSC/16/12/波特率
  65.         TL1=TH1;
  66.         EA=1;                            //總中斷打開(kāi)
  67.         ES=0;                             //關(guān)閉串口中斷
  68.         TR1=1;                     //啟動(dòng)定時(shí)器1

  69.         TH0=0xD8;                  //定時(shí)10ms
  70.         TL0=0xF0;
  71.         ET0=1;
  72.         TR0=1;
  73. }




  74. /********************************************************************
  75. 名稱(chēng):串口發(fā)送函數(shù)
  76. 功能:MCU向其他與其連接的設(shè)備發(fā)送數(shù)據(jù)(此處是無(wú)線WIFI模塊ESP8266)
  77. ********************************************************************/
  78. void Send_Uart(uchar value)
  79. {
  80.       ES=0;         //關(guān)閉串口中斷
  81.       TI=0;         //清發(fā)送完畢中斷請(qǐng)求標(biāo)志位
  82.       SBUF=value;     //發(fā)送
  83.       while(TI==0);    //等待發(fā)送完畢
  84.       TI=0;         //清發(fā)送完畢中斷請(qǐng)求標(biāo)志位
  85.       ES=1;         //允許串口中斷
  86. }
  87. /********************************************************************
  88. 名稱(chēng):串口發(fā)送數(shù)據(jù)
  89. 作用: 通過(guò)串口發(fā)送指令到WIFI模塊,以便可以實(shí)現(xiàn)無(wú)線接入和控制,帶回車(chē)換行
  90. ********************************************************************/
  91. void SerialSend(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組               
  92. {

  93.       while(*puf!='\0')    //遇到空格跳出循環(huán)
  94.       {
  95.            Send_Uart(*puf);  //向WIFI模塊發(fā)送控制指令。
  96.            us_delay(5);
  97.            puf++;      
  98.       }
  99.       us_delay(5);
  100.       Send_Uart('\r');//回車(chē)
  101.       us_delay(5);
  102.       Send_Uart('\n');   //換行
  103. }   

  104. /********************************************************************
  105. 名稱(chēng):串口發(fā)送數(shù)據(jù)
  106. 作用: 通過(guò)串口發(fā)送指令到WIFI模塊,不帶回車(chē)換行
  107. ********************************************************************/
  108. void SerialSend_byte(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組               
  109. {

  110.       while(*puf!='\0')    //遇到空格跳出循環(huán)
  111.       {
  112.            Send_Uart(*puf);  //向WIFI模塊發(fā)送控制指令。
  113.            us_delay(5);
  114.            puf++;      
  115.       }
  116. }   


  117. /********************************************************************
  118. 名稱(chēng):心跳函數(shù)
  119. 作用:發(fā)送心跳。如果一分鐘不發(fā)送心跳,服務(wù)器就會(huì)認(rèn)為設(shè)備掉線,故建議30s發(fā)送一次心跳
  120. 在中斷1中調(diào)用,和發(fā)送數(shù)據(jù)函數(shù),留一個(gè)就行,發(fā)送數(shù)據(jù)也相當(dāng)于心跳
  121. ********************************************************************/
  122. void Ping(void)
  123. {        
  124.   SerialSend("cmd=0&msg=ping"); //發(fā)送心跳
  125. }

  126. void connect_topic(uchar x){
  127.         //發(fā)送訂閱指令,原格式為: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');//回車(chē)
  142.         us_delay(5);
  143.         Send_Uart('\n');   //換行
  144. }

  145. void connect_bemfa(void){
  146.         connected = 1;
  147.         SerialSend("AT+CIPMODE=1"); //開(kāi)啟透明傳輸模式
  148.         ms_delay(1000);
  149.         SerialSend("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344");  // 連接服務(wù)器和端口
  150.         ms_delay(1000);
  151.         SerialSend("AT+CIPSEND"); //進(jìn)入透?jìng)髂J,下面發(fā)的都會(huì)無(wú)條件傳輸
  152.         ms_delay(1000);
  153.         
  154.         //************ 需要修改以下部分 ************
  155.         connect_topic(1); //連接第1個(gè)訂閱主題
  156.         ms_delay(1000);
  157.         connect_topic(2); //連接第2個(gè)訂閱主題
  158.         ms_delay(1000);
  159.         //************ 需要修改以上部分 ************
  160.                
  161.         connected = 1; //表示連接成功,可以發(fā)送數(shù)據(jù)了
  162. }


  163. /********************************************************************
  164. 名稱(chēng):主函數(shù)
  165. 作用:程序的執(zhí)行入口
  166. ********************************************************************/
  167. void main()
  168. {   
  169.                 memset(Recive_table,'\0',sizeof Recive_table);//重置數(shù)組
  170.                 Uart_Init();//使用獨(dú)立的波特率發(fā)生器


  171.                 ms_delay(1000);
  172.                 SerialSend("AT+RST");     //重新啟動(dòng)wifi模塊
  173.                 ms_delay(1000);
  174.                 SerialSend("AT");     //重新啟動(dòng)wifi模塊
  175.                 ms_delay(1000);
  176.                 SerialSend("AT+CWMODE=3"); //設(shè)置路由器模式 1 station模式 2 AP路由器模式 3 station+AP混合模式
  177.                 ms_delay(1000);
  178.                 SerialSend("AT+CWJAP=\""Ssid"\",\""PassWord"\"");//設(shè)置模塊SSID:WIFI, PWD:密碼 及安全類(lèi)型加密模式(WPA2-PSK)
  179.                 ms_delay(8000);
  180.                 connect_bemfa(); //連接巴法云服務(wù)器

  181.                 while(1)
  182.                 {
  183.                                 if(flag == 1){                                       
  184.                                         //************ 需要修改以下部分 ************
  185.                                         //實(shí)際收到到指令:cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002&msg=on
  186.                                         //字符串匹配,當(dāng)檢測(cè)到字符串msg=on時(shí),執(zhí)行開(kāi)燈
  187.                                         //如果有多個(gè)主題,可以加上主題名字以區(qū)分不同設(shè)備控制命令,如: if(strstr(Recive_table,"light002&msg=on"))
  188.                                         if(strstr(Recive_table,"LedA002&msg=on")){ //當(dāng)檢測(cè)到字符串msg=on時(shí),執(zhí)行開(kāi)燈
  189.                                                         LED1=0; //引腳置高電平
  190.                                         } else if(strstr(Recive_table,"LedA002&msg=off")){ //當(dāng)檢測(cè)到字符串msg=off時(shí),執(zhí)行關(guān)燈
  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")){ //如果掉線或網(wǎng)絡(luò)故障,重新連接
  199.                                                         connect_bemfa(); //連接巴法云服務(wù)器
  200.                                         }
  201.                                         memset(Recive_table,'\0',sizeof Recive_table);//重置數(shù)組
  202.                                         flag=0;
  203.                                 }
  204.                 }         
  205. }

  206. /********************************************************************************
  207. 名稱(chēng):串行通訊中斷
  208. 作用:發(fā)送或接收結(jié)束后進(jìn)入該函數(shù),對(duì)相應(yīng)的標(biāo)志位清零, 實(shí)現(xiàn)模塊對(duì)數(shù)據(jù)正常的收發(fā)

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

  210. void Uart_Interrupt() interrupt 4        
  211. {
  212.                 if(RI==1)
  213.                 {
  214.                                  RI=0;
  215.                                  Receive=SBUF;        //MCU接收wifi模塊反饋回來(lái)的數(shù)據(jù)
  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. //定時(shí)發(fā)送心跳,或發(fā)送傳感器數(shù)據(jù)
  226. //心跳建議30s發(fā)一次,一分鐘不發(fā)數(shù)據(jù),服務(wù)器會(huì)認(rèn)為設(shè)備掉線
  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();   //發(fā)送心跳
  240.                                         }

  241.                                         count=0;
  242.                                 }               
  243.                 }        
  244. }
復(fù)制代碼

附件在2樓

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:424598 發(fā)表于 2020-11-2 23:57 | 顯示全部樓層
附件在二樓

巴法云ESP8266-01.zip

12.27 MB, 下載次數(shù): 142, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:782563 發(fā)表于 2021-2-2 13:01 | 顯示全部樓層
想請(qǐng)問(wèn)一下電路如何連接
回復(fù)

使用道具 舉報(bào)

ID:134870 發(fā)表于 2021-3-26 22:38 | 顯示全部樓層
51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2021-4-4 21:10 | 顯示全部樓層

51黑有你更精彩記號(hào)
回復(fù)

使用道具 舉報(bào)

ID:83626 發(fā)表于 2021-10-4 20:15 | 顯示全部樓層
下載來(lái)玩一下,正好手里有配件。
回復(fù)

使用道具 舉報(bào)

ID:518395 發(fā)表于 2022-3-30 21:10 | 顯示全部樓層
最近在學(xué)著用巴法云,謝謝樓主!
回復(fù)

使用道具 舉報(bào)

ID:901516 發(fā)表于 2022-4-17 16:51 | 顯示全部樓層
樓主知道如何用51發(fā)數(shù)據(jù)去巴法云平臺(tái)嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表