1. 程式人生 > >51微控制器通過ESP8266模組與手機進行通訊(微控制器)

51微控制器通過ESP8266模組與手機進行通訊(微控制器)

 本人在校大學生一枚,前段時間參加校內大學生創新創業比賽,專案需要讓手機控制微控制器進行控制,搗鼓了很久,在網上找了很多資料,發現做微控制器嵌入式的有很多,做移動開發的也有很多,但把他們結合起來的很少,所以現在我把我做專案的經驗分享出來

 Step1:配置ESP8266

 通過USB轉TTL模組把ESP8266模組和電腦連線起來,如

把ESP8266模組的VCC,GND,CH_PD,UTXD,URXD口分別接USB轉TTL模組的3.3v,,3.3v,RXD,TXD

連線好後,就準備用電腦用串列埠除錯助手向ESP8266傳送AT指令。

串列埠除錯助手下載地址:百度雲盤 

設定好串列埠除錯助手的串列埠和波特率,ESP8266預設波特率為115200,把串列埠除錯助手的波特率調為115200

,勾選左下角的傳送新行。在輸入框中輸入 AT+RST 然後點擊發送:

如果前面的配置都沒錯的話,串列埠除錯助手會接收到esp8266返回的資訊,AT+RST是復位命令,ESP8266會返回一堆亂碼,這時候就說明ESP8266配置成功了。

配置好ESP8266之後就可以更改模組的資訊了,按照以下順序向模組傳送AT指令:

AT+CWMODE=2

AT+CWSAP="esp8266","0123456789",11,3     //更改wifi名稱,名字最好不要亂改,有些特別的名字是顯示不出來的。

AT+RST             //配置完AT+CWMODE要重啟以下模組使配置生效

AT+CIPMUX=1

AT+CIPSERVER=1,8080               //8080為埠號,之後手機和微控制器進行通訊要用到,可以自己修改。

前面三條綠色的指令配置一次就夠了,斷電重連配置的資訊也不會改變,後面兩條紅色的指令要每次重啟模組之後都要配置一遍。

按順序配置完之後就可以用手機進行連線,如果手機發現wifi並且輸入密碼成功連線了,就證明上面的配置成功了。

開啟手機網路除錯助手,把協議型別設定為"TCP Client",IP地址設定為用AT+CIFSR指令查詢到的ESP8266的IP,埠號就是前面設定的埠號。

配置好之後點連線(手機要連線好ESP8266的wifi),然後輸入任意資訊(如:123),點擊發送。和ESP8266連線的電腦上的串列埠除錯助手就會收到資訊:+IPD,0,3:123

(不同的ESP8266收到資訊的格式可能會不同)從左到右的數字中,0是代表客戶的索引,3是代表收到資訊的大小,至於是位元組數還是什麼的就不清楚了,冒號後面是收到的資訊,到時候把ESP8266連線到微控制器上面的時候,微控制器收到的和電腦一樣的字串,我們需要編寫程式解析字串,把其中需要的資訊提取出來(如:+IPD,0,3:123,把123提取出來,微控制器就可以得知手機發送了123,就可以在程式裡面進行對應的動作)

Step2:連線微控制器和ESP8266

上面的配置只是電腦和ESP8266的連線,確保ESP8266執行正常,現在要進行微控制器和ESP8266的連線了。

因為51微控制器通訊的波特率為9600,所以ESP8266要與微控制器進行連線通訊,就要先用電腦吧ESP8266的波特率設定為9600;

AT+CIOBAUD=9600    傳送一下指令就可以設定ESP8266波特率為9600了,AT+RST重啟一下ESP8266,不要忘了把電腦串列埠除錯助手的波特率也改為9600了,不然電腦連線ESP8266就會出現錯誤的了。

之前說過ESP8266有些指令配置一次就可以,有些重啟之後要重新配置,這些指令是下面這兩條:

AT+CIPMUX=1

AT+CIPSERVER=1,8080               //8080為埠號,之後手機和微控制器進行通訊要用到,可以自己修改。

這些指令之前是用電腦給ESP8266傳送的,但現在ESP8266和微控制器連線起來的,這時要用微控制器向ESP8266傳送AT指令了。

在微控制器程式中加入以下程式碼:

void connect_init()
{
    char *a="AT+CIPMUX=1\r\n";
    char *b="AT+CIPSERVER=1,8080\r\n";
    while(*a!='\0')
    {
        SBUF=*a;      //寫入要傳送的字元
        while(!TI);    //等待發送完成
        TI=0;          //傳送
        a++;
    }
    //這裡新增延時函式,延時5ms左右,給ESP8266反應時間
    while(*b!='\0')
    {
        SBUF=*b;  
 
        while(!TI);    //等待發送完成
        TI=0;
        b++;
    }
}

程式的開頭,配置串列埠連線函式的後面加入上面的程式碼,就可以讓微控制器每次開機的時候都向ESP8266傳送一次指令,如果不會配置微控制器串列埠的話,就百度一下教程,配置串列埠中斷是51微控制器基礎的知識,這裡就不多說了。

燒錄好程式之後,然後把ESP8266模組和微控制器連線起來,接線方式跟之前的差不多,VCC,GND,CH_PD,UTXD,URXD口分別接3.3v,,3.3v,微控制器晶片的RXD,微控制器晶片的TXD,其中,要和微控制器共地。

確保連線好ESP8266和燒錄好程式,復位一下微控制器,此時微控制器應該向ESP8266完成傳送AT指令了,開啟手機的wifi,是否能連線上模組發出的wifi

熱點,如果能連線上,證明單片機發送AT指令進行初始化的程式碼塊沒問題,如果失敗了,檢查一下連線和程式是否有問題。

 現在已經完成了微控制器與ESP8266的連線與初始化了,之後就進行對ESP8266向單片機發送的資訊的解析。



void Uart() interrupt 4
{
        char res;
res=SBUF;         //取出接受到的資料
RI=0;              //清除接受中斷標誌位
        if(res==':'||i>0)    //i是全域性變數
{
receive[i]=res;   //receive陣列也是全域性變數
i++;
if(res=='\n')
{
i=0;
      //新增對收到資訊的處理程式碼
memset(receive,0,50);
}
}
}

因為微控制器每產生一次串列埠中斷,只是接收一個字元,微控制器要接收+IPD,0,3:123的話,就會產生多次中斷,微控制器的中斷程式裡面就要進行對收到的資訊進行篩選和提取。上面程式碼中 if(res==':'||i>0)  目的是排除掉+IPD,0,3 我不需要用的資訊,然後i>0是確保之後程式能執行到if裡面, 之後if(res=='\n')就是判斷ESP8266傳送完成一條資訊沒有,進入if(res=='\n')裡面之後此時數組裡面的資訊是:123,然後就可以新增相關的處理函數了(如:LED=0),處理完之後要呼叫memset(receive,0,50);把陣列清空,以便下次使用。

把程式向微控制器進行燒錄,連線好ESP8266(連線著ESP8266的時候燒錄會失敗,應該拔下ESP8266的TX和RX端),復位微控制器,然後用手機連線上wifi,開啟手機網路除錯助手,傳送自己設定好的資訊,看看微控制器有沒做出對應的處理(如:LED從滅到亮),成功的話就可以在原先的程式上加上自己專案需要的程式碼就可以進行手機操控微控制器了。

程式碼下載