玩
WiFi 控制
微
微
控
控
智
智
學
學
創
創
新
新
認識 ESP8266 WiFi 模組
建構 ESP8266 開發環境
Wi-Fi 硬體調配
Wi-Fi 遙控
Wi-Fi 遙測
本章習作
認識
ESP8266 WiFi 模組
11-1
微微微控控控智智智學學學創創創新新新Wi-Fi 是近年來火紅的無線通信技術,更是主載物聯網(Internet of
Things, IoT)的重要關鍵元素。即便如此,應用這項技術所需的費用並
不高,我們可以很容易結合各式感測器,如溫度感測器、濕度感測器、 CCD、近場感應裝置(Near Field Communication, NFC)、射頻識別(Radio-frequency
identification, RFID)等,將所量測的資料,透過 Wi-Fi 模組傳輸到無線網路基地台
(Access Point, AP 或 Wireless Access Point, WAP)與網際網路(Internet,現在逐漸改稱為
互連網)連結,然後在雲端處理與儲存這些資料,而我們可在雲端建立自己的網站。如 果 要 建 立 網 站 的 話 , 可 應 用 免 費 的 網 頁 空 間 , 也 有 專 用 的 資 料 記 錄 網 頁( 如 thingspeak.com等)可直接申請,免費的哦!如圖1 所示為物連網或智慧家庭的概念。 圖1 ArduinoUno 板建構的物連網或智慧家庭之概念 若要Wi-Fi 流行,必須有密密麻麻的無線網路基地台,包括公家的或私人的,以 連結到Internet,這麼一來,不但人跟人連在一起,物件與物件也都連接在一起,就很 容易打造一個物連網環境。況且,現在幾乎家家都有自己的無線網路,就是Wi-Fi。
在圖1 裡,以 Arduino Uno 板為中心,在 Arduino 裡開發相關控制程式,並連接 外部感測器、Wi-Fi 卡、顯示裝置等。經過本書前十章的練習,對於 Arduino Uno 板的
應用。應熟能生巧,因此,可很容易建構圖 1 的概念。當然,我們也可透過同樣的路
徑,反向由雲端(網站)下指令或提供終端微處理器所需要的資料或指令。不過,Arduino Uno 板有點大,什麼事都透過 Arduino Uno 板,也不是很聰明!在本單元裡,就是要 將Arduino Uno板幹掉!讓Wi-Fi 模組獨當一面,如圖 2 所示。
圖2 不用ArduinoUno 板建構的物連網概念
Arduino 厲害的地方,在於「有容乃大」,在Arduino IDE 環境裡,不但可以開發 Arduino 微控板的軟硬體,也可提供特定晶片的開發環境。更好玩的是,用法與開發幾 乎和Arduino 微控板完全一樣!實際上,Wi-Fi 模組上,就有一顆微控器,幾乎可完全 取代Arduino 微控板!
ESP8266 模組是一系列閃閃發亮的 Wi-Fi 模組,從此 Wi-Fi 模組變成人人可 玩的平民玩具,更是 Maker 族的新寵!ESP8266 系列是 Espressif Systems公司 (樂鑫訊息科技公司)的 32 位元微控器(SoC 嵌入式系統微處理機),如圖 3 所示, 其功能強大(包含 Wi-Fi 功能)、價格便宜,CP 極高。
如圖 3 所示,這是一顆 32 支接腳的微控器晶片,其特性如下: 低功率32位元微控器 內建10位元ADC 內建TCP/IP通信協定堆疊 符合802.11 b/g/n通信協定 內建TR switch、balun、LNA、功率放大器與matching network 內建PLL、穩壓電路與電源管理器 支援多樣性天線 WiFi 2.4 GHz,並支援WPA/WPA2加密 支援STA/AP/STA+AP操作模式 支援Android及iOS的智慧型連結功能
提供SDIO 2.0、(H) SPI、UART、I2C、I2S、IR Remote Control、PWM與 GPIO介面功能
提供STBC、1x1 MIMO、2x1 MIMO
提供A-MPDU、A-MSDU aggregation與0.4s guard interval
沉睡(Deep sleep)模式時,電流小於10uA,功率下降(Power down)模式時, 電流小於10uA 喚醒與傳輸封包時電流小於2mA 待命狀態之功耗小於1.0mW (DTIM3) 在802.11b 模式下,輸出功率+20 dBm 操作溫度範圍-40℃~ 125℃
符合FCC、CE、TELEC、WiFi Alliance 及 SRRC 認證 ESP8266 晶片常應用於下列項目: 家電(Home Appliances) 家庭自動化(Home Automation) 智慧型插座與燈具(Smart Plug and lights) 網路(Mesh Network)
工業無線控制(Industrial Wireless Control) 兒童監視(Baby Monitors)
IP 監視器(IP Cameras)
穿戴式電子裝置(Wearable Electronics)
Wi-Fi 位置感知裝置(Wi-Fi Location-aware Devices) 保全識別標籤(Security ID Tags)
Wi-Fi 位置系統導航(Wi-Fi Position System Beacons)而採用 ESP8266 晶片的 Wi-Fi 模組,獨樹一格,兼具好用與便宜的特色,發 展出一系列的 ESP Wi-Fi 模組,從 ESP-01 到 ESP-12 等,如表 1 所示,未來還有 可能會有 ESP-13、ESP-14、ESP-15 等,讓我們拭目以待。在此僅介紹常見的 ESP-01、ESP-12 與 ESP-12E。
表1 ESP8266 系列 Wi-Fi 模組
模組 腳數 腳距 形式 LED 天線 天線座 Shielded 尺寸
ESP-01 8 2.54mm 2*4 DIL Yes Etched-on PCB No No 14.3x24.8 ESP-02 8 2.54mm 2*4notch No None Yes No 14.2x14.2 ESP-03 14 2mm 2*7notch No Ceramic No No 17.3x12.1 ESP-04 14 2mm 2*7notch No None No No 14.7x12.1 ESP-05 5 2.54mm 1*5 SIL No None Yes No 14.2x14.2 ESP-06 12+GND misc 4*3 dice No None No Yes NA
ESP-07 16 2mm 2*8 pinhole Yes Ceramic Yes Yes 20.0x16.0 ESP-08 14 2mm 2*7 notch No None No Yes 17.0x16.0 ESP-09 12+GND misc 4*3 dice No None No No 10.0x10.0 ESP-10 5 2mm 1*5 notch No None No No 14.2x10.0 ESP-11 8 1.27mm 1*8 pinhole No Ceramic No No 17.3x12.1 ESP-12 16 2mm 2*8 notch Yes Etched-on PCB No Yes 24.0x16.0 ESP-12E 22 2mm 2*8 notch Yes Etched-on PCB No Yes 24.0x16.0
ESP-01 可說是便宜又大碗的 Wi-Fi 模組,如圖 4 所示,左圖為其相片,右圖為 其接腳配置,這款Wi-Fi 模組非常簡潔,特別適用於入門者使用 Arduino 板。
在ESP-01 裡,只接出 8 支接腳,其中 VCC 為電源接腳、GND 為接地接腳,在 此要特別注意,ESP-01 使用+3.3V,千萬不要弄錯,以免故障。其他 6 支接腳如 下說明: RST 接腳為重置(RESET)接腳,當輸入低態時,ESP-01 將進入重置狀態。通 常是將此接腳接到VCC(或串接 4.7KΩ電阻接到 VCC),則 ESP-01 將處於 正常工作狀態。若想在送電瞬間進入重置狀態(上電重置 Power On Reset, POR),之後才進入正常工作狀態,則可串接一組 RC 電路。當然,也可在 電容器兩端並接一個按鈕開關,以做為手動重置之用,如圖5 所示。 圖5 重置接腳之連接
CH_PD 腳為功率下降模式(Power Down Mode)觸發接腳,此接腳也是低態動 作接腳。當CH_PD 接腳為低態時,ESP-01 進入功率下降模式(不工作);當 CH_PD 接腳為高態時,則 ESP-01 正常運作。因此,CH_PD 接腳又稱為致 能(Enable, EN)接腳。當然,此接腳不可空接,最好是連接到 VCC,或串接 電阻器(4.7KΩ即可)到 VCC。 RxD 與 TxD 接腳分別為 ESP-01 之接收接腳與傳輸接腳,也就是萬用串列埠 接 腳(UART) , 預 設 的 預 設 鮑 率 隨 韌 體 而 不 同 , 可 能 是 9,600bps 或 115,200bps,一定要先確認。不管怎樣,RxD 接腳連接微控器 mcu (或 PC/NB) 的TxD 接腳,TxD 接腳連接 mcu(或 PC/NB)的 RxD 接腳。
GPIO0 與 GPIO2 接腳為 ESP8266 晶片的一般用途輸出入埠,可在 ESP8266 晶片的開發系統,如ESPlorer 或 Arduino IDE 外掛的第三方(3rd Party)系統
裡,使用其程式語言撰寫程式來驅動這兩個輸出入埠。也可只把 ESP8266
模組的韌體時,GPIO0 接腳必須為低態。
ESP-12 Wi-Fi 模組也是以 ESP8266 為核心,但比 ESP-01 進階,接腳也變多了! 基本上,ESP-12 的接腳大多是多工接腳,也就是同一支接腳具有多重功能,如 圖6 所示為 ESP-12 Wi-Fi 模組的接腳圖。 圖6 ESP-12 Wi-Fi 模組 其中的VCC 為電源接腳(+3.3V)、GND 為接地接腳,其餘接腳如下說明: RESET 接腳為重置接腳,與 ESP-01 的 RST 接腳一樣。 ADC 接腳為類比輸入接腳,內建一個 10 位元的類比/數位轉換器(ADC)。 CH_PD 接腳為功率下降模式觸發接腳,與 ESP-012 的 CH_PD 接腳一樣。 GPIO16、GPIO14、GPIO12、GPIO13、GPIO15、GPIO2、GPIO0、GPIO4、 GPIO5、GPIO3、GPIO4 等接腳為一般用途輸出入埠。可在 ESP8266 晶片的 開發系統裡,使用其程式語言撰寫程式來驅動這些輸出入埠,在此不直接操 作這些輸出入埠。同樣的,若要更新ESP-12 模組的韌體,或寫入使用者韌 體時,GPIO0 接腳必須為低態。 除了一般用途的輸出入埠外,還可用於三種不同的串列通信介面,如下說明: UART:若要使用 UART 通信介面,則 GPIO1 接腳可用做 TxD 接腳(傳輸接
腳),GPIO2 接腳可用做 RxD 接腳(接收接腳)。若要採用硬體交握,則可以 GPIO15 接腳為 RTS 接腳、GPIO13 接腳為 CTS 接腳。
SPI(Serial Peripheral Interface):若要使用 SPI 通信介面,則 GPIO15 接腳可 用做CS 接腳(或稱為 SS 接腳),GPIO14 接腳可用做 SCK 接腳,GPIO12 接 腳可用做MISO 接腳,GPIO13 接腳可用做 MOSI 接腳。
SCL 接腳(串列時脈接腳),GPIO4 接腳可用做 SDA 接腳(串列資料接腳)。 如 圖 7 所示為 ESP-12 Wi-Fi 模組的基本應用電路,包括重置電路,而通 信 介 面 採 用 最 簡 單 的 UART 與其他微控器(或 PC/NB)連接。
圖7 ESP-12 Wi-Fi 模組之應用(採 UART 介面) 若要採用SPI 通信介面,以 Arduino Uno 板為例,則
GPIO15 接腳(CS 接腳)連接 Arduino Uno 板的第 10 腳。 GPIO14 接腳(SCK 接腳)連接 Arduino Uno 板的第 13 腳。 GPIO12 接腳(MISO 接腳)連接 Arduino Uno 板的第 12 腳。 GPIO13 接腳 (MOSI 接腳)連接 Arduino Uno 板的第 11 腳。
圖8 ESP-12e Wi-Fi 模組
其中TxD0 就是 TxD、RxD0 就是 RxD,而兩塊板子的 GPIO4 與 GPIO5 腳位剛 好對調,其他都與ESP-12 Wi-Fi 模組一樣。 基本上,ESP8266 就是一個 32 位元的微控器,可以獨立運作,有其專屬的開 發系統,也可以應用 Arduino 微控板來開發,或直接在 PC/NB 上應用 AT 命令來 測試。如表2 所示為 ESP8266 的 AT 命令,若要測試或設定 ESP8266 模組,必須 應用UART 埠,在相同的鮑率下,即可於其所連接的微控板或直接在 PC/NB 上,
應用AT 命令透過 USB-UART 線來操作 ESP8266 模組,例如可使用「AT+GMR」 命令查詢該Wi-Fi 模組的韌體版本等。 在網路上,有人為了操作AT 命令,刻意將 ESP8266 模組改燒錄舊版韌體, 這可不是更新韌體,而是更舊韌體。似乎是削足適履,導致後續無法開發使用者 韌體時,得不償失。新版韌體之鮑率為 115,200bps,而舊版韌體之鮑率為 9,600bps。 在此建議,保持 ESP8266 模組之原版韌體(即較新版本),不要燒錄舊版韌體,走 回頭路。 表2 ESP8266 的 AT 命令 功 能 AT 命 令 反 應 工作中 AT OK
重啟 AT+RST OK [System Ready, Vendor:www.ai-thinker.com]
查詢韌體版本 AT+GMR AT+GMR 0018000902 OK 搜尋AP AT+CWLAP AT+CWLAP +CWLAP:(4,"RochefortSurLac",-38,"70:62:b8:6f:6d:58",1) +CWLAP:(4,"LiliPad2.4",-83,"f8:7b:8c:1e:7c:6d",1) OK 加入AP AT+CWJAP? AT+CWJAP="SSID","Password"
Query AT+CWJAP? +CWJAP:"RochefortSurLac" OK
退出AP AT+CWQAP=? AT+CWQAP Query OK 取得IP AT+CIFSR AT+CIFSR 192.168.0.105 OK 設定AP 參數 AT+ CWSAP?
AT+ CWSAP= <ssid>,<pwd>,<chl>, <ecn> Query ssid, pwd chl = 通道, ecn = 加密 WiFi 模式 AT+CWMODE? AT+CWMODE=1 AT+CWMODE=2 AT+CWMODE=3 Query STA AP BOTH 設定TCP 或 UDP 連線 AT+CIPSTART=? (CIPMUX=0) AT+CIPSTART = <type>,<addr>,<port> Query
功 能 AT 命 令 反 應
(CIPMUX=1) AT+CIPSTART= <id><type>,<addr>, <port> TCP 或 UDP 連線 AT+ CIPMUX?
AT+ CIPMUX=0 AT+ CIPMUX=1 Query Single Multiple 檢查加入裝置之IP AT+CWLIF
TCP 或 UDP 連線狀況 AT+CIPSTATUS AT+CIPSTATUS? no this fun 傳出TCP 或 UDP 資料 (CIPMUX=0) AT+CIPSEND=<length>
(CIPMUX=1) AT+CIPSEND= <id>,<length>
關閉TCP 或 UDP 連線 AT+CIPCLOSE=<id> or AT+CIPCLOSE
設定為伺服器 AT+ CIPSERVER= <mode>[,<port>] mode 0 to close server mode; mode 1 to open; port = port 設定伺服器超時 (timeout) AT+CIPSTO? AT+CIPSTO=<time> Query <time>0~28800 in seconds 設定鮑率 AT+CIOBAUD? Supported: 9600, 19200, 38400, 74880, 115200, 230400, 460800, 921600
Query AT+CIOBAUD? +CIOBAUD:9600 OK
檢察IP AT+CIFSR AT+CIFSR 192.168.0.106
OK 韌體版本更新
(由雲端)
AT+CIUPDATE 1. +CIPUPDATE:1 found server 2. +CIPUPDATE:2 connect server 3. +CIPUPDATE:3 got edition 4. +CIPUPDATE:4 start update
接收資料 +IPD (CIPMUX=0): + IPD, <len>: (CIPMUX=1): + IPD, <id>, <len>: <data>
啟用看門狗 AT+CSYSWDTENABLE Watchdog, auto restart when program errors occur: enable 停用看門狗 AT+CSYSWDTDISABLE Watchdog, auto restart when program errors occur: disable
雖然可直接透過 AT 命令操作 ESP8266 模組,但太麻煩了,也不容易完成一
個完整功能的韌體。最好是直接在整合開發環境(如 Arduino IDE)下,設計控制程 式,就像在開發Ardunio 軟體一樣。
不管怎樣,都還是要透過 ESP8266 模組的 UART 埠,來操作 ESP8266 模組, 與 Arduino 微控板的操作完全一樣。只是 Arduino 微控板內建 USB-UART 橋接晶 片,但我們幾乎感覺不到它的存在。對於 ESP8266 模組,就需要額外的 USB-UART 線,而在KTM-600 多功能開發平台裡就附有一條 USB-UART 線,如圖 9 所示。 這條 USB-UART 線一端為 USB 頭,直接插入 PC/NB 的 USB 埠即可。另一頭
有四條線,分別是紅、黑、白、綠,這是一項共同遵守的標準,其中紅色線為 Vbus,
由 PC/NB 端提供+5V 電源、黑色線為 GND,也就是接地線、白色線為 USB-UART 線的接收線(RxD),應連接到 ESP8266 模組的傳出端(TxD)、綠色線為 USB-UART
線的傳出線(TxD),應連接到 ESP8266 模組的接收端(RxD)。
圖9 USB-UART 線(PL2303 系列晶片)
當第一次將USB-UART 線的 USB 頭插入 PC/NB 的 USB 埠時,若 PC/NB 沒有 驅動程式時,將會要求安裝驅動程式,我們可在網路上搜尋與下載其驅動程式,而 在本書光碟裡也有提供(PL2303_Prolific_DriverInstaller_v1_12_0.zip)。
圖10 已安裝驅動程式
理員裡看到此裝置,如圖10 所示,其中 USB-TTL 轉換器串列埠配置為 COM6(每 台電腦不同)。稍後連線時,就要以此串列埠來連接 ESP-12 模組。
建構
ESP8266 開發環境
11-2
微微微控控控智智智學學學創創創新新新由於本書都是在Arduino IDE V1.6.8 版操作,在此也將以 Arduino IDE V1.6.8 版為例,介紹如何建構ESP8266 開發環境。當然,Arduino IDE 的版本差異不大。
設定下載網址:在Arduino IDE V1.6.8 版裡,啟動檔案偏好設定命令, 開啟如圖11 所示之偏好設定對話盒。在額外的板子管理員網址欄位裡, 輸入 http://arduino.esp8266.com/stable/package_esp8266com_index.json,
再按 鈕關閉對話盒。
安 裝 板 子: 啟 動工 具板 子板 子 管 理 員命 令 , 開 啟板 子 管 理 員 對 話 盒 , 如 圖 12 所示。 圖12 板子管理員-1 圖13 板子管理員-2 在板 子 管 理 員對 話 盒 裡 , 往 下 找 到 並 選 取 esp8266 by ESP8266 Community 選 項 , 如 圖 14 所示。在其右下欄位裡選取最新的版 本 , 再 按 鈕 即 進 行 安 裝 。 安 裝 完 成 後 , 按 鈕 關 閉 對
話 盒 即 可 。
指 定 板 子: 此 後 若 要 在 此 Arduino IDE 環境裡開發程式時,必須 指 定 要 開 發 什 麼 板 子 ? 例 如 要 開 發 Arduino Uno 板時,就得指定
Arduino /Genuino Uno 項 ; 若 要 開 發 ESP8266 板 時 , 可 指 定 Generic ESP8266 Module 項。指定板子的方法是啟動工 具板 子
命 令 拉 出 選 單 , 選 取 Generic ESP8266 Module項 即 可 。 而 此 板 子 的 相 關 屬 性 也 會 列 在工 具板 子命 令 拉 出 選 單 裡,如 圖 14 所 示 , 以 供 參 考 與 設 定 。 圖14 板子屬性選項 指 定 序 列 埠:確 實 將 USB-UART 線插入 PC/NB 的 USB 埠,並自 動 產 生 一 個 串 列 埠 , 例 如 COM6。然後啟動工 具序 列 埠命 令 拉 出 選 單 , 在 選 取 其 中 的 COM6 選 項 即 可 。 完成上述四大步驟後,ESP8266 的開發環境已形成。至於網路有人提及還要 在工具燒錄器命令拉出的選單裡,選取esptool項,誰理它?
Wi-Fi 硬體調配
11-3
微微微控控控智智智學學學創創創新新新 若要應用KTM-600 多功能開發平台裡的8266 模組,必須有幾項硬體調配, 讓 KTM-600 多功能開發平台更優化、讓實驗更順暢,而這些硬體的調配動作, 都已反應在新版的 KTM-600 多功能開發平台裡,換言之,在新版的 KTM-600 多 功能開發平台裡,可跳過本單元。 在最早期的 KTM-600 多功能開發平台裡,並沒有將 ESP8266 模組的重置接 腳引接出來,如此將使 ESP8266 模組在燒錄模式與正常執行模式之間的切換,變 成很麻煩! 若要讓 ESP8266 模組進入燒錄模式,其步驟如下: 同時將ESP8266 的 RESET 腳與 GPIO0 腳接地,晶片進入重置狀態。 約 0.5 秒後,RESET 腳不再接地,而變為高態,此時 GPIO0 腳接地仍接
地。
約 0.5 秒後,GPIO0 腳不再接地,而變為高態即進入燒錄模式。
若 ESP8266 的 RESET 腳有引接出來,則可將 RESET 腳接到 P10B-2(S2 鍵)、 GPIO0 腳(P21B-GPIO0)接到 P10B-1(S1 鍵)。若要讓 ESP8266 模組進入燒錄模式, 則同時按下S1 鍵與 S2 鍵,心裡默數 123 後放開 S2 鍵,再默數 123 後放開 S1 鍵,
即進入燒錄模式。若沒有引接RESET 腳,就要以重開電源代替,很麻煩!
當完成燒錄後,若要恢復正常執行模式,只要按一下 S2 鍵即可。
若是使用最早版本的 KTM-600 多功能開發平台,則可應用一條杜邦線,截 斷一端並去掉絕緣皮(約 2mm),再將它銲在 ESP8266 模組左上腳,如圖 15 所示。 實驗時,可將此杜邦線插到 P10B-2,則 S2 鍵就是重置鍵。 基本上,在 KTM-600 多功能開發平台裡的裝置大多為+5V 設計,若是採高 態驅動電路的裝置,如蜂鳴器等,不管是+5V 電源的信號,或+3.3V 電源的信號, 都可正常工作。若採低態驅動電路的裝置,如繼電器、LED Bar 等,可能會有困 擾。以 RY1 繼電器電路為例(RY2 繼電器電路也類似),如圖 16 所示。 圖16 RY1 繼電器電路 若是+5V 電源的驅動信號時,繼電器與 LED 都能正確反應。若是+3.3V 電 源的驅動信號時(+3.3V、0V),當驅動信號為 0V 時,LED 將全亮(正常)、繼電器 也會正常激磁。當驅動信號為+3.3V 時,並無法完全關閉 LED (呈現微亮),而繼 電器不會斷磁(不應該)。偏偏 ESP8266 模組所送出的信號,就是+3.3V、0V! 圖17 準位調整 在此我們也刻意設計讓讀者學習如何處理低電壓準位驅動較高電壓裝置。其 實,只要在 ESP8266 模組的信號輸出端,串接一個 1.5KΩ~10KΩ電阻器後,再驅
動繼電器電路即可,如圖 17 所示。當然這個問題,對於高態驅動的裝置,就不會 有問題。 在 KTM-600 多功能開發平台上有塊麵包板,很容易在 ESP8266 模組的信號 輸出端與繼電器電路之間,串接一個電阻器,留待讀者自行練習。
Wi-Fi 遙控
11-4
微微微控控控智智智學學學創創創新新新 在本單元裡,將直接應用 ESP8266 操作兩個繼電器,透過 Wi-Fi 傳達控制指 令,而所有操作與反應都可在序列埠監控視窗裡看到。如圖 18 所示為電路設計概 念,其中電源電路都已內接,並沒畫出來。 圖18 線路連接 連 接 線 路: 請 按 圖 18 的概念,在 KTM-600 多功能開發平台上 連 接 線 路 , 其 中 包 括 下 列 接 線 : USB-UART 的黑色線連接到 P21A-GND。 USB-UART 的白色線連接到 P21A-TxD。 USB-UART 的綠色線連接到 P21A-RxD。 USB-UART 的紅色線不 要 連 接。 USB-UART 的 USB 端插入 PC/NB 的 USB 埠。 P21B-GPIO0 腳連接 P10B-1(S1 按鍵)。
P21B-RST 腳連接 P10B-2(S2 按鍵)。
端 再 連 接 P14A-1(RY1 繼電器)。 P21B-GPIO4 腳連接麵包板上的 4.7KΩ電阻器,電阻器另一 端 再 連 接 P14A-2(RY2 繼電器)。 將銲好的RESET 線(P21B-RESET 腳),連接到 P10B-2(S2 按鍵)。 KTM-600 多功能開發平台接 上 外 部 電 源 , 但 SW0 開關先切 在 OFF 處(關閉)。 設 計 程 式:開 啟Arduino 視窗後,按 11-2 節的說明,設定好 ESP8266 的 設 計 環 境 。 然 後 按 下 列 輸 入 程 式 : /* ========== ch11_3_1.ino ============ * USB-UART 黑 線 連 接 P21A-GND * USB-UART 白 線 連 接 P21A-TXD * USB-UART 綠 線 連 接 P21A-RXD * USB-UART 插 入 PC/NB 之 USB 埠 * P21B-GPIO0 連 接 P10B-1(S1 按 鍵 , 燒 錄 開 關 ) * P21B-RST 連 接 P10B-2(S2 按 鍵 , RESET) * P21B-GPIO2 連 接 P14A-1(RY1 繼 電 器 ) * P21B-GPIO4 連 接 P14A-2(RY2 繼 電 器 ) * 在 瀏 覽 器 上 : * http://server_ip/RY1on : RY1 繼 電 器 激 磁 * http://server_ip/RY1off : RY1 繼 電 器 斷 磁 * http://server_ip/RY2on : RY2 繼 電 器 激 磁 * http://server_ip/RY2off : RY2 繼 電 器 斷 磁 * 其 中 的 server_ip 為 ESP8266 模 組 的 ip * 執 行 程 式 後 將 顯 示 在 序 列 埠 監 控 視 窗 裡 */ //========== 整 體 宣 告 部 分 ============
#include <ESP8266WiFi.h> //掛 載 ESP8266WiFi.h 標 頭 檔
const char* ssid = "yourSSID";
//請 將 yourSSID 改 為 您 所 要 連 接 Wi-Fi 的 ssid
const char* password = "yourPassword";
//請 將 yourPWD 改 為 您 所 要 連 接 Wi-Fi 的 password
WiFiServer server(80); //建 構 Wi-Fi 伺 服 器 , 使 用 Port 80
//繼 電 器
#define RY1 2 //定 義 RY1 繼 電 器 連 接 在 GPIO2 #define RY2 4 //定 義 RY2 繼 電 器 連 接 在 GPIO4 #define ON 0 //定 義 繼 電 器 之 ON(低 態 動 作 ) #define OFF 1 //定 義 繼 電 器 之 OFF(低 態 動 作 ) //========== 初 始 設 定 部 分 ============
void setup()
{ //設 定 繼 電 器 接 腳
pinMode(RY1, OUTPUT); //設 定 RY1 為 輸 出 接 腳 digitalWrite(RY1, OFF); //設 定 RY1 之 初 始 狀 態 pinMode(RY2, OUTPUT); //設 定 RY1 為 輸 出 接 腳 digitalWrite(RY2, OFF); //設 定 RY1 之 初 始 狀 態 //設 定 串 列 埠
Serial.begin(115200); //啟 用 串 列 埠 (連 接 序 列 埠 監 控 視 窗 )
delay(10); //稍 候 10ms
Serial.println(); //換 行
Serial.println(); //換 行
Serial.print("Connectingto ");
Serial.println(ssid); //顯 示 SSID
//ESP8266 模 組 連 接 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{ delay(500); //待 連 接 Wi-Fi
Serial.print("."); }
Serial.println(); //換 行
Serial.println("WiFiconnected");//顯 示 已 連 上 Wi-Fi //啟 動 伺 服 器
server.begin();
Serial.println("Serverstarted");//顯 示 已 啟 動 伺 服 器 //在 序 列 埠 監 控 視 窗 裡 顯 示 ESP8266 之 IP
Serial.println(WiFi.localIP()); }
//========== 主 程 式 部 分 ============
void loop()
{ //檢 查 是 否 有 客 戶 端 (client)連 接
WiFiClient client = server.available();
if (!client) return; //若 沒 有 客 戶 端 連 接 則 返 回 //若 有 客 戶 端 連 接
Serial.println("new client"); //在 序 列 埠 監 控 視 窗 裡 顯 示 有 客 戶 端 連 接
while(!client.available()) delay(1);//等 待 客 戶 端 傳 入 資 料
//讀 取 客 戶 端 傳 入 之 需 求 列
String req = client.readStringUntil('\r');
Serial.println(req); //在 序 列 埠 監 控 視 窗 裡 顯 示 客 戶 端 需 求
client.flush(); //放 棄 已 寫 入 到 客 戶 端 , 但 尚 未 讀 取 的 資 料
//處 理 需 求 int val;
if (req.indexOf("/RY1on") != -1)
{ digitalWrite(RY1, ON); //開 啟 RY1 s += "<html>\r\nRY1 is ON </html>\n";
client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
elseif (req.indexOf("/RY1off") != -1) { digitalWrite(RY1, OFF); //關 閉 RY1 s += "<html>\r\nRY1 is OFF </html>\n";
client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
elseif (req.indexOf("/RY2on") != -1)
{ digitalWrite(RY2, ON); //開 啟 RY2
s += "<html>\r\nRY2 is ON </html>\n";
client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
elseif (req.indexOf("/RY2off") != -1)
{ digitalWrite(RY2, OFF); //關 閉 RY2
s += "<html>\r\nRY2 is OFF </html>\n";
client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
else
{ Serial.println("invalid request"); //在序列埠監控視窗裡顯示需求錯誤
client.stop(); //停 止 客 戶 端 連 接 return; //返 回
}
client.flush(); //放 棄 已 寫 入 到 客 戶 端 , 但 尚 未 讀 取 的 資 料
delay(1); //稍 候 1ms
Serial.println("Client disconnected"); //在 序 列 埠 監 控 視 窗 裡 客 戶 端 斷 線
} 將 ESP8266 板切入燒錄模式:將KTM-600 多功能開發平台上的S1 鍵 按住不放,再將SW0 開關切到 ON 位置,ESP8266 板將進入燒錄模式。 一下子(約 1 秒鐘)開機就完成了,就可放開 S1 鍵。 上傳:按 鈕(或按 + 鍵),即可進行編譯。若程式編譯 無誤,將自動燒錄到晶片。不過,ESP8266 的燒錄需要比較長的時間, 而在下方欄位裡,也會以點點點來顯示燒錄進度,請耐心等待!看到 「上傳完畢。」時,代表完成燒錄。 測試:在此的測試動作,與 Arduino 的測試也有些不同,要特別注意! 由 於 本 程 式 會 用 到序 列 埠 監 控 視 窗, 必 須 先 在 Arduino IDE
裡 開 啟序 列 埠 監 控 視 窗(按 +
+
鍵)。若顯示 「開啟序列埠COM6 時發生錯誤。(Port buay)」訊息時,稍後再重新按 +
+
鍵,即可開啟序列埠監控視窗。 開 啟序 列 埠 監 控 視 窗後 , 按 S2 鍵重置 ESP8266 模組,讓它 恢 復正 常 執 行 模 式, 而序 列 埠 監 控 視 窗裡 將 顯 示 : Connectingto happyESP ……. WiFiconnected Serverstarted 192.168.1.167 上 述 之「happyESP」為 所 要 連 接 Wi-Fi 的 SSID,我們必須依 實 際 的 SSID 在 程 式 中 指 定 之 (如 程 式 中 的 yourSSID)。 而 「192.168.1.167」 為 我 們 所 建 構 伺 服 器 的 IP,隨 Wi-Fi 環境 而 不 同 。 接 下 來 就 是 要 對 這 個 IP 下命令。 圖19 Chrome 瀏覽器上的操作與反應 在 Windows 裡,開啟網路瀏覽器(如 Chrome 等),然後按下 列 操 作 : 在網址列裡輸入 192.168.1.167/RY1on
,就是要激磁
RY1 繼電器。再觀察KTM-600 多功能開發平台裡的RY1 繼電 器將動作、LED 亮。同時,序列埠監控視窗顯示:new client GET /RY1on HTTP/1.1 Client disconnected 在瀏覽器裡將顯示 RY1 is on。 可 能 是 Chrome 瀏 覽 器 又 將 網址列右 邊 的我 的 最 愛 圖 示 ( )也傳過來了,所以,序 列 埠 監 控 視 窗又 顯 示 : GET /favicon.ico HTTP/1.1 invalid request 當 然 ,ESP8266 將它視為不正確的需求(不是命令)。 重複上述操作,在瀏覽器裡分別對 ESP8266 下達 192.168.1.167/ RY1off、192.168.1.167/RY2on、192.168.1.167/RY2off 等命令,並 觀察瀏覽器、繼電器、LED 與序列埠監控視窗的反應。 1. 請修改程式,增加蜂鳴器的功能,讓 ESP-12 模組收到 正確命令後,先嗶一聲再反應原本該命令的操作?
Wi-Fi 遙測
11-5
微微微控控控智智智學學學創創創新新新 圖20 線路連接在此將以DHT11 量測溫濕度,然後透過 ESP8266 模組傳到網站。 連 接 線 路: 請 按 圖 20 的概念,在 KTM-600 多功能開發平台上 連 接 線 路 , 其 中 包 括 下 列 接 線 : USB-UART 的黑色線連接到 P21A-GND。 USB-UART 的白色線連接到 P21A-TxD。 USB-UART 的綠色線連接到 P21A-RxD。 USB-UART 的紅色線不 要 連 接。
USB-UART 的 USB 端插入 PC/NB 的 USB 埠。 P21B-GPIO0 腳連接 P10B-1(S1 按鍵)。 P21B-RST 腳連接 P10B-2(S2 按鍵)。 P21B-GPIO2 腳連接 P20(DHT11)。 將 銲 好 的 RESET 線(P21B-RESET 腳),連接到 P10B-2(S2 按 鍵)。 設 計 程 式:開 啟Arduino 視窗後,按 11-2 節的說明,設定好 ESP8266 的 設 計 環 境。若 原 本 已 設 定 為 ESP8266 設計環境,則不用再設定。 然 後 按 下 列 輸 入 程 式 : /* ========== ch11_4_1.ino ============ * USB-UART 黑 線 連 接 P21A-GND * USB-UART 白 線 連 接 P21A-TXD * USB-UART 綠 線 連 接 P21A-RXD * USB-UART 插 入 PC/NB 之 USB 埠 * P21B-GPIO0 連 接 P10B-1(S1 按 鍵 , 燒 錄 開 關 ) * P21B-RST 連 接 P10B-2(S2 按 鍵 , RESET) * P21B-GPIO2 連 接 P20(DHT11) * 在 瀏 覽 器 上 : * http://server_ip/Temperature : 查 詢 溫 度 * http://server_ip/Humidity : 查 詢 濕 度 * 其 中 的 server_ip 為 ESP8266 模 組 的 ip * 執 行 程 式 後 將 顯 示 在 序 列 埠 監 控 視 窗 裡 */ //========== 整 體 宣 告 部 分 ============ #include "DHT.h" //掛 載 DHT 標 頭 檔
#define DHTpin 2 //定 義 GPIO2 腳 連 接 DHT11
DHT myDHT(DHTpin, DHT11); //建 構 DHT 物 件
float C=0.0, H=0.0; //宣 告 變 數
const char* ssid = "yourSSID";
//請 將 yourSSID 改 為 您 所 要 連 接 Wi-Fi 的 ssid
const char* password = "yourPassword";
//請 將 yourPWD 改 為 您 所 要 連 接 Wi-Fi 的 password
WiFiServer server(80); //建 構 Wi-Fi 伺 服 器 , 使 用 Port 80
//========== 初 始 設 定 部 分 ============ //在 此 部 分 就 已 連 接 到 Wi-Fi void setup() { //設 定 串 列 埠 Serial.begin(115200); //啟 用 串 列 埠 (連 接 序 列 埠 監 控 視 窗 ) delay(10); //稍 候 10ms Serial.println(); //換 行 Serial.println(); //換 行
Serial.print("Connectingto ");
Serial.println(ssid); //顯 示 SSID
//ESP8266 模 組 連 接 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{ delay(500); //待 連 接 Wi-Fi
Serial.print("."); }
Serial.println(); //換 行
Serial.println("WiFiconnected");//顯 示 已 連 上 Wi-Fi //啟 動 伺 服 器
server.begin();
Serial.println("Serverstarted");//顯 示 已 啟 動 伺 服 器 //在 序 列 埠 監 控 視 窗 裡 顯 示 ESP8266 之 IP
Serial.println(WiFi.localIP()); //啟 動 DHT11 myDHT.begin(); } //========== 主 程 式 部 分 ============ void loop() { //讀 取 溫 濕 度 C = myDHT.readTemperature(0); //讀 取 攝 氏 溫 度 H = myDHT.readHumidity(); //讀 取 濕 度 //檢 查 是 否 有 客 戶 端 (client)連 接
WiFiClient client = server.available();
if (!client) return; //若 沒 有 客 戶 端 連 接 則 返 回 //若 有 客 戶 端 連 接
Serial.println("new client"); //在 序 列 埠 監 控 視 窗 裡 顯 示 有 客 戶 端 連 接
//讀 取 客 戶 端 傳 入 之 需 求 列
String req = client.readStringUntil('\r');
Serial.println(req); //在 序 列 埠 監 控 視 窗 裡 顯 示 客 戶 端 需 求
client.flush(); //放 棄 已 寫 入 到 客 戶 端 , 但 尚 未 讀 取 的 資 料
//處 理 需 求 int val;
String s="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n";
if (req.indexOf("/Temperature") != -1)
{ String m = String(C, 2); //轉 換 溫 度 為 字 串 s = s + "<html>\r\nTemperature : "+m+"</html>\n"; client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
elseif (req.indexOf("/Humidity") != -1)
{ String m = String(H, 2); //轉 換 濕 度 為 字 串 s = s + "<html>\r\nHumidity : "+m+"</html>\n"; client.print(s); //在 客 戶 端 網 頁 上 顯 示 訊 息 }
else
{ Serial.println("invalid request"); //在序列埠監控視窗裡顯示需求錯誤
client.stop(); //停 止 客 戶 端 連 接 return; //返 回
}
client.flush(); //放 棄 已 寫 入 到 客 戶 端 , 但 尚 未 讀 取 的 資 料
delay(1); //稍 候 1ms
Serial.println("Client disconnected"); //在 序 列 埠 監 控 視 窗 裡 客 戶 端 斷 線
} 將 ESP8266 板切入燒錄模式:在 KTM-600 多功能開發平台以上電狀 態下,同時按住 S1 與 S2 鍵按住不放,再依序放開 S2 鍵(重置鍵)與 S1 鍵(間隔 1 秒),ESP8266 板將進入燒錄模式。 上傳:按 鈕(或按 + 鍵),即可進行編譯。若程式編譯 無誤,將自動燒錄到晶片。不過,ESP8266 的燒錄需要比較長的時間, 而在下方欄位裡,也會以點點點來顯示燒錄進度,請耐心等待!看到 「上傳完畢。」時,代表完成燒錄。 測試:在此的測試動作,與 Arduino 的測試也有些不同,要特別注意! 由 於 本 程 式 會 用 到序 列 埠 監 控 視 窗, 必 須 先 在 Arduino IDE 裡 開 啟序 列 埠 監 控 視 窗(按 +
+
鍵)。若顯示 「開啟序列埠COM6 時發生錯誤。(Port buay)」訊息時,稍後再 開 啟序 列 埠 監 控 視 窗後 , 按 S2 鍵重置 ESP8266 模組,讓它 恢 復正 常 執 行 模 式, 而序 列 埠 監 控 視 窗裡 將 顯 示 : Connectingto happyESP ……. WiFiconnected Serverstarted 192.168.1.167
上 述 之「happyESP」為 所 要 連 接 Wi-Fi 的 SSID,我們必須依 實 際 的 SSID 在 程 式 中 指 定 之 (如 程 式 中 的 yourSSID)。 而 「192.168.1.167」 為 我 們 所 建 構 伺 服 器 的 IP,隨 Wi-Fi 環境 而 不 同 。 接 下 來 就 是 要 對 這 個 IP 下命令。 在 Windows 裡,開啟網路瀏覽器(如 Chrome 等),在網 址 列 裡 輸 入 192.168.1.167/Temperature , 代 表 要 查 詢 溫 度 。 同 時 ,序 列 埠 監 控 視 窗顯 示 : new client GET /Temperature HTTP/1.1 Client disconnected 在 瀏 覽 器 裡 將 顯 示 Temperature : 28.00,代表溫度為 28.00。 在 網 址 列 裡 輸 入 192.168.1.167/Humidity , 代 表 要 查 詢 濕 度 。 同 時 ,序 列 埠 監 控 視 窗顯 示 : new client GET /Humidity HTTP/1.1 Client disconnected 在 瀏 覽 器 裡 將 顯 示 Humidity: 61.00,代表濕度為 61.00。 1. 請修改程式,只要在網址列裡輸入 192.168.1.167/All ,即可同時查詢/顯示溫度與濕度?
本章習作
11-6
微微微控控控智智智學學學創創創新新新在本單元裡,以ESP8266 模組為主體,包括說明如何在 Arduino IDE 裡建構 ESP8266 模組的開發環境,更進一步取代 Arduino Uno 板等,而成為 Wi-Fi 系統下
的霸主。讓我們能以較低成本與開發時間,進入物連網的年代。在此將簡單的驗
證學習成效,並練習與發揮創意。
( )1. 關於 ESP8266 系列晶片之敘述,下列何者正確?
(A) 8 位元 Wi-Fi 專用晶片 (B) 內建 32 位元 ADC (C) 可直接使用 Arduino IDE 開發軟體 (D) 使用+5V 電源 。
( )2. 關於 ESP8266 系列晶片之無線功能,下列何者正確?
(A) 只支援 STATION 模式(STA),不支援 AP 模式 (B) 提供 RFID 功能 (C) 只能使用內建天線 (D) 符合 802.11 b/g/n 通信協定 。
( )3. 關於 ESP-01 模組的敘述,下列何者有誤?
(A) 內建 UART (B) 內建 USB-UART 橋接器 (C) 只引接出 8 支接 腳 (D) 內建 32 位元 CPU 。
( )4. 若要應用 ESP-01 模組,必須考量哪些事?
(A) 使用+3.3V 電源 (B) CH_PD 腳須接地 (C) RST 接 VCC 時晶片 將 重 置 (D) 以上皆是 。
( )5. ESP-12 模組與 ESP-12e 模組之差異,下列敘述何者有誤?
(A) ESP-12 模 組 接 腳 數 量 比 ESP-12e 模組接 腳 數 量 少 (B) 兩 者 之 GPIO4 與 GPIO5 腳位不同 (C) ESP-12e 模組提供 GPIO0 與 GPIO10 接 腳 , 但 ESP-12 模組沒有提供 (D) 兩者都 3.3V 電源 。
( )6. 若要讓 ESP8266 模組進入燒錄模式,應如何處理?
(A) RESET 腳接地再上電 (B) RESET 腳 VCC 再上電 (C) GPIO0 腳 接 地 再 上 電 (D) GPIO0 腳接 VCC 再上電 。
( )7. ESP-12 模組提供多少個 GPIO 接腳? (A) 16 (B) 11 (C) 8 (D) 2 。 ( )8. ESP-12 模組預設的串列埠為何?
(A) GPIO1 為 TxD、GPIO3 為 RxD (B) GPIO1 為 RxD、GPIO3 為 TxD (C) GPIO0 為 TxD、GPIO1 為 RxD (D) GPIO0 為 RxD、GPIO1 為 TxD 。 ( )9. 關於 USB-UART 線的 UART 端的出線,下列敘述何者正確?
(A) 白色線為 GND、紅色線為 VCC、綠色線為 TxD、黑色線為 RxD (B) 綠色線為 GND、紅色線為 VCC、白色線為 TxD、黑色線為 RxD (C) 黑色線為 GND、白色線為 TxD、綠色線為 RxD、紅色線為 VCC (D) 黑色線為 GND、白色線為 RxD、綠色線為 TxD、紅色線為 VCC 。 ( )10. 關於 ESP8266 的 AT 命令裡,下列何者的功能是查詢韌體版本?
(A) AT+GMR (B) AT+CWQAP (C) AT+CIFSR (D) AT+CIPSTATUS 。
1. 請設計一個遙控彩色 LED 展示程式,當我們在網頁上送出命令,ESP8266 模組就會按命令驅動 RGB LED,如下: Trip1揚眉吐氣 Trip2彩虹輪動 2. 請設計一個遙測距離的程式,當我們在網頁上送出一個 distance 命令, ESP8266 模組就會把超音波感測器所測得的距離,傳到網頁上。 1 2 3 4 5 6 7 8 9 10 C D B A C C B B D A