一、系統(tǒng)方案
手機(jī)APP通過(guò)ESP8266 WIFI模塊與51單片機(jī)通信控制四路繼電器。下位機(jī)由單片機(jī)、ESP8266模塊和繼電器模塊組成,上位機(jī)由Android手機(jī)APP承擔(dān)。我們?cè)贏PP上發(fā)送繼電器的開(kāi)關(guān)控制指令,ESP8266將收到的數(shù)據(jù)發(fā)送給單片機(jī),從而實(shí)現(xiàn)對(duì)繼電器進(jìn)行開(kāi)關(guān)控制。
二、硬件設(shè)計(jì)
ESP8266模塊作為一個(gè)透?jìng)髂K使用,RXD、TXD分別連接51單片機(jī)的TXD和RXD,VCC和EN管腳接3.3V電壓,GND接地,只需要連接這些管腳,ESP8266模塊就可以正常工作了。
單片機(jī)的P2^0,P2^1,P2^2,P2^3輸出高低電瓶控制四路繼電器,繼電器模塊是從網(wǎng)上購(gòu)買(mǎi)的已經(jīng)焊接好的模塊,其他地方為手工萬(wàn)用板焊接。
三、單片機(jī)軟件設(shè)計(jì)
單片機(jī)代碼主要是串口初始化、ESP8266的初始化和串口中斷。
1.串口和ESP8266初始化:
/** *發(fā)送單個(gè)字符 */ void sendChar(uchar a) { SBUF = a; while(TI==0); TI=0; } /** *發(fā)送字符串 */ void sendString(uchar *s) { while(*s!='\0') { sendChar(*s); s++; } } /** *初始化ESP8266模塊 */ void initEsp() { TMOD=0x20; //定時(shí)器1工作在方式2 TH1 = 0xfd; //波特率9600 TL1 = 0xfd; SM0=0; //串口工作在方式1 SM1=1; EA = 1; //開(kāi)總中斷 REN = 1; //使能串口 TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí) 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; //開(kāi)串口中斷 }
sendString("AT+CWMODE=2\r\n") ----- 單片機(jī)發(fā)送AT指令到ESP8266模塊,AT+CWMODE=2是將ESP8266設(shè)置為AP模式,\r\n是換行,因?yàn)锳T指令加換行才能生效。
sendString("AT+CIPMUX=1\r\n") ---- 允許多連接
sendString("AT+CIPSERVER=1\r\n") ---- 建立TCP Server
2. 串口中斷函數(shù),負(fù)責(zé)處理App發(fā)送給單片機(jī)的指令:
/** * 串口中斷函數(shù),負(fù)責(zé)處理App發(fā)送給單片機(jī)的指令 */ void uart() interrupt 4 { if(RI == 1) { RI = 0; //清除串口接收標(biāo)志位 receiveTable[i]=SBUF; if(receiveTable[0]=='+') { i++; } else { i=0; } if(i==10) { i=0; switch(receiveTable[9]) { case '1': //打開(kāi)繼電器 JDQ4=0; break; case '2': //關(guān)閉繼電器 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在收到數(shù)據(jù)并轉(zhuǎn)發(fā)給單片機(jī)時(shí)的數(shù)據(jù)格式:+IPD,
四、Android APP軟件設(shè)計(jì)
Android APP是借助Android Studio來(lái)開(kāi)發(fā)的,界面比較清新。esp8266默認(rèn)的IP地址是192.168.4.1,端口號(hào)是333。四個(gè)開(kāi)關(guān)控制四路繼電器,其中長(zhǎng)按開(kāi)關(guān)的名字可以編輯開(kāi)關(guān)名稱(chēng),APP界面截圖如下所示:
負(fù)責(zé)連接ESP8266的按鈕點(diǎn)擊回調(diào)方法:
/** * 連接按鈕點(diǎn)擊事件回調(diào)方法 * @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("斷開(kāi)"); } }); 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; } } } }
滑動(dòng)開(kāi)關(guān)點(diǎn)擊回調(diào)方法,發(fā)送指令到單片機(jī)控制繼電器的開(kāi)關(guān):
/** * 滑動(dòng)按鈕監(jiān)聽(tīng)事件,發(fā)送指令到單片機(jī)控制繼電器開(kāi)關(guān) * @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
-
繼電器
+關(guān)注
關(guān)注
133文章
5435瀏覽量
151350 -
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44973瀏覽量
649863 -
開(kāi)關(guān)控制
+關(guān)注
關(guān)注
1文章
116瀏覽量
23549
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)實(shí)例項(xiàng)目:ESP8266串口WIFI
ESP8266燒錄與機(jī)智云一鍵配網(wǎng)教程

STM32和ESP32應(yīng)該學(xué)哪個(gè)
把esp8266加入到c51單片機(jī)單通道程序怎么寫(xiě)
ESP8266 通過(guò) MQTT 協(xié)議實(shí)現(xiàn) LED 的遠(yuǎn)程控制

評(píng)論