第9章Arduino-wifi-相關(guān)項(xiàng)目_第1頁
第9章Arduino-wifi-相關(guān)項(xiàng)目_第2頁
第9章Arduino-wifi-相關(guān)項(xiàng)目_第3頁
第9章Arduino-wifi-相關(guān)項(xiàng)目_第4頁
第9章Arduino-wifi-相關(guān)項(xiàng)目_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第九章:Arduinowifi相關(guān)項(xiàng)目目錄9.1ArduinoWiFi相關(guān)項(xiàng)目9.2Arduino與手機(jī)通訊調(diào)試項(xiàng)目9.1ArduinoWiFi相關(guān)項(xiàng)目9.1.1設(shè)計(jì)思想本節(jié)中我們將介紹如何基于Arduino控制板利用wifi模塊上傳周邊的溫度至服務(wù)器端,可以通過連接服務(wù)器的任一客戶端獲取。這樣,就算甚至在大洋彼岸的任何國家,都能查閱到自己親人身邊的溫度。同理,也可以利用多種類型的傳感器,查閱您需要的其他信息。9.1.2材料清單

本實(shí)驗(yàn)所用到的材料清單如表9-1所示。

表9-1材料清單利用Arduino和wifi將溫度傳送至云端,如圖9-1所示硬件實(shí)物圖。

圖9-1硬件實(shí)物圖1.工作原理如圖9-2所示。圖9-2工作原理圖2.實(shí)驗(yàn)分析

(1)設(shè)計(jì)實(shí)驗(yàn)原理圖:按照設(shè)計(jì)思路,畫出實(shí)驗(yàn)原理圖,如圖9-3所示。這是從前面某一講中抽取的一個(gè)圖,為了讀者查閱的方便,在這再次給出這個(gè)圖。但這個(gè)原理圖中,由于畫法的原因,還缺少Arduino的擴(kuò)展板和wifi模板。但利用傳感器LM35來采集數(shù)據(jù)的原理是一樣的。圖9-3實(shí)驗(yàn)原理圖(2)實(shí)物連接:按照原理圖,連接好電路,如圖9-4所

示。圖9-4實(shí)驗(yàn)連接圖

(3)wifi網(wǎng)絡(luò)連接:當(dāng)連接Arduino主板時(shí),就已經(jīng)可以收到wifi信號(hào)了,但是為了穩(wěn)定,最好用專用充電器連接Arduino擴(kuò)展板。你的電腦將會(huì)搜索到有wifi模塊發(fā)出的wifi信號(hào)HI_LINK_0021(或者HI_LINK_XXXX可參考第2講得內(nèi)容)。雙擊連接HI_LINK_0021wifi信號(hào)(默認(rèn)密碼12345678)。若不是第一次使用的,為了確保數(shù)據(jù)配置的正確性,需要將wifi模塊恢復(fù)出廠默認(rèn)設(shè)置(按住Arduino擴(kuò)展板上的RST按鈕6s,然后斷電重啟即可,具體也可參考第2講的內(nèi)容)。這一步相當(dāng)于咱們用打開手機(jī)的wifi信號(hào)上網(wǎng)一樣。此時(shí)的wifi模塊打開wifi信號(hào),連接手機(jī)的wifi熱點(diǎn)信號(hào)上網(wǎng)。

(4)建立wifi熱點(diǎn):由于本次實(shí)驗(yàn)環(huán)境沒有其他wifi,所以采用的是HTC手機(jī)建立wifi熱點(diǎn),用wifi路由器也是一樣的。打開手機(jī)的“WLAN熱點(diǎn)”,記住此時(shí)記得打開手機(jī)的3G網(wǎng)絡(luò)信號(hào),以便由溫度傳感器LM35采集的數(shù)據(jù)上傳至云端的服務(wù)器。本次實(shí)驗(yàn)WLAN熱點(diǎn)名稱“HTCtest”,密碼“12345678”。也可以用手機(jī)默認(rèn)的用戶名和密碼,不過,為了輸入的方便,可以更改手機(jī)默認(rèn)的用戶名和密碼。5)網(wǎng)絡(luò)數(shù)據(jù)配置:當(dāng)成功連接wifiHI_LINK_0021網(wǎng)絡(luò)后,打開瀏覽器,輸入地址54,輸入用戶名和密碼(均為admin)進(jìn)入數(shù)據(jù)配置,如圖9-5所示。圖9-5網(wǎng)絡(luò)數(shù)據(jù)配置注意紅色框框標(biāo)記部分,其他按默置即可。

