|
一直想試試遠(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)
以下是巴法云的控制臺(tái),我添加了二個(gè)設(shè)備,跟代碼里的一致
以下是附件內(nèi)容,大家按順序操作即可,工具和引腳接線統(tǒng)統(tǒng)有圖有說(shuō)明
- /*********************************************************************
- 題目:STC89C51/52+ESP8266-01/01S實(shí)現(xiàn)在線遠(yuǎn)程控制多個(gè)設(shè)備
- 代碼:以下為利用巴法云2個(gè)訂閱主題分別控制2個(gè)IO口的代碼(方便新手理解及擴(kuò)展)
- 注意:晶振一定是11.0592MHz。
- 關(guān)于UID:在巴法云注冊(cè)登陸,即可看到自己UID,推送微信消息,需要手機(jī)綁定微信,bemfa.com在控制臺(tái)進(jìn)行綁定即可。
- 注意:新買(mǎi)的ESP8266-01默認(rèn)是115200波特率,需要利用串口調(diào)試助手更改esp8266波特率為9600
- 更改方法:USB轉(zhuǎn)串口板連接到ESP8266,波特率115200,發(fā)送 AT+UART=9600,8,1,0,0 //末尾有回車(chē)換行
- USB轉(zhuǎn)串口板接線方法:tx--rx ,rx--tx,gnd-gnd,3.3v--3.3v,EN--3.3v //esp8266--USB轉(zhuǎn)串口板
- 官方文檔見(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
- 注冊(cè)、登陸頁(yè)面:cloud.bemfa點(diǎn)com/u_login.php
- STC89C51/52與ESP8266-01/01S的接線方式(注意-需要先將本程序燒錄到單片機(jī)后斷電,接上ESP8226-01/01S,然后上電):
- STC89C51/52 ESP8266-01
- P30----------------TX
- P31----------------RX
- 以下代碼只有幾處需要根據(jù)你的實(shí)際情況修改, 已注明"需要修改此部分", 其它地方不需要修改
- ********************************************************************/
- #include <reg52.h>
- #include <stdio.h>
- #include <string.h> //包含頭文件
- #define uint unsigned int
- #define uchar unsigned char
- //************ 需要修改以下部分 ************
- #define Ssid "wifi名稱(chēng)" //WIFI名稱(chēng),,修改為自己路由器的WIFI名稱(chēng),好像不支持中文
- #define PassWord "wifi密碼" //WIFI密碼,修改為自己路由器的
- #define Uid "密鑰" //巴法云UID密鑰,控制臺(tái)獲取
- #define TopicLed1 "LedA002" //巴法云控制臺(tái)創(chuàng)建,名稱(chēng)自定義,app訂閱主題要和這個(gè)推送主題一致(如需控制多個(gè)主題,只要填其中一個(gè)即可)
- #define TopicLed2 "LedB002" //巴法云控制臺(tái)創(chuàng)建,名稱(chēng)自定義,app訂閱主題要和這個(gè)推送主題一致(如需控制多個(gè)主題,只要填其中一個(gè)即可)
- sbit LED1 = P2^0; //燈1, 對(duì)應(yīng)訂閱主題LedA002
- sbit LED2 = P2^1; //燈2, 對(duì)應(yīng)訂閱主題LedB002
- //************ 需要修改以上部分 ************
- /*****************相關(guān)變量**************/
- uchar Receive; //接收到的字節(jié)
- uchar i,i2,count; //定時(shí)器所用變量
- uint n; //接收到字節(jié)的個(gè)數(shù)
- uchar flag=0; //標(biāo)志位,檢查是否有數(shù)據(jù)通過(guò)串口發(fā)到MCU
- uchar connected = 0; //標(biāo)志位,檢查是否已連接服務(wù)器
- uchar Recive_table[100]; //用于接收wifi模塊反饋到MCU上的數(shù)據(jù)
- /*******************************************************************
- 名稱(chēng):延時(shí)函數(shù)
- 作用:毫秒級(jí)延時(shí),微妙級(jí)延時(shí)函數(shù),為數(shù)據(jù)收發(fā)完成作等待.......
- ********************************************************************/
- void ms_delay(uint t)
- {
- uint i,j;
- for(i=t;i>0;i--)
- for(j=110;j>0;j--);
- }
- void us_delay(uchar t)
- {
- while(t--);
- }
- /********************************************************************
- 名稱(chēng):波特率發(fā)生器函數(shù)
- 作用:波特率發(fā)生器可以是T1定時(shí)器實(shí)現(xiàn),也可以是MCU內(nèi)部獨(dú)立的波特率發(fā)生器,
- 各自不同的載入值計(jì)算式,具體根據(jù)寄存器相關(guān)設(shè)置來(lái)參考計(jì)算,以實(shí)現(xiàn)
- 異步串行通訊。(經(jīng)測(cè)試,兩種設(shè)置方式均可用,可任選一種。)
- ********************************************************************/
- void Uart_Init()//使用定時(shí)器1作為波特率發(fā)生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
- {
- SCON=0x50; //設(shè)置為串行口以方式1工作,8位異步通訊,允許接收中斷。
- //一幀信息為10位,1位起始位,8位數(shù)據(jù)位(低位在先),1位停止位。
- PCON=0x80; //SMOD波特率選擇位為1,SMOD=1.
- TMOD=0x21; //設(shè)置定時(shí)器1為波特率發(fā)生器,工作在模式2,8位自動(dòng)裝載
- TH1=0xFA ;//波特率9600 ,TH1=256-FOSC/16/12/波特率
- TL1=TH1;
- EA=1; //總中斷打開(kāi)
- ES=0; //關(guān)閉串口中斷
- TR1=1; //啟動(dòng)定時(shí)器1
- TH0=0xD8; //定時(shí)10ms
- TL0=0xF0;
- ET0=1;
- TR0=1;
- }
- /********************************************************************
- 名稱(chēng):串口發(fā)送函數(shù)
- 功能:MCU向其他與其連接的設(shè)備發(fā)送數(shù)據(jù)(此處是無(wú)線WIFI模塊ESP8266)
- ********************************************************************/
- void Send_Uart(uchar value)
- {
- ES=0; //關(guān)閉串口中斷
- TI=0; //清發(fā)送完畢中斷請(qǐng)求標(biāo)志位
- SBUF=value; //發(fā)送
- while(TI==0); //等待發(fā)送完畢
- TI=0; //清發(fā)送完畢中斷請(qǐng)求標(biāo)志位
- ES=1; //允許串口中斷
- }
- /********************************************************************
- 名稱(chēng):串口發(fā)送數(shù)據(jù)
- 作用: 通過(guò)串口發(fā)送指令到WIFI模塊,以便可以實(shí)現(xiàn)無(wú)線接入和控制,帶回車(chē)換行
- ********************************************************************/
- void SerialSend(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
- {
- while(*puf!='\0') //遇到空格跳出循環(huán)
- {
- Send_Uart(*puf); //向WIFI模塊發(fā)送控制指令。
- us_delay(5);
- puf++;
- }
- us_delay(5);
- Send_Uart('\r');//回車(chē)
- us_delay(5);
- Send_Uart('\n'); //換行
- }
- /********************************************************************
- 名稱(chēng):串口發(fā)送數(shù)據(jù)
- 作用: 通過(guò)串口發(fā)送指令到WIFI模塊,不帶回車(chē)換行
- ********************************************************************/
- void SerialSend_byte(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
- {
- while(*puf!='\0') //遇到空格跳出循環(huán)
- {
- Send_Uart(*puf); //向WIFI模塊發(fā)送控制指令。
- us_delay(5);
- puf++;
- }
- }
- /********************************************************************
- 名稱(chēng):心跳函數(shù)
- 作用:發(fā)送心跳。如果一分鐘不發(fā)送心跳,服務(wù)器就會(huì)認(rèn)為設(shè)備掉線,故建議30s發(fā)送一次心跳
- 在中斷1中調(diào)用,和發(fā)送數(shù)據(jù)函數(shù),留一個(gè)就行,發(fā)送數(shù)據(jù)也相當(dāng)于心跳
- ********************************************************************/
- void Ping(void)
- {
- SerialSend("cmd=0&msg=ping"); //發(fā)送心跳
- }
- void connect_topic(uchar x){
- //發(fā)送訂閱指令,原格式為:cmd=1&uid=***UID***&topic=***Topic***
- SerialSend_byte("cmd=1&uid=");
- SerialSend_byte(Uid);
- SerialSend_byte("&topic=");
-
- //************ 需要修改以下部分 ************
- if(x==1){
- SerialSend_byte(TopicLed1);
- } else if(x==2){
- SerialSend_byte(TopicLed2);
- }
- //************ 需要修改以上部分 ************
-
- us_delay(5);
- Send_Uart('\r');//回車(chē)
- us_delay(5);
- Send_Uart('\n'); //換行
- }
- void connect_bemfa(void){
- connected = 1;
- SerialSend("AT+CIPMODE=1"); //開(kāi)啟透明傳輸模式
- ms_delay(1000);
- SerialSend("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344"); // 連接服務(wù)器和端口
- ms_delay(1000);
- SerialSend("AT+CIPSEND"); //進(jìn)入透?jìng)髂J,下面發(fā)的都會(huì)無(wú)條件傳輸
- ms_delay(1000);
-
- //************ 需要修改以下部分 ************
- connect_topic(1); //連接第1個(gè)訂閱主題
- ms_delay(1000);
- connect_topic(2); //連接第2個(gè)訂閱主題
- ms_delay(1000);
- //************ 需要修改以上部分 ************
-
- connected = 1; //表示連接成功,可以發(fā)送數(shù)據(jù)了
- }
- /********************************************************************
- 名稱(chēng):主函數(shù)
- 作用:程序的執(zhí)行入口
- ********************************************************************/
- void main()
- {
- memset(Recive_table,'\0',sizeof Recive_table);//重置數(shù)組
- Uart_Init();//使用獨(dú)立的波特率發(fā)生器
- ms_delay(1000);
- SerialSend("AT+RST"); //重新啟動(dòng)wifi模塊
- ms_delay(1000);
- SerialSend("AT"); //重新啟動(dòng)wifi模塊
- ms_delay(1000);
- SerialSend("AT+CWMODE=3"); //設(shè)置路由器模式 1 station模式 2 AP路由器模式 3 station+AP混合模式
- ms_delay(1000);
- SerialSend("AT+CWJAP=\""Ssid"\",\""PassWord"\"");//設(shè)置模塊SSID:WIFI, PWD:密碼 及安全類(lèi)型加密模式(WPA2-PSK)
- ms_delay(8000);
- connect_bemfa(); //連接巴法云服務(wù)器
- while(1)
- {
- if(flag == 1){
- //************ 需要修改以下部分 ************
- //實(shí)際收到到指令:cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002&msg=on
- //字符串匹配,當(dāng)檢測(cè)到字符串msg=on時(shí),執(zhí)行開(kāi)燈
- //如果有多個(gè)主題,可以加上主題名字以區(qū)分不同設(shè)備控制命令,如: if(strstr(Recive_table,"light002&msg=on"))
- if(strstr(Recive_table,"LedA002&msg=on")){ //當(dāng)檢測(cè)到字符串msg=on時(shí),執(zhí)行開(kāi)燈
- LED1=0; //引腳置高電平
- } else if(strstr(Recive_table,"LedA002&msg=off")){ //當(dāng)檢測(cè)到字符串msg=off時(shí),執(zhí)行關(guān)燈
- LED1=1; //引腳置低電平
- } else if(strstr(Recive_table,"LedB002&msg=on")){
- LED2=0;
- } else if(strstr(Recive_table,"LedB002&msg=off")){
- LED2=1;
- }
- //************ 需要修改以上部分 ************
- else if(strstr(Recive_table,"ERROR")){ //如果掉線或網(wǎng)絡(luò)故障,重新連接
- connect_bemfa(); //連接巴法云服務(wù)器
- }
- memset(Recive_table,'\0',sizeof Recive_table);//重置數(shù)組
- flag=0;
- }
- }
- }
- /********************************************************************************
- 名稱(chēng):串行通訊中斷
- 作用:發(fā)送或接收結(jié)束后進(jìn)入該函數(shù),對(duì)相應(yīng)的標(biāo)志位清零, 實(shí)現(xiàn)模塊對(duì)數(shù)據(jù)正常的收發(fā)
- *********************************************************************************/
- void Uart_Interrupt() interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- Receive=SBUF; //MCU接收wifi模塊反饋回來(lái)的數(shù)據(jù)
- Recive_table[i]=Receive;
- i++;
- if((Receive =='\n')){
- i=0;
- flag = 1;
- }
- }
- else TI=0;
- }
- //定時(shí)發(fā)送心跳,或發(fā)送傳感器數(shù)據(jù)
- //心跳建議30s發(fā)一次,一分鐘不發(fā)數(shù)據(jù),服務(wù)器會(huì)認(rèn)為設(shè)備掉線
- void timer0isr(void) interrupt 1
- {
- TH0=0xD8;
- TL0=0xF0;
- i2++;
- if(i2==100)
- {
- i2=0;
- count++;
- if(count>=40) //40秒,可自行修改
- {
- if(connected == 1){
- Ping(); //發(fā)送心跳
- }
- count=0;
- }
- }
- }
復(fù)制代碼
附件在2樓
|
評(píng)分
-
查看全部評(píng)分
|