在這個(gè)項(xiàng)目中,我們首先研究如何在 Arduino IDE 中安裝 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服務(wù)器。
ESP8266 之所以受歡迎,很大程度上是因?yàn)樗哂谐錾男詢r(jià)比。它還可以通過 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ǎng)絡(luò)的良好速度和穩(wěn)健性。更高的速度會(huì)導(dǎo)致更高的功耗,這使得 ESP8266 對(duì)于低功耗設(shè)計(jì)效率低下。
但是,ESP8266 在功耗不重要的情況下非常有用,例如不斷供電且不需要電池的設(shè)備。ESP8266 可以連接到任何 Wi-Fi 網(wǎng)絡(luò),并通過 TCP 和 UDP 等各種協(xié)議發(fā)送或接收數(shù)據(jù)。此外,它還可以構(gòu)建 Wi-Fi 熱點(diǎn)并管理其他設(shè)備。
電路設(shè)計(jì)注意事項(xiàng)
ESP8266 可能需要 250mA 的電流來傳輸數(shù)據(jù)。因此,如果我們想要有足夠的余量,我們可能需要至少 500mA 的電流來為 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
通過更新 URL,可以通過導(dǎo)航到 Tools-》Boards-》Boards Manager 來訪問 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。然后通過在 Arduino IDE 中設(shè)置適當(dāng)?shù)?COM 端口,可以通過點(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)建安全登錄頁面。使用 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 為空,代碼將繞過連接階段。
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í)分配
通過使用 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ū)域中可用的無線接入點(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ù)通過 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ù)包格式和操作語義。
接下來,“mdns.begin(‘esp8266’)”會(huì)導(dǎo)致一個(gè) mDNS 服務(wù)器被定義為 ESP8266 的名稱。如果一切正常,mdns.begin 函數(shù)返回 true,我們可以通過 server.begin() 啟動(dòng)服務(wù)器。
讀取 GET 請(qǐng)求
我們可以通過 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)求,但無法解釋它們或發(fā)送答案。
可以使用 client.print() 函數(shù)發(fā)送客戶端的答案。對(duì)于客戶端,為了將其視為網(wǎng)頁內(nèi)容(即在 Firefox 等瀏覽器中查看答案),答案應(yīng)為 HTML 格式。通過這種方式,我們可以使用我們的 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 頁面,用于回復(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ǎng)絡(luò)的密碼。最后,在連接到本地網(wǎng)絡(luò)后,GET 請(qǐng)求在設(shè)備和客戶端之間傳輸。
-
Web服務(wù)器
+關(guān)注
關(guān)注
0文章
138瀏覽量
24692 -
Arduino
+關(guān)注
關(guān)注
188文章
6485瀏覽量
189691 -
ESP8266
+關(guān)注
關(guān)注
50文章
963瀏覽量
46518
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
將ESP8266配置為帶有AT命令的Web服務(wù)器,AT命令回復(fù)HTTP GET出現(xiàn)錯(cuò)誤怎么解決?
使用EsP8266(NodeMCU)連接阿里云服務(wù)器
ESP8266 WEB智能小后臺(tái) ,采電壓,繪曲線,向服務(wù)器傳信息
ESP8266使Web服務(wù)器完全無響應(yīng)是怎么回事?
使用ESP8266作為Web服務(wù)器,如何將網(wǎng)頁上傳到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)頁高級(jí)遙控版)

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

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

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

評(píng)論