幾點(diǎn)說明:(1)此時(shí)的wifi模塊相當(dāng)于一個(gè)采集輸送單元,將采集到的數(shù)據(jù)由wifi模塊送至服務(wù)器端;(2)

SSID和Password指的是手機(jī)(或wifi路由器)的SSID和Password;(3)

RemoteServerDomian/IP:指的是咱們要將采集到的溫度數(shù)據(jù)要存放的服務(wù)器IP地址;(4)

Locale/RemotePort:是訪問服務(wù)器的地址。(5)配置完成后,點(diǎn)擊“Apply”。這時(shí),再檢查手機(jī)的“WLAN熱點(diǎn)界面”最下方的“管理用戶處”,有“1連接的用戶”。此時(shí),表示wifi模塊已經(jīng)連接上了手機(jī)的熱點(diǎn),也即連接上了internet。(6)編寫Arduino代碼:voidsetup(){Serial.begin(115200);//設(shè)置串口波特率}voidloop(){intn=analogRead(A0);//定義A0口為接收電壓信號(hào)數(shù)據(jù)floatvol=n*(5.0/1023*100);//電壓信號(hào)數(shù)據(jù)溫度轉(zhuǎn)換upload_sensor(vol);//調(diào)用子函數(shù)delay(5000);}voidupload_sensor(floatvol){//sendtheHTTPPUTrequest:核心代碼charbuf[200];memset(buf,0,200);intret;ret=sprintf(buf,"GET/upload.php?uid=ycf&ps=ycf&sensor_name=Arduino&data=");//設(shè)置協(xié)議Serial.print(buf);//暫存至bufSerial.print(vol);//調(diào)用溫度數(shù)據(jù)volSerial.println("HTTP/1.1");//HTTP協(xié)議名稱Serial.println("Host:");//設(shè)置服務(wù)器地址Serial.println("Connection:close");//數(shù)據(jù)傳輸完畢,連接關(guān)閉Serial.println();}

將上述代碼下載到Arduino主板上,注意,在Arduino的擴(kuò)展板上有個(gè)開關(guān),在下載數(shù)據(jù)時(shí),請(qǐng)將撥至外側(cè)(O)。這是因?yàn)檫B接串口時(shí),有可能會(huì)影響數(shù)據(jù)的下載。同時(shí)打開串口,如圖9-6注意紅色的標(biāo)記。此時(shí)的環(huán)境溫度為25.90。然后這個(gè)溫度將通過wifi模塊連接手機(jī)熱點(diǎn)上的wifi信號(hào)上傳至服務(wù)器端。圖9-6Arduino串口監(jiān)視器數(shù)據(jù)示(7)終端數(shù)據(jù)采集:若前面6步全部成功,恭喜你!成功啦,由溫度傳感器LM35采集到的溫度數(shù)據(jù)已經(jīng)通過wifi模塊經(jīng)由手機(jī)wifi聯(lián)網(wǎng)成功,一路過關(guān)斬將,歷經(jīng)千辛萬苦,終于將溫度傳感器LM35采集到的溫度數(shù)據(jù)上傳至服務(wù)器端,如圖9-7所示。圖9-7服務(wù)端數(shù)據(jù)顯示比較圖

圖9-7服務(wù)器端數(shù)據(jù)顯示比較圖9-6(用Arduino自帶的串口顯示器)和圖9-6(云端服務(wù)器),會(huì)發(fā)現(xiàn),用Arduino自帶串口監(jiān)視器采集的溫度數(shù)據(jù)和云端服務(wù)器溫度數(shù)據(jù)是一致的,說明數(shù)據(jù)傳送成功。在下一講的內(nèi)容,咱們將接著下一步工作,將云端服務(wù)器的數(shù)據(jù)很好地展現(xiàn)給別人看。3.要點(diǎn)與總結(jié)(1)配置數(shù)據(jù)前,為確保數(shù)據(jù)能配置成功,請(qǐng)將wifi模塊恢復(fù)出廠設(shè)置;(2)注意配置數(shù)據(jù)的準(zhǔn)確性,尤其是關(guān)于手機(jī)和服務(wù)器端的IP地址設(shè)置;9.2Arduino與手機(jī)通訊調(diào)試項(xiàng)目9.2.1設(shè)計(jì)思想

