一、系統方案
手機APP通過ESP8266 WIFI模塊與51單片機通信控制四路繼電器。下位機由單片機、ESP8266模塊和繼電器模塊組成,上位機由Android手機APP承擔。我們在APP上發送繼電器的開關控制指令,ESP8266將收到的數據發送給單片機,從而實現對繼電器進行開關控制。
二、硬件設計
ESP8266模塊作為一個透傳模塊使用,RXD、TXD分別連接51單片機的TXD和RXD,VCC和EN管腳接3.3V電壓,GND接地,只需要連接這些管腳,ESP8266模塊就可以正常工作了。
單片機的P2^0,P2^1,P2^2,P2^3輸出高低電瓶控制四路繼電器,繼電器模塊是從網上購買的已經焊接好的模塊,其他地方為手工萬用板焊接。
三、單片機軟件設計
單片機代碼主要是串口初始化、ESP8266的初始化和串口中斷。
1.串口和ESP8266初始化:
/** *發送單個字符 */ void sendChar(uchar a) { SBUF = a; while(TI==0); TI=0; } /** *發送字符串 */ void sendString(uchar *s) { while(*s!='\0') { sendChar(*s); s++; } } /** *初始化ESP8266模塊 */ void initEsp() { TMOD=0x20; //定時器1工作在方式2 TH1 = 0xfd; //波特率9600 TL1 = 0xfd; SM0=0; //串口工作在方式1 SM1=1; EA = 1; //開總中斷 REN = 1; //使能串口 TR1 = 1; //定時器1開始計時 delayms(200); sendString("AT+CWMODE=2\r\n"); //AP模式 delayms(200); sendString("AT+CIPMUX=1\r\n"); //允許多連接 delayms(200); sendString("AT+CIPSERVER=1\r\n"); //建立TCP Server delayms(200); ES = 1; //開串口中斷 }
sendString("AT+CWMODE=2\r\n") ----- 單片機發送AT指令到ESP8266模塊,AT+CWMODE=2是將ESP8266設置為AP模式,\r\n是換行,因為AT指令加換行才能生效。
sendString("AT+CIPMUX=1\r\n") ---- 允許多連接
sendString("AT+CIPSERVER=1\r\n") ---- 建立TCP Server
2. 串口中斷函數,負責處理App發送給單片機的指令:
/** * 串口中斷函數,負責處理App發送給單片機的指令 */ void uart() interrupt 4 { if(RI == 1) { RI = 0; //清除串口接收標志位 receiveTable[i]=SBUF; if(receiveTable[0]=='+') { i++; } else { i=0; } if(i==10) { i=0; switch(receiveTable[9]) { case '1': //打開繼電器 JDQ4=0; break; case '2': //關閉繼電器 JDQ4=1; break; case '3': JDQ3=0; break; case '4': JDQ3=1; break; case '5': JDQ2=0; break; case '6': JDQ2=1; break; case '7': JDQ1=0; break; case '8': JDQ1=1; break; } } } }
esp8266在收到數據并轉發給單片機時的數據格式:+IPD,
四、Android APP軟件設計
Android APP是借助Android Studio來開發的,界面比較清新。esp8266默認的IP地址是192.168.4.1,端口號是333。四個開關控制四路繼電器,其中長按開關的名字可以編輯開關名稱,APP界面截圖如下所示:
負責連接ESP8266的按鈕點擊回調方法:
/** * 連接按鈕點擊事件回調方法 * @param v */ @Override public void onClick(View v) { if(v.getId()==R.id.btn_connect){ if (mSocket == null || !mSocket.isConnected()) { new Thread(){ @Override public void run() { try { mSocket = new Socket("192.168.4.1", 333); out = new PrintStream(mSocket.getOutputStream()); runOnUiThread(new Runnable() { @Override public void run() { mBtnConnect.setText("斷開"); } }); new HeartBeatThread().start(); } catch (IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "連接失敗", Toast.LENGTH_SHORT).show(); } }); } } }.start(); } if (mSocket != null && mSocket.isConnected()) { try { mSocket.close(); mBtnConnect.setText("連接"); mSocket = null; } catch (IOException e) { e.printStackTrace(); mSocket = null; } } } }
滑動開關點擊回調方法,發送指令到單片機控制繼電器的開關:
/** * 滑動按鈕監聽事件,發送指令到單片機控制繼電器開關 * @param buttonView * @param isChecked */ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { switch (buttonView.getId()) { case R.id.switch1: if (isChecked) { //turn on Log.d(TAG, "onCheckedChanged: send1"); sendData("1"); } else { //turn off Log.d(TAG, "onCheckedChanged: send2"); sendData("2"); } break; case R.id.switch2: if (isChecked) { //turn on Log.d(TAG, "onCheckedChanged: send3"); sendData("3"); } else { //turn off Log.d(TAG, "onCheckedChanged: send4"); sendData("4"); } break; .... .... .... } } 編輯:hfy
-
繼電器
+關注
關注
132文章
5352瀏覽量
149042 -
單片機
+關注
關注
6037文章
44563瀏覽量
635869 -
開關控制
+關注
關注
1文章
113瀏覽量
23171
發布評論請先 登錄
相關推薦
評論