一、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP控制單片機外圍LED燈亮滅的原理
二、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP控制單片機外圍LED燈亮滅的步驟
1、借助USB-TTL串口使用PC端串口調試助手軟件對ESP8266 WiFi模塊(ESP8266-01S芯片)發送激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能AT指令調試
(1)、USB-TTL串口與ESP8266 WiFi模塊(ESP8266-01S芯片)接線圖
(2)、使用PC端串口調試助手軟件(如:安信可串口調試助手軟件)對ESP8266 WiFi模塊(ESP8266-01S芯片)發送激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能AT指令調試
<1>、在安信可官網下載安信可串口調試助手軟件
<2>、雙擊打開安信可串口調試助手軟件,彈出以下界面。
<3>、USB轉TTL串口與ESP8266 WiFi模塊(ESP8266-01S芯片)相互連線后再與電腦連接。
<4>、USB轉TTL串口與ESP8266 WiFi模塊(ESP8266-01S芯片)相互連線再與電腦連接后,右鍵點擊電腦上的計算機,在彈出列表中選中屬性,此時彈出一個關於電腦控制面板的信息界面,點擊左上邊設備管理器,彈出設備管理器界面,找到端口項點開,出現新增一個通信串口:COM3。
<5>、回到安信可串口調試助手軟件界面端口處選COM3端口,在波特率處將4800改為115200,如以下界面。
<6>、在安信可串口調試助手軟件界面點擊“打開串口”后,彈出以下界面。
<7>、由於STC系列單片機與ESP8266 WiFi模塊(ESP8266-01S芯片)是在波特率為9600下進行通信,而ESP8266 WiFi模塊(ESP8266-01S芯片)默認波特率是115200,因此需要使用安信可串口調試助手軟件來修改ESP8266 WiFi模塊(ESP8266-01S芯片)波特率為9600,操作如下所示。
<8>、使用安信可串口調試助手軟件來修改ESP8266 WiFi模塊(ESP8266-01S芯片)波特率為9600后,在安信可串口調試助手軟件界面點擊“關閉串口”,回到安信可串口調試助手軟件界面端口處選COM3端口不變,在波特率處將115200改為9600,如以下界面。
<9>、在安信可串口調試助手軟件界面點擊“打開串口”,發送項右側空白欄輸入“AT+RST”驗證安信可串口調試助手軟件在修改ESP8266 WiFi模塊(ESP8266-01S芯片)波特率為9600后,是否能與ESP8266 WiFi模塊(ESP8266-01S芯片)正常通信,否則安信可串口調試助手軟件界面無信息返回,操作如下所示。
<10>、使用安信可串口調試助手軟件對ESP8266 WiFi模塊(ESP8266-01S芯片)發送激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能AT指令調試,操作如下所示。
2、用手機端安卓編程軟件AIDE編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓程序(也可用Eclipse集成安卓開發環境或Android Studio軟件編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓程序,使用手機端安卓編程軟件AIDE編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓程序可以減少錯誤發生,還可以直接生成連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP,十分方便。)
(1)、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓主程序
package com.example.esp8266androidclient; import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class ESP8266AndroidClientMainActivity extends ActionBarActivity implements View.OnClickListener { private EditText IP;//IP private EditText PORT;//端口號 private String stringip;//字符串類型IP private int stringport;//字符類型端口號 private Button connect;//連接 private Socket socket;//套接字 private PrintStream out;//打印輸出流 private ConnectThread connectthread;//連接線程 private Button open;//按鈕LED燈開 private Button close;//按鈕LED燈關 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_esp8266_android_client_main); connect=(Button)findViewById(R.id.button1); open=(Button)findViewById(R.id.button2); close=(Button)findViewById(R.id.button3); IP=(EditText)findViewById(R.id.editextip); PORT=(EditText)findViewById(R.id.editextport); connect.setOnClickListener(this); open.setOnClickListener(this); close.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.button1: if( socket == null || ! socket.isConnected()) { stringip = IP.getText().toString(); stringport = Integer.valueOf(PORT.getText().toString()); connectthread = new ConnectThread(stringip, stringport); connectthread.start(); } if(socket != null && socket.isConnected()) { try { socket.close(); socket=null; // 清空mSocket connect.setText("連接"); Toast.makeText(ESP8266AndroidClientMainActivity.this,"連接已關閉", Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } } break; case R.id.button2: if(out!=null) { out.print("0"); out.flush(); } break; case R.id.button3: if (out!=null) { out.print("1"); out.flush(); } break; } } private class ConnectThread extends Thread { private String ip; private int port; public ConnectThread(String ip,int port){ this.ip=ip; this.port=port; } @Override public void run() { try { socket=new Socket(ip,port); out = new PrintStream(socket.getOutputStream()); runOnUiThread(new Runnable() { @Override public void run() { connect.setText("斷開"); Toast.makeText(ESP8266AndroidClientMainActivity.this,"連接成功",Toast.LENGTH_LONG).show(); } }); } catch (IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { connect.setText("斷開"); Toast.makeText(ESP8266AndroidClientMainActivity.this,"連接失敗",Toast.LENGTH_LONG).show(); } }); } } } }
(2)、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓界面布局程序
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.esp8266androidclient.ESP8266AndroidClientMainActivity" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="服務器地址:" android:textSize="20dp" /> <EditText android:id="@+id/editextip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:hint="ESP8266 WiFi模塊WiFi地址號" android:inputType="textPersonName" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/linearLayout1" android:layout_below="@+id/linearLayout1" > <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="服務器端口:" android:textSize="20dp" /> <EditText android:id="@+id/editextport" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:hint="ESP8266 WiFi模塊WiFi端口號" android:inputType="textPersonName" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/linearLayout2" android:layout_below="@+id/linearLayout2" android:layout_marginTop="30dp" android:text="連接"/> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="30dp" android:text="打開" /> <Button android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button2" android:layout_below="@+id/button2" android:layout_marginTop="30dp" android:text="關閉" /> </RelativeLayout>
(3)、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP安卓屬性權限程序
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.esp8266androidclient" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".ESP8266AndroidClientMainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
(4)、編寫連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP字符串資源程序
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ESP8266AndroidClient</string> <string name="action_settings">Settings</string> </resources>
(5)、生成連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP
3、激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能后,將編寫好連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP對ESP8266 WiFi模塊(ESP8266-01S芯片)進行連接調試。
<1>、點開手機端設置,找到無線網絡並點開,彈出以下界面。
<2>、點開被激活的ESP8266 WiFi模塊WiFi,輸入密碼,點擊連接,操作如下所示。
<3>、點擊連接后,若連接成功,彈出以下界面。
<4>、查看連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiF成功后WiFi相關信息,如以下界面。
<5>、點開所生成連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP“ESP8266AndroidClient”,彈出以下界面。
<6>、在連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP“ESP8266AndroidClient”界面,輸入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的地址號(即IP號)以及ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的端口號,再點擊連接,操作如下所示。
<7>、在連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP“ESP8266AndroidClient”界面,點擊連接后,若連接成功,彈出以下界面。
4、結合使用PC端串口調試助手軟件對ESP8266 WiFi模塊(ESP8266-01S芯片)發送激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能AT指令調試情況編寫單片機C語言程序
#include <reg52.h> #include <string.h> #include <stdio.h> sbit led=P2^0;//位定義P2^0為LED燈端口 //sbit send=P3^2;//位定義P3^2為發送端口 char Recive_table[20]="";//接收數據數組變量 char reciveflag = 0;//接收標志位變量 void UART_Init(void)//單片機串口初始化函數 { TMOD=0x20;//0010 0000定時器工作方式為方式2,8位自動重裝。 TH1=0xfd;//初始化計數器高8位:1111 1101 TL1=0xfd;//初始化計數器低8位 TR1=1;//啟動定時器1 SM0=0;//設定串口工作方式為方式1(10位異步通信) SM1=1;//設定串口工作方式 REN=1;//打開串口中斷接收允許 EA=1;//打開全局中斷 ES=1;//打開串口中斷允許位 } void UART_Interrupt() interrupt 4//單片機串口中斷函數 { // static char i=0; // if(RI==1)//判斷串口接收中斷標志位是否為1,若串口接收中斷標志位為1,表示單片機接收數據緩存寄存器接收數據結束。 // { // ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某設備獲取的數據結束后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序,形成固定循環,導致無法運行其他程序。 // RI=0;//表示單片機接收數據緩存寄存器可重新接收數據,不可申請串口中斷。 // Recive_table[i]=SBUF;//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據賦給數組變量Recive_table[] // i++; // if((Recive_table[i-1] == '\n'))//判斷單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據是否有換行。 // { // Recive_table[i]='\0';//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據在i這個位置結束。 // i=0; // reciveflag = 1;//接收標志位變量置1 // } // ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。 // } // else // TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。 } void Delay(int t)//延時函數 { int i,j; for(i=t;i>0;i--) for(j=110;j>0;j--); } void LED(void)//LED燈指示函數,用來提示單片機是在給ESP8266 WiFi模塊發送激活WiFi功能的AT指令。 { P2 = 0; Delay(100); P2 = 0xff; Delay(100); } void WiFi_Init(void)//ESP8266 WiFi模塊發射WiFi初始化函數,相當於在PC端串口調試助手軟件界面輸入激活ESP8266 WiFi模塊發射WiFi的AT指令這一過程。 { ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束后,TI(即串口發送中斷標志位)=1,若ES不設置為0,在TI(即串口發送中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行串口中斷服務程序。 TI = 1;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可給PC端串口調試助手發送數據結束,申請串口中斷。 printf("AT+RST\r\n");//復位ESP8266 WiFi模塊(ESP8266-01S芯片) LED(); Delay(1000) ; printf("AT+CWMODE=3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置工作模式,指令AT+CWMODE=<mode>,其中<mode>:1:Station模式(充當客戶端,用來連接其他無線網絡熱點。),2:AP模式(充當服務器,用來發射無線網絡熱點,供其他設備連接。),3:Station模式+AP模式混合模式(即可充當服務器又可充當客戶端,可用來發射無線網絡熱點,供其他設備連接,也可用來連接其他無線網絡熱點。) LED(); Delay(1000); printf("AT+CWSAP=\"ESP8266_01S\",\"88888888\",1,3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置WiFi名和WiFi密碼,指令AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> ,其中<ssid>為"無線網絡熱點名稱",<pwd>為"無線網絡熱點密碼",至少有8位數密碼,<chl>為通道號,<ecn>為加密方式(加密方式:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK)。 LED(); Delay(1000) ; printf("AT+CIFSR\r\n"); //查詢ESP8266 WiFi模塊(ESP8266-01S芯片)IP LED(); Delay(1000) ; // printf("AT+CWLIF\r\n");//查看接入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi熱點的某設備IP // LED(); // Delay(1000) ; printf("AT+CIPMUX=1\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟多連接模式,指令AT+CIPMUX=1,0:單路連接,1:多路連接。 LED(); Delay(1000) ; printf("AT+CIPSERVER=1,8080\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟服務器模式,指令AT+CIPSERVER=1(0:關閉服務器模式,1:開啟服務器模式),8080(端口號,缺省值為333)。注意:當AT+CIPMUX=1時才能開啟服務器,關閉服務器模式需要重啟。開啟服務器后自動建立服務器監聽,當有客戶端接入會自動按順序占用一個連接。 LED(); Delay(1000) ; // printf("AT+UART_DEF=9600,8,1,0,0\r\n");//修改ESP8266 WiFi模塊波特率為9600 // LED(); // Delay(1000); // printf("AT+CIPSTATUS\r\n"); //查詢ESP8266 WiFi模塊當前連接情況,指令AT+CIPSTATUS;響應:+ CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>,其中<id>為連接的id號,有0-4,<type>為字符串參數,類型TCP或UDP,<addr>為字符串參數,IP地址,<port>為端口號,<tetype>: 0-本模塊作客戶端連接,1-本模塊作服務器連接。 // LED(); // Delay(1000) ; while(!TI);//判斷串口發送中斷標志位是否為1,若為1則單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束。為什么在此編寫while(!TI)?由於需要把單片機發送數據緩存寄存器保存的數據發送給PC端串口調試助手。 TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。 ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。 } int main (void) { UART_Init();//串口初始化,波特率為9600 Delay(1000) ; WiFi_Init(); //wifi初始化 led=0; while(1) { Delay(10) ; if(reciveflag == 1)//判斷接收標志位變量是否為1,接收標志位變量為1時,單片機通過串口通信接收ESP8266 WiFi模塊從某終端獲取的數據。 { ES=0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行reciveflag=1,又得回來再次判斷if(reciveflag==1),形成固定循環,導致無法運行其他程序。 if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第1、第2、第3、第4、第7的數據是否為:+IPD,x,x:y { if((Recive_table[3]=='D')&&(Recive_table[6]==',')) { if(Recive_table[9]=='0')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為0 led = 0;//點亮LED燈 if(Recive_table[9]=='1')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為1 led = 1;//熄滅LED燈 } } memset(Recive_table,'\0',20);//將數組Recive_table[]中的數據全部置空 reciveflag = 0;//接收標志位變量置0 ES=1;//打開串口中斷允許位,允許進入串口中斷服務程序。 } /*if(0 == send)//通過串口給手機發送字符串hello { Delay(400); if(0 == send) { ES = 0; TI = 1; printf("AT+CIPSEND=?\r\n"); LED(); Delay(1000) ; printf("AT+CIPSEND=0,10\r\n"); LED(); Delay(1000) ; printf("hello\r\n"); LED(); Delay(1000) ; LED(); Delay(1000) ; LED(); Delay(1000) ; while(!TI); TI = 0; ES = 1; } while(0 == send); } */ } }
5、給STC系列單片機燒寫單片機C語言程序
(1)、給STC系列單片機燒寫單片機C語言程序的接線圖
(2)、STC系列單片機燒寫單片機C語言程序成功表示圖
6、將編寫好連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP通過PC端串口調試助手軟件借助USB-TTL串口對ESP8266 WiFi模塊(ESP8266-01S芯片)及STC系列單片機進行通訊調試
(1)、USB-TTL串口、ESP8266 WiFi模塊(ESP8266-01S芯片)及STC系列單片機通訊接線圖
(2)、使用連接ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi的Android客戶端APP通過PC端串口調試助手軟件借助USB-TTL串口對ESP8266 WiFi模塊(ESP8266-01S芯片)及STC系列單片機進行通訊調試
(3)、
7、
8、
9、
10、