想要通過Arduino實(shí)現(xiàn)與指定手機(jī)的通訊錄進(jìn)行信息交互有很多方法,nRF24L01的成本較低,但內(nèi)部需通過SPI通信,略顯復(fù)雜,而RF模塊又過于專用,接入其他系統(tǒng)時(shí)需要轉(zhuǎn)換,不方便。

ESP8266是樂鑫公司推出的廉價(jià)、但幾乎全能的WIFI芯片,被各種智能硬件廣泛使用,根據(jù)其datasheet,不但支持SPI,也可通過I2C、UART等方式進(jìn)行通信,尤其是UART,直接支持AT指令,大大簡(jiǎn)化開發(fā)難度,相當(dāng)便利。本項(xiàng)目通過使用ESP8266無線wifi模塊實(shí)現(xiàn)與手機(jī)進(jìn)行通信,完成相應(yīng)的任務(wù)。9.2.2材料清單本實(shí)驗(yàn)所用到的材料清單如表9-2所示。

表9-2材料清單1.ESP8266-14簡(jiǎn)介ESP8266-14是一款低成本W(wǎng)IFI-MCU通訊/控制模塊,內(nèi)置ESP8266WIFI通訊IC和STM8003單片機(jī),擁有業(yè)內(nèi)極富競(jìng)爭(zhēng)力的封裝尺寸和超低能耗技術(shù),可廣泛應(yīng)用于智能家居和物聯(lián)網(wǎng)網(wǎng)領(lǐng)域,用于將用戶的物理設(shè)備連接到Wi-Fi無線網(wǎng)絡(luò)上,進(jìn)行互聯(lián)網(wǎng)或局域網(wǎng)通信,實(shí)現(xiàn)聯(lián)網(wǎng)控制功能。

該模塊內(nèi)置了一個(gè)功能強(qiáng)大的STM8003的芯片,所有管腳全部接出來,其串口與ESP8266的串口相連,用戶可以編寫STM8程序,通過AT指令控制ESP8266的實(shí)現(xiàn)絕大部分智能燈家居和WIFI物聯(lián)網(wǎng)功能。ESP8266-14內(nèi)置ESP8266WIFI通訊IC和STM8003單片機(jī),可以繞過單片機(jī),直接通過串口使用ESP8266-14內(nèi)置的8266模塊,只是不能利用它的GPIO來作其他事情了,只能作為一個(gè)單純的串口WiFi使用,不過對(duì)于目前的應(yīng)用場(chǎng)景,也差不多了。第一步調(diào)試,需要知道這模塊從網(wǎng)上買來之后是否好用,那么一般需要用USB_TTL來接PC查看串口消息,不過Arduino可以使用軟串口,不過更直接的,可以使用Arduino當(dāng)作USBTTL來直連PC,是不是很方便呢?這樣就可以節(jié)省單獨(dú)購買USBTTL串口調(diào)試板的費(fèi)用了。是不是把Arduino的潛能開發(fā)出來了。

代碼很簡(jiǎn)單,就是把D0,D1端口中的內(nèi)置上拉電阻使能。

voidsetup(){

//putyoursetupcodehere,torunonce:

pinMode(0,INPUT_PULLUP);

pinMode(1,INPUT_PULLUP);

}

