NTP 時鐘 – WiFimanager & AP

再完成自走小車 – 瓦礫號後,接下來我選擇的 case 是 NTP 的 LED 電子時鐘,問我為什麼,其實也沒有什麼特別的原因,只自己覺得很酷感覺可以試試看,結果這一試…

在做瓦礫號時,我一開始用的是 Arduino ZERO,但因為當時需要嘗試許多不同的連線方式,eg. WiFi connect、紅外線,所以把主要控制車子的板子換成了 NodeMCU,上面搭載了 ESP8266 這塊WiFi 晶片,因為上個案子了解了他的強大與穩定,所以打算 NTP 時鐘的網路連線也延續使用 ESP8266,殊不知這案子的起頭就來了個意外的小插曲…

NodeMCU 程式碼燒不進去

當時真的不知道為什麼,NodeMCU 就是很不聽話,嘗試過了各種可能性 (軟體面),依舊沒有辦法解決問題,只好犧牲我的瓦礫號…先把小車上的 NodeMCU 板子拆下來擋著用,再請 Bird 幫我看看這片 NodeMCU 到底是哪裡出了問題…

過了一兩天,Bird 為我解了個惑,找出 NodeMCU 之所以無法燒錄進去的原因,原來是 Flash Pin (GPIO0) 和 Reset Pin 的電阻沒有焊好,導致兩隻腳短路…

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2017-02-28-%e4%b8%8b%e5%8d%882-03-52

這也再次驗證了 Bird 那句經典的名言:
硬體只有動或是不動,硬體的死法有 10000 種,而在 10000 種死法中,不像軟體去找到錯誤並且 debug 就好,硬體很少給你特別的提示或蛛絲馬跡,只有依靠經驗…

不過這次的小插曲也讓我這個 rookie maker 對這片板子上的東西有更一步的認識。NodeMCU 上面的 GPIO0 是 Flash Pin 所控制的,在開機時 (供電),ESP8266 上面的 IC 會去偵測 GPIO0 的狀態,(HIGH 時為執行程式 mode,LOW 時為燒錄程式 mode),開機時會被拉到 HIGH,只有在按下 Flash button 後才會變為 LOW,放開又會變回 HIGH (只要偵測到 LOW 就會進入燒錄 mode,即便放開 button 變為 HIGH),順帶一提,按下 Arduino IDE upload button 就相當於手動去按 NodeMCU 上的 Flash button。

而這是一個瞬間的事情,當我按下 Arduino IDE 的 upload button,電路設計將 GPIO0 設成 LOW,並且 Reset ESP8266,很快速的讓他偵測到 GPIO0 的狀態為 LOW,即進入燒錄 mode。如果再更調皮,在不考慮電阻的情況下,我若按著 Flash button 讓他通電開機,他偵測到 LOW 就可以進入燒錄 mode。

NTP Protocol

既然要做 NTP 時鐘當然要先了解 NTP Protocol 是個什麼東西。簡單來說 NTP 是個時間伺服器,在這我不是真的要裝一個 NTP 的 server,我只是要抓他來用 (我是 Client 端,向 NTP server 抓取我要的時間) 而已,簡而言之我要做的只是去 NTP server 抓取時間進而顯示到我的 console 上面,

詳細 NTP Protocol 的介紹我是參考:鳥哥的 Linux 私房菜 – NTP 伺服器

WiFimanager & AP

當然講的簡單實際操作時就會發現有很多小細節會出包,光是抓取 NTP server 的資料,牽涉到的東西像是要求 NTP server 透過 UDP 的方式傳送 packet 到自己 local port 的連線,WiFi 連線,計算從 NTP sever 拿到的時間進而轉換等等就得花上一段時間。

而在這之中最重要的是,我希望我最後 build 出來的 NTP 時鐘不會因為網路的問題而 crash 掉。從之前的瓦礫號在做 WiFi 連線時我都是在程式碼內直接寫一個固定的 AP (access point),換句話說如果這個 AP 突然被關掉或者是掛了,我就連不上網路,必須打開程式碼將原先已設好的 AP 改成另外一個可用的 AP,然而為了避免這樣的悲劇發生,Bird 要我去了解 ESP8266 裡面的一個強大功能 – WiFimanager。

在分享 WiFimanager 前,想先說說 AP 這個東西 (因為等等會用到):

螢幕快照 2017-02-28 下午3.00.32.png

事實上是這樣,我們看到的每個 SSID 都是一個 AP (除了強大的 AP 可以設定多個 SSID ,是為例外),像是我們公司裡面有很多的 SSID 可以供我們連線使用,就表示有很多個 AP,而這些 AP 是會牽線連出去到 Internet 上訪問,所以說 AP 連接的是有線網路,透過無線的方式將數據傳播出去,或是接收無線傳播的數據傳入有線網路。

WiFimanager 強大的地方在於他有記憶性,大致上來講,比如說我這次連接到了某個 AP (以下稱 A1),到了下次重新連線的時候,因為記憶性的關係,device 會自動連線到 A1,倘若再重新連線時偵測不到原先的 A1 (可能掛了也可能沒開) WiFimanager 自己本身有設計 timeout,過了一小段時間如果沒有偵測到原先記憶中的 AP (即 A1),它會開啟自己的 AP 功能 (ESP8266 的 AP 軟體功能) 我們就可以用 device 去連上這個 AP (連到 ESP8266 內的 server,即連上內網的概念),而跑出來的頁面即是讓 user 可以自己去選擇要讓這個 ESP8266 的 WiFi chip 連線到哪個其他的 AP (絕對不可能會有 A1 了),並輸入 password 重新完成 (對外網的) 連線。

再來更進一步細說:

wifimanager.autoconnect ();

這個 function 是用來設定 ESP8266 上 IC 裡面 AP 的軟體功能 (它是軟體功能不是硬體!),不是設定 ESP8266 的 WiFi chip (我之前做的 WiFi 連線才是,直接設定 ESP8266 的 WiFi chip 讓他可以連接到我程式裡面已經預先設定好的 AP)。

而 autoconnect 就是要 connect AP 所以:

wifimanager.autoconnect(“RyanESPtest”)

Arduino 的 sketch 裡面我先設定 ESP8266 上面 AP 軟體的名稱 (SSID),所以我可以在我的 phone 上面偵測到 RyanESPtest 這個 SSID,連上後及連上內網,即可在這個內網底下找到 default 的 ip 位址 (即是 ESP8266 上面的 server),就可以透過 RyanESPtest 這個 AP 去偵測可連上外網的的 AP。

在完全了解 WiFimanager 的實際用處後,Bird 給了我一道題目:

根據 WiFimanager 的特性,如何設計一個 button 在 ESP8266 開機通電後,5 秒內如果這個 button 有被按下,就執行 reset 清空記憶並啟動 AP 軟體功能,讓我重新設定要連線的 AP,如果 5 秒內沒按,就 autoconnect 原本的記憶點。

這個問題的解答會在最後產品要完成時分享出來,畢竟這是個外加功能,現在只是起步的剛開始。

3 thoughts on “NTP 時鐘 – WiFimanager & AP

  1. 引用通告: NTP 時鐘 – SSD1306 & 控制 8 x 8 LED Matrix – 自造者萊恩

  2. 引用通告: NTP 時鐘 – browser 網頁控制 LED board – 自造者萊恩

  3. 引用通告: 瓦力號 – NodeMCU ESP8266 (WiFi 連線) – 自造者萊恩

發表留言