一直想試試遠程控制設備,τ 寶成品還是小貴,之前買的ESP8266-01(IO口太少,而且機智云、騰訊云等感覺又太麻煩)
這幾天接觸到巴法云,感覺挺簡單的,試了官方的示例(用的是MCU的ESP8266-12E+Arduino)但感覺浪費IO口
然后繼續百度搜資料,找到了巴法云-簡書,發現了這個ESP8266-01+STC89C52的示例(官方代碼備注詳細,簡單易懂)
后經摸索修改成了能同時控制二個設備的代碼,能用控制臺控制,也能用天貓精靈控制(APP控制還沒有時間測試)
還需低成本遠程控制多個設備的,可以添加NRF24L01當主機, 從機用NRF24L01+單片機實現
IMG_20201102_210654.jpg (2.28 MB, 下載次數: 136)
下載附件
2020-11-2 23:36 上傳
以下是巴法云的控制臺,我添加了二個設備,跟代碼里的一致
巴法云控制臺示例.png (27.9 KB, 下載次數: 112)
下載附件
2020-11-2 23:36 上傳
以下是附件內容,大家按順序操作即可,工具和引腳接線統統有圖有說明
2345截圖20201102233307.png (73.56 KB, 下載次數: 116)
下載附件
2020-11-2 23:36 上傳
- /*********************************************************************
- 題目:STC89C51/52+ESP8266-01/01S實現在線遠程控制多個設備
- 代碼:以下為利用巴法云2個訂閱主題分別控制2個IO口的代碼(方便新手理解及擴展)
- 注意:晶振一定是11.0592MHz。
- 關于UID:在巴法云注冊登陸,即可看到自己UID,推送微信消息,需要手機綁定微信,bemfa.com在控制臺進行綁定即可。
- 注意:新買的ESP8266-01默認是115200波特率,需要利用串口調試助手更改esp8266波特率為9600
- 更改方法:USB轉串口板連接到ESP8266,波特率115200,發送 AT+UART=9600,8,1,0,0 //末尾有回車換行
- USB轉串口板接線方法:tx--rx ,rx--tx,gnd-gnd,3.3v--3.3v,EN--3.3v //esp8266--USB轉串口板
- 官方文檔見官網:www點cloud.bemfa點com/docs/#/?id=_51-tcp%e5%88%9b%e5%ae%a2%e4%ba%91
- 注冊、登陸頁面:cloud.bemfa點com/u_login.php
- STC89C51/52與ESP8266-01/01S的接線方式(注意-需要先將本程序燒錄到單片機后斷電,接上ESP8226-01/01S,然后上電):
- STC89C51/52 ESP8266-01
- P30----------------TX
- P31----------------RX
- 以下代碼只有幾處需要根據你的實際情況修改, 已注明"需要修改此部分", 其它地方不需要修改
- ********************************************************************/
- #include <reg52.h>
- #include <stdio.h>
- #include <string.h> //包含頭文件
- #define uint unsigned int
- #define uchar unsigned char
- //************ 需要修改以下部分 ************
- #define Ssid "wifi名稱" //WIFI名稱,,修改為自己路由器的WIFI名稱,好像不支持中文
- #define PassWord "wifi密碼" //WIFI密碼,修改為自己路由器的
- #define Uid "密鑰" //巴法云UID密鑰,控制臺獲取
- #define TopicLed1 "LedA002" //巴法云控制臺創建,名稱自定義,app訂閱主題要和這個推送主題一致(如需控制多個主題,只要填其中一個即可)
- #define TopicLed2 "LedB002" //巴法云控制臺創建,名稱自定義,app訂閱主題要和這個推送主題一致(如需控制多個主題,只要填其中一個即可)
- sbit LED1 = P2^0; //燈1, 對應訂閱主題LedA002
- sbit LED2 = P2^1; //燈2, 對應訂閱主題LedB002
- //************ 需要修改以上部分 ************
- /*****************相關變量**************/
- uchar Receive; //接收到的字節
- uchar i,i2,count; //定時器所用變量
- uint n; //接收到字節的個數
- uchar flag=0; //標志位,檢查是否有數據通過串口發到MCU
- uchar connected = 0; //標志位,檢查是否已連接服務器
- uchar Recive_table[100]; //用于接收wifi模塊反饋到MCU上的數據
- /*******************************************************************
- 名稱:延時函數
- 作用:毫秒級延時,微妙級延時函數,為數據收發完成作等待.......
- ********************************************************************/
- 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--);
- }
- /********************************************************************
- 名稱:波特率發生器函數
- 作用:波特率發生器可以是T1定時器實現,也可以是MCU內部獨立的波特率發生器,
- 各自不同的載入值計算式,具體根據寄存器相關設置來參考計算,以實現
- 異步串行通訊。(經測試,兩種設置方式均可用,可任選一種。)
- ********************************************************************/
- void Uart_Init()//使用定時器1作為波特率發生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
- {
- SCON=0x50; //設置為串行口以方式1工作,8位異步通訊,允許接收中斷。
- //一幀信息為10位,1位起始位,8位數據位(低位在先),1位停止位。
- PCON=0x80; //SMOD波特率選擇位為1,SMOD=1.
- TMOD=0x21; //設置定時器1為波特率發生器,工作在模式2,8位自動裝載
- TH1=0xFA ;//波特率9600 ,TH1=256-FOSC/16/12/波特率
- TL1=TH1;
- EA=1; //總中斷打開
- ES=0; //關閉串口中斷
- TR1=1; //啟動定時器1
- TH0=0xD8; //定時10ms
- TL0=0xF0;
- ET0=1;
- TR0=1;
- }
- /********************************************************************
- 名稱:串口發送函數
- 功能:MCU向其他與其連接的設備發送數據(此處是無線WIFI模塊ESP8266)
- ********************************************************************/
- void Send_Uart(uchar value)
- {
- ES=0; //關閉串口中斷
- TI=0; //清發送完畢中斷請求標志位
- SBUF=value; //發送
- while(TI==0); //等待發送完畢
- TI=0; //清發送完畢中斷請求標志位
- ES=1; //允許串口中斷
- }
- /********************************************************************
- 名稱:串口發送數據
- 作用: 通過串口發送指令到WIFI模塊,以便可以實現無線接入和控制,帶回車換行
- ********************************************************************/
- void SerialSend(uchar *puf) // 數組指針*puf指向字符串數組
- {
- while(*puf!='\0') //遇到空格跳出循環
- {
- Send_Uart(*puf); //向WIFI模塊發送控制指令。
- us_delay(5);
- puf++;
- }
- us_delay(5);
- Send_Uart('\r');//回車
- us_delay(5);
- Send_Uart('\n'); //換行
- }
- /********************************************************************
- 名稱:串口發送數據
- 作用: 通過串口發送指令到WIFI模塊,不帶回車換行
- ********************************************************************/
- void SerialSend_byte(uchar *puf) // 數組指針*puf指向字符串數組
- {
- while(*puf!='\0') //遇到空格跳出循環
- {
- Send_Uart(*puf); //向WIFI模塊發送控制指令。
- us_delay(5);
- puf++;
- }
- }
- /********************************************************************
- 名稱:心跳函數
- 作用:發送心跳。如果一分鐘不發送心跳,服務器就會認為設備掉線,故建議30s發送一次心跳
- 在中斷1中調用,和發送數據函數,留一個就行,發送數據也相當于心跳
- ********************************************************************/
- void Ping(void)
- {
- SerialSend("cmd=0&msg=ping"); //發送心跳
- }
- void connect_topic(uchar x){
- //發送訂閱指令,原格式為: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');//回車
- us_delay(5);
- Send_Uart('\n'); //換行
- }
- void connect_bemfa(void){
- connected = 1;
- SerialSend("AT+CIPMODE=1"); //開啟透明傳輸模式
- ms_delay(1000);
- SerialSend("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344"); // 連接服務器和端口
- ms_delay(1000);
- SerialSend("AT+CIPSEND"); //進入透傳模式,下面發的都會無條件傳輸
- ms_delay(1000);
-
- //************ 需要修改以下部分 ************
- connect_topic(1); //連接第1個訂閱主題
- ms_delay(1000);
- connect_topic(2); //連接第2個訂閱主題
- ms_delay(1000);
- //************ 需要修改以上部分 ************
-
- connected = 1; //表示連接成功,可以發送數據了
- }
- /********************************************************************
- 名稱:主函數
- 作用:程序的執行入口
- ********************************************************************/
- void main()
- {
- memset(Recive_table,'\0',sizeof Recive_table);//重置數組
- Uart_Init();//使用獨立的波特率發生器
- ms_delay(1000);
- SerialSend("AT+RST"); //重新啟動wifi模塊
- ms_delay(1000);
- SerialSend("AT"); //重新啟動wifi模塊
- ms_delay(1000);
- SerialSend("AT+CWMODE=3"); //設置路由器模式 1 station模式 2 AP路由器模式 3 station+AP混合模式
- ms_delay(1000);
- SerialSend("AT+CWJAP=\""Ssid"\",\""PassWord"\"");//設置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
- ms_delay(8000);
- connect_bemfa(); //連接巴法云服務器
- while(1)
- {
- if(flag == 1){
- //************ 需要修改以下部分 ************
- //實際收到到指令:cmd=2&uid=4d9ec352e0376f2110a0c601a2857225&topic=light002&msg=on
- //字符串匹配,當檢測到字符串msg=on時,執行開燈
- //如果有多個主題,可以加上主題名字以區分不同設備控制命令,如: if(strstr(Recive_table,"light002&msg=on"))
- if(strstr(Recive_table,"LedA002&msg=on")){ //當檢測到字符串msg=on時,執行開燈
- LED1=0; //引腳置高電平
- } else if(strstr(Recive_table,"LedA002&msg=off")){ //當檢測到字符串msg=off時,執行關燈
- 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")){ //如果掉線或網絡故障,重新連接
- connect_bemfa(); //連接巴法云服務器
- }
- memset(Recive_table,'\0',sizeof Recive_table);//重置數組
- flag=0;
- }
- }
- }
- /********************************************************************************
- 名稱:串行通訊中斷
- 作用:發送或接收結束后進入該函數,對相應的標志位清零, 實現模塊對數據正常的收發
- *********************************************************************************/
- void Uart_Interrupt() interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- Receive=SBUF; //MCU接收wifi模塊反饋回來的數據
- Recive_table[i]=Receive;
- i++;
- if((Receive =='\n')){
- i=0;
- flag = 1;
- }
- }
- else TI=0;
- }
- //定時發送心跳,或發送傳感器數據
- //心跳建議30s發一次,一分鐘不發數據,服務器會認為設備掉線
- void timer0isr(void) interrupt 1
- {
- TH0=0xD8;
- TL0=0xF0;
- i2++;
- if(i2==100)
- {
- i2=0;
- count++;
- if(count>=40) //40秒,可自行修改
- {
- if(connected == 1){
- Ping(); //發送心跳
- }
- count=0;
- }
- }
- }
復制代碼
附件在2樓
|