voidloop(){

//putyourmaincodehere,torunrepeatedly:}

然后把其他設(shè)備的TX,RX,GND接到Arduino板子上和USBTTL方法一樣。這樣,其他設(shè)備就可以直接通過串口與PC相連了。PC可以通過串口直接操作它了。Arduino只是作為USB串口的模塊存在。引腳圖如圖9-8所示。

在進(jìn)行USB_TTL上傳的時(shí)候,不要把TX,RX插到板子上。以免失敗。

圖9-8Esp8266引腳圖按此方式接線方式如圖9-9,接入ArduinoMega2560(或UNO)圖9-9接線方式8266TX(PD6)<->ArduinoTx08266RX(PD5)<->ArduinoRx08266ESP_VDD<->Arduino3.3V8266GND<->ArduinoGNDArduinoVIN<->電池7.4V

(為確保供電充足,不然USB口接電腦供電不足)ArduinoGND<->電池GND上面的插座是自己焊上去的,這個(gè)引腳不是標(biāo)準(zhǔn)的距離,比較費(fèi)事,需要把引腳掰彎之后焊接,如圖9-10所示。上步完成后,如果通過串口能獲取到信息,則證明芯片是好的。可以進(jìn)行下一步.這里可以手動(dòng)下一些AT命令對(duì)ESP8266進(jìn)行控制測(cè)試第二步接線方式與第一步的區(qū)別是,TX,RX要反著接,以便Arduino給8266發(fā)串口命令。圖9-10接線方式8266RX(PD5)<->ArduinoTx18266TX(PD6)<->ArduinoRx18266ESP_VDD<->Arduino3.3V8266GND<->ArduinoGNDArduinoVIN<->電池7.4V

(為確保供電充足,不然USB口接電腦供電不足)ArduinoGND<->電池GND

手機(jī)設(shè)置為便攜熱點(diǎn),如圖9-11所示(如果用8266作為熱點(diǎn),可能因?yàn)榭蛻舳藳]去連接它,而休眠,所以使用手機(jī)作為熱點(diǎn))圖9-11手機(jī)設(shè)置為便攜熱點(diǎn)

手機(jī)上安裝“網(wǎng)線調(diào)試助手”,安裝成功之后,在tcpserver選項(xiàng)下,點(diǎn)擊“配置”,彈出服務(wù)配置界面,默認(rèn)5000端口,點(diǎn)擊右邊的“激活”,激活成功會(huì)顯示手機(jī)的IP與端口,則在手機(jī)上創(chuàng)建了一個(gè)服務(wù),我手機(jī)的IP是:5000.

通過Arduino給8266發(fā)串口命令,使其連接手機(jī)#define

WIFISerial

Serial1

#define

_cell

Serial1

char

CMD_LEFT[]="LEFTOK";

char

CMD_RIGHT[]="RIGHTOK";

char

CMD_BACK[]="BACKOK";

char

CMD_FORWARD[]="FORWARDOK";

char

CMD_STOP[]="STOPOK";

int

chlID;

//client

id(0-4)

int

ReceiveMessage(char

*buf)

{

//+IPD,<len>:<data>

//+IPD,<id>,<len>:<data>

String

data

=

"";

if

(_cell.available()>0)

{

unsigned

long

start;

start

=

millis();

char

c0

=

_cell.read();

if

(c0

==

'+')

{

while

(millis()-start<5000)

{

if

(_cell.available()>0)

{

char

c

=

_cell.read();

data

+=

c;

}

if

(data.indexOf("OK")!=-1)

{

break;

}

}

//Serial.println(data);

int

sLen

=

strlen(data.c_str());

int

i,j;

for

(i

=

0;

i

<=

sLen;

i++)

{

if

(data

==

':')

{

break;

}

}

boolean

found

=

false;

for

(j

=

4;

j

<=

i;

j++)

{

if

(data[j]

==

',')

{

found

=

true;

break;

}

}

int

iSize;

//DBG(data);

//DBG("\r\n");

if(found

==true)

{

String

_id

=

data.substring(4,

j);

chlID

=

_id.toInt();

String

_size

=

data.substring(j+1,

i);

iSize

=

_size.toInt();

//DBG(_size);

String

str

=

data.substring(i+1,

i+1+iSize);

strcpy(buf,

str.c_str());

//DBG(str);

}

else

{

String

_size

=

data.substring(4,

i);

iSize

=

_size.toInt();

//DBG(iSize);

//DBG("\r\n");

String

str

=

data.substring(i+1,

i+1+iSize);

strcpy(buf,

str.c_str());

//DBG(str);

}

return

iSize;

}

}

return

0;

}

boolean

Send(String

str)

