在這個(gè)項(xiàng)目中,我們首先研究如何在 Arduino IDE 中安裝 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服務(wù)器。
ESP8266 之所以受歡迎,很大程度上是因?yàn)樗哂谐錾男詢r(jià)比。它還可以通過(guò) Wi-Fi 將互聯(lián)網(wǎng)連接到微處理器。
它的主要缺點(diǎn)是功耗。ESP8266 不是一款非常節(jié)能的芯片,因?yàn)樗脑O(shè)計(jì)符合大多數(shù)家庭和企業(yè)都可以使用的 IEEE 802.1 協(xié)議(我們稱之為 Wi-Fi)。該協(xié)議議程保證了創(chuàng)建無(wú)線本地網(wǎng)絡(luò)的良好速度和穩(wěn)健性。更高的速度會(huì)導(dǎo)致更高的功耗,這使得 ESP8266 對(duì)于低功耗設(shè)計(jì)效率低下。
但是,ESP8266 在功耗不重要的情況下非常有用,例如不斷供電且不需要電池的設(shè)備。ESP8266 可以連接到任何 Wi-Fi 網(wǎng)絡(luò),并通過(guò) TCP 和 UDP 等各種協(xié)議發(fā)送或接收數(shù)據(jù)。此外,它還可以構(gòu)建 Wi-Fi 熱點(diǎn)并管理其他設(shè)備。
電路設(shè)計(jì)注意事項(xiàng)
ESP8266 可能需要 250mA 的電流來(lái)傳輸數(shù)據(jù)。因此,如果我們想要有足夠的余量,我們可能需要至少 500mA 的電流來(lái)為 ESP8266 供電。使用從計(jì)算機(jī)獲取電源的 USB 電纜為 ESP8266 供電可能會(huì)導(dǎo)致不穩(wěn)定。
在這個(gè)項(xiàng)目中,我們使用保證 1A 電流的 5V 電源和 LM1086-3.3V 作為穩(wěn)壓器為 ESP8266 供電。在圖 1 中,顯示了在引導(dǎo)加載程序和使用模式下使用 ESP8266 的引腳配置。
?
圖 1.在引導(dǎo)加載程序和使用模式下使用 ESP8266。
Arduino 附加組件
安裝 ESP8266 插件在互聯(lián)網(wǎng)上的許多文章中都有描述,但為了清楚起見,我們將在這里簡(jiǎn)要介紹安裝。要安裝 ESP8266 插件,我們需要更新 Arduino IDE 中的板管理器??梢詮?File-》Preferences-》Additional Boards Manager URLs 添加一個(gè)額外的 Board Manager URL。在 URL 部分,應(yīng)輸入以下 URL,如圖 2 所示。
圖 2.其他董事會(huì)經(jīng)理 URL
通過(guò)更新 URL,可以通過(guò)導(dǎo)航到 Tools-》Boards-》Boards Manager 來(lái)訪問(wèn) ESP8266 插件。ESP8266 板可用,應(yīng)安裝。安裝后,在板部分,ESP8266 模塊將可用??梢赃x擇不同類型的模塊,并且出于本項(xiàng)目的目的(因?yàn)槲覀儤?gòu)建了我們正在使用的電路板),我們將使用通用 ESP8266 模塊。
將草圖上傳到 ESP8266
要對(duì) ESP8266 進(jìn)行編程,我們使用 ESP8266 已經(jīng)包含的 UART 引導(dǎo)加載程序。在這個(gè)項(xiàng)目中,我制作了一個(gè)簡(jiǎn)單的 ESP8266 開發(fā)板,原理圖如圖 3 和以下部件列表:
1. ESP8266-12(E或F不分大小,唯一區(qū)別是內(nèi)存)
2. 3.3K電阻 x 2
3. 470R 功率演示LED電阻
4. 一個(gè)LED決定板子是供電還是供電不是
5. AMS1117-3.3: 電壓調(diào)節(jié)器
6. 10uF-25v 電解電容
7. 22uF-25v 電解電容
8. 100nF 電容
10. 一個(gè)用于進(jìn)入引導(dǎo)加載程序的 2 針連接器
為了進(jìn)入啟動(dòng)模式,GPIO0 應(yīng)接地以啟動(dòng) ESP8266。然后通過(guò)在 Arduino IDE 中設(shè)置適當(dāng)?shù)?COM 端口,可以通過(guò)點(diǎn)擊上傳按鈕上傳草圖。編程完成后,GPIO0 應(yīng)該懸空,因?yàn)?ESP8266 應(yīng)該以正常模式啟動(dòng)并運(yùn)行程序。
圖 3. ESP8266-12E 開發(fā)板原理圖
連接到接入點(diǎn)
ESP8266 具有內(nèi)置 EEPROM,可用于存儲(chǔ)數(shù)據(jù)等應(yīng)用,以構(gòu)建安全登錄頁(yè)面。使用 EEPROM 很像其他 Arduino 板,但有一些細(xì)微差別。
一方面,您需要在開始讀取或?qū)懭胫罢{(diào)用 EEPROM.begin(size)。大小是您要使用的字節(jié)數(shù),介于 4 到 4096 字節(jié)之間。請(qǐng)注意,EEPROM.write() 不會(huì)立即寫入閃存。每當(dāng)您希望將更改保存到閃存時(shí),都必須調(diào)用 EEPROM.commit()。
在這個(gè)項(xiàng)目中,我們想要制作一個(gè)可配置的 Web 服務(wù)器,它可以放置在每個(gè)網(wǎng)絡(luò)中(即,在沒有 SSID 和接入點(diǎn)連接密碼的新網(wǎng)絡(luò)中)以與之前的設(shè)置進(jìn)行連接。當(dāng)連接失敗時(shí),ESP8266 將進(jìn)入接入點(diǎn)模式并等待接收配置設(shè)置(SSID 和密碼)。
一開始,我們獲取 512 字節(jié)的 EEPROM 并檢查用戶名或密碼是否可用。我們還可以為我們的設(shè)備選擇一個(gè)特定的 IP 地址并手動(dòng)設(shè)置,需要存儲(chǔ)在 EEPROM 中。當(dāng)我們需要?jiǎng)?chuàng)建設(shè)備數(shù)據(jù)庫(kù)以了解其位置和定義時(shí),手動(dòng)設(shè)置設(shè)備 IP 很有用。
在下面的完整代碼片段中,我們從 EEPROM 中保留 512 個(gè)字節(jié),然后在收集信息后,我們嘗試連接到接入點(diǎn)。在完整的代碼中,如果 EEPROM 為空,代碼將繞過(guò)連接階段。
EEPROM.begin(512);
IPAddress ipad(192, 168, 1, eip.toInt());
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
WiFi.begin(esid.c_str(), epass.c_str());
WiFi.config(ipad, gateway, subnet);
上面的代碼嘗試使用存儲(chǔ)在 EEPROM 中的特定 IP 地址連接到網(wǎng)絡(luò)。使用特定 IP 地址時(shí)要記住的一件事是,我們需要知道網(wǎng)關(guān) IP 地址以及網(wǎng)絡(luò)子網(wǎng)掩碼。另一方面,上述項(xiàng)目對(duì)于需要 DHCP 服務(wù)器的自動(dòng) IP 尋址不是必需的。
可以使用 WiFi.status() 函數(shù)檢查 Wi-Fi 狀態(tài)。根據(jù) Arduino 網(wǎng)站,此函數(shù)返回以下內(nèi)容:
WL_CONNECTED:連接到 Wi-Fi 網(wǎng)絡(luò)時(shí)分配
WL_NO_SHIELD:在沒有 Wi-Fi 屏蔽時(shí)分配
WL_IDLE_STATUS:在調(diào)用 WiFi.begin() 時(shí)分配的臨時(shí)狀態(tài),并保持活動(dòng)狀態(tài),直到嘗試次數(shù)到期(導(dǎo)致 WL_CONNECT_FAILED)或建立連接(導(dǎo)致 WL_CONNECTED)
WL_NO_SSID_AVAIL:當(dāng)沒有可用的 SSID 時(shí)分配
WL_SCAN_COMPLETED:掃描網(wǎng)絡(luò)完成時(shí)分配
WL_CONNECT_FAILED:在所有嘗試連接失敗時(shí)分配
WL_CONNECTION_LOST:連接丟失時(shí)分配
WL_DISCONNECTED:從網(wǎng)絡(luò)斷開時(shí)分配
通過(guò)使用 WiFi.status() 函數(shù),我們可以檢查連接狀態(tài),如果不存在,ESP8266 應(yīng)該轉(zhuǎn)向接入點(diǎn)。
可以使用 WiFi.mode(WIFI_AP) 進(jìn)行接入點(diǎn)配置,這需要用戶名和密碼??梢允褂?WiFi.softAP 函數(shù)設(shè)置用戶名和密碼。描述每一個(gè) Wi-Fi 功能會(huì)使這篇文章變得非常長(zhǎng),并且超出了本項(xiàng)目的范圍。但是,熱心的人可以在GitHub和Arduino 網(wǎng)站上找到有關(guān) ESP6288 的 Wi-Fi 功能和其他庫(kù)的非常全面的文檔。
在這個(gè)項(xiàng)目中,我們希望將我們的設(shè)備連接到現(xiàn)有網(wǎng)絡(luò)。首先,當(dāng)我們的設(shè)備沒有連接網(wǎng)絡(luò)的SSID和密碼時(shí),它會(huì)進(jìn)入接入點(diǎn)模式,然后我們可以對(duì)其進(jìn)行配置。配置完成后,設(shè)備可以連接到所需的網(wǎng)絡(luò)。另一方面,有人可能只想在接入點(diǎn)模式下使用 ESP8266。在這種情況下,我們需要在要傳輸數(shù)據(jù)時(shí)連接到設(shè)備。
因此,在接入點(diǎn)模式下,ESP8266 將等待一組新的配置??梢允褂梅祷卣麛?shù)的 WiFi.scanNetworks 掃描該區(qū)域中可用的無(wú)線接入點(diǎn),以確定現(xiàn)有的接入點(diǎn)。收集可用網(wǎng)絡(luò)的數(shù)量后,以下功能可以為您提供所需的所有信息:
WiFi.SSID:獲取當(dāng)前網(wǎng)絡(luò)的SSID
WiFi.RSSI:獲取與路由器連接的信號(hào)強(qiáng)度
WiFi.encryptionType:獲取當(dāng)前網(wǎng)絡(luò)的加密類型
圖 4 顯示了 WiFi.scanNetworks 的輸出。數(shù)據(jù)通過(guò) RS232 通信和名為TeraTerm的程序捕獲 。
圖 4.掃描網(wǎng)絡(luò)
移動(dòng)DNS
使用預(yù)建庫(kù)很容易在 ESP8266 上創(chuàng)建 Web 服務(wù)器。此外,可以使用 ESP8266mDNS 庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的多播域名系統(tǒng) (mDNS),將名稱鏈接到網(wǎng)絡(luò)中的服務(wù)器 IP。mDNS 將主機(jī)名解析為缺少本地名稱服務(wù)器的小型網(wǎng)絡(luò)中的 IP 地址。它使用與單播 DNS 相同的編程接口、數(shù)據(jù)包格式和操作語(yǔ)義。
接下來(lái),“mdns.begin(‘esp8266’)”會(huì)導(dǎo)致一個(gè) mDNS 服務(wù)器被定義為 ESP8266 的名稱。如果一切正常,mdns.begin 函數(shù)返回 true,我們可以通過(guò) server.begin() 啟動(dòng)服務(wù)器。
讀取 GET 請(qǐng)求
我們可以通過(guò) mdns.update() 更新 mDNS 查詢,然后作為客戶端讀取請(qǐng)求。下面的代碼首先更新 mDNS 查詢,然后,如果數(shù)據(jù)包可用,則讀取它。
mdns.update();
WiFiClient client = server.available();
if (!client) {
return(20);
}
String req = client.readStringUntil('\r');
// Wait for data from client to become available
if(client.connected() && !client.available()){
return(20);
}
在上面的代碼中,ESP8266 檢查是否有任何客戶端可用。如果客戶端可用,它將讀取其數(shù)據(jù),直到它收到‘\r’,這意味著數(shù)據(jù)包的結(jié)束。從那時(shí)起,我們的 Web 服務(wù)器可以接收 GET 請(qǐng)求,但無(wú)法解釋它們或發(fā)送答案。
可以使用 client.print() 函數(shù)發(fā)送客戶端的答案。對(duì)于客戶端,為了將其視為網(wǎng)頁(yè)內(nèi)容(即在 Firefox 等瀏覽器中查看答案),答案應(yīng)為 HTML 格式。通過(guò)這種方式,我們可以使用我們的 ESP8266 創(chuàng)建一個(gè)圖形化的 HTML Web 服務(wù)器。
在上面的代碼中,我們讀取客戶端 GET 請(qǐng)求并將其存儲(chǔ)在“req”變量中?!畆eq’ 變量現(xiàn)在有 GET 數(shù)據(jù),我們可以簡(jiǎn)單地解釋它。根據(jù)客戶端的 GET 請(qǐng)求,我們應(yīng)該創(chuàng)建一個(gè)字符串,并使用 client.print() 函數(shù)生成客戶端答案。下面的代碼片段生成一個(gè)簡(jiǎn)單的 HTML 頁(yè)面,用于回復(fù)客戶。
s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n
ALL ABOUT CIRCUITS!"; s += "
"; s += "\r\n\r\n"; client.print(s);
在片段中,“200”命令已發(fā)送到客戶端。
結(jié)論
在這個(gè)項(xiàng)目中,我們檢查了用于創(chuàng)建簡(jiǎn)單 Web 服務(wù)器的 ESP8266 庫(kù)。然后,創(chuàng)建了一個(gè)可配置的 Web 服務(wù)器,該服務(wù)器采用 SSID 和所需無(wú)線網(wǎng)絡(luò)的密碼。最后,在連接到本地網(wǎng)絡(luò)后,GET 請(qǐng)求在設(shè)備和客戶端之間傳輸。
-
Web服務(wù)器
+關(guān)注
關(guān)注
0文章
138瀏覽量
24851 -
Arduino
+關(guān)注
關(guān)注
190文章
6497瀏覽量
192019 -
ESP8266
+關(guān)注
關(guān)注
51文章
965瀏覽量
47371
發(fā)布評(píng)論請(qǐng)先 登錄
將ESP8266配置為帶有AT命令的Web服務(wù)器,AT命令回復(fù)HTTP GET出現(xiàn)錯(cuò)誤怎么解決?
使用EsP8266(NodeMCU)連接阿里云服務(wù)器
ESP8266 WEB智能小后臺(tái) ,采電壓,繪曲線,向服務(wù)器傳信息
ESP8266使Web服務(wù)器完全無(wú)響應(yīng)是怎么回事?
使用ESP8266作為Web服務(wù)器,如何將網(wǎng)頁(yè)上傳到SPIFFS?
如何建立一個(gè)帶Arduino IDE的ESP8266 Web服務(wù)器

Esp8266(NodeMCU)連接阿里云服務(wù)器

調(diào)用Lua新建的WEB服務(wù)器 操作Nodemcu esp8266 控制繼電器實(shí)現(xiàn)物聯(lián)網(wǎng)

esp8266作為web服務(wù)器的實(shí)現(xiàn)

最簡(jiǎn)單DIY基于ESP8266的物聯(lián)網(wǎng)智能小車②(webserver服務(wù)器網(wǎng)頁(yè)高級(jí)遙控版)

通過(guò)使用ESP8266 NodeMCU Web服務(wù)器來(lái)控制的電子元件

NodeMCU ESP8266啟用AJAX的Web服務(wù)器

基于ESP8266的Web服務(wù)器
基于ESP8266實(shí)現(xiàn)串口服務(wù)器

評(píng)論