{

_cell.print("AT+CIPSEND=");

//

_cell.print("\"");

_cell.println(str.length());

//

_cell.println("\"");

unsigned

long

start;

start

=

millis();

bool

found;

while

(millis()-start<5000)

{

if(_cell.find(">")==true

)

{

found

=

true;

break;

}

}

if(found)

_cell.print(str);

else

{

//

closeMux();

return

false;

}

String

data;

start

=

millis();

while

(millis()-start<5000)

{

if(_cell.available()>0)

{

char

a

=_cell.read();

data=data+a;

}

if

(data.indexOf("SEND

OK")!=-1)

{

return

true;

}

}

return

false;

}

void

setup()

{

Serial.begin(115200);

Serial.println("Goodnight

moon!");

WIFISerial.begin(115200);

delay(1000);

WIFISerial.println("AT+RST");

delay(6000);

//

WIFISerial.println("AT+CIPMUX=1");

//

delay(3000);

//

WIFISerial.println("AT+CIPSESVER=1,1001");

WIFISerial.println("AT+CIPSTART=5000");

//

delay(2000);

WIFISerial.println("AT+CIPMODE=0");//

//

delay(2000);

//

WIFISerial.println("AT+CIPSEND");//

}

void

loop()

{

char

buf[500];

int

iLen

=

ReceiveMessage(buf);

if(iLen

>

0)

{

Serial.write(buf);

if(!strcmp(buf,CMD_LEFT)){

Serial.write("\r\nYes

Sir

Turn

Left.");

Send("left");

//

WIFISerial.write("\r\nYes

Sir

Turn

Left.");

}

else

if(!strcmp(buf,CMD_RIGHT)){

Serial.write("\r\nYes

Sir

Turn

right.");

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

else

if(!strcmp(buf,CMD_BACK)){

Serial.write("\r\nYes

Sir

back.");

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

else

if(!strcmp(buf,CMD_FORWARD)){

Serial.write("\r\nYes

Sir

forword.");

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

else

if(!strcmp(buf,CMD_FORWARD)){

Serial.write("\r\nYes

Sir

forword.");

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

else

if(!strcmp(buf,CMD_STOP)){

Serial.write("\r\nYes

Sir

stop.");

WIFISerial.write("\r\nYes

Sir

Turn

right.");

}

}

}手機(jī)上會(huì)顯示已有設(shè)備連接上了,如圖9-12所示。圖9-12顯示設(shè)備連接

連接好之后,輸入LEFTOK

會(huì)收到Arduino

通過

8266傳輸回來的left.完整代碼如下:#defineWIFISerialSerial1

#define_cellSerial1

charCMD_LEFT[]="LEFTOK";

charCMD_RIGHT[]="RIGHTOK";

charCMD_BACK[]="BACKOK";

charCMD_FORWARD[]="FORWARDOK";

charCMD_STOP[]="STOPOK";

intchlID;

//clientid(0-4)

intReceiveMessage(char*buf)

{

//+IPD,<len>:<data>

//+IPD,<id>,<len>:<data>

Stringdata="";

if(_cell.available()>0)

{

unsignedlongstart;

start=millis();

charc0=_cell.read();

if(c0=='+')

{

while(millis()-start<5000)

{

if(_cell.available()>0)

{

charc=_cell.read();

data+=c;

}

if(data.indexOf("OK")!=-1)

{

break;

}

}

//Serial.println(data);

intsLen=strlen(data.c_str());

inti,j;

for(i=0;i<=sLen;i++)

{

if(data

==':')

{

break;

}

}

booleanfound=false;

for(j=4;j<=i;j++)

{

if(data[j]==',')

{

found=true;

break;

}

}

intiSize;

//DBG(data);

//DBG("\r\n");

if(found==true)

{

String_id=data.substring(4,j);

chlID=_id.toInt();

String_size=data.substring(j+1,i);

iSize=_size.toInt();

//DBG(_size);

Stringstr=data.substring(i+1,i+1+iSize);

strcpy(buf,str.c_str());

//DBG(str);

}

else

{

String_size=data.substring(4,i);

iSize=_size.toInt();

//DBG(iSize);

//DBG("\r\n");

Stringstr=data.substring(i+1,i+1+iSize);

strcpy(buf,str.c_str());

//DBG(str);

}

returniSize;

}

}

return0;

}

booleanSend(Stringstr)

{

_cell.print("AT+CIPSEND=");

//

_cell.print("\"");

_cell.println(str.length());

//

_cell.println("\"");

unsignedlongstart;

start=millis();

boolfound;

while(millis()-start<5000){

if(_cell.find(">")==true)

{

found=true;

break;

}

}

if(found)

_cell.print(str);

else

{

//

closeMux();

returnfalse;

}

Stringdata;

start=millis();

while(millis()-start<5000){

if(_cell.available()>0)

{

chara=_cell.read();

data=data+a;

}

if(data.indexOf("SENDOK")!=-1)

{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論