//Logo Image
「世大智科/天才家居」-我們創業囉
PDF Version

第四章 感測器建置與功能模組

4.1    WhizMAT硬體原型設計

天才巧拼是以薄膜開關概念所製作的壓力感測器,如圖4-1所示,每片巧拼上有四個感測區塊,中間有一片ATmega328的微處理器接收個感測區域的壓力訊號。WhizCARPET利用導電橡膠、隔離層與感測電極組成類似薄膜開關的多層結構,除開關功能之外,亦可感測受壓程度。外部壓力越大時,導電橡膠與感測電極的接觸品質越好,電阻值越低;若壓力越小,接觸品質越差,電阻值則越高。

 

4-1. 天才巧拼包括四個感測區域與中間的ATmega328微處理器

各塊巧拼以經過特殊設計的防水的公母接頭連接,如圖4-2,以上下卡接的方式加強金屬接頭接觸穩定性,並以塑膠外殼包覆完全將金屬接頭,防止水濺到巧拼上造成的暫時性短路,天才巧拼長50cm50cm,最多能拼湊127片,單一方向不超過12片,此限制來至於個巧拼微處理器的I2C通訊與內部電線造成的電壓下降。當拼湊完成後天才巧拼會自行建立相對地圖,並儲存成矩陣型式資料。

4-2. 巧拼防水接頭,上下卡接將金屬接頭包覆

天才床邊踏墊以一塊巧拼即四個感測器為一個基本感測單元,以舒適厚實的泡棉作為巧拼上蓋,再鋪上一層防客製化的地毯,除了可以防止床邊跌倒的撞擊,並給予客製化外觀的可能性。偵測使用者踩踏的壓力資訊,可以搭配巧拼的相對地圖使用藍牙低功耗(BLE)傳輸即時定位資訊至智慧型裝置上顯示,也同時判讀事件,將事件資訊即時的透過Wi-Fi網路傳送至MQTT Broker,以此達成智慧型裝置的提醒通知,也提供其他物聯網裝置與天才床邊踏墊介接的接口。

4.2    WhizCARPET感測器資料傳輸接口

天才巧拼目前仍是開發中的產品,但提供一可靠接口用以獲取感測器資訊,使用內部晶片的通用非同步收發傳輸器(Universal Asynchronous Receiver/Transmitter, UART)作為通訊的傳輸埠,以序列傳輸(Serial Communication)的方式回傳個片巧拼上感測器的壓力訊號,此壓力訊後分為0~9十個等分,與真實壓力值轉換並非線性,有灰階變化但不能做到準確的重量判斷。

目前天才巧拼所提供的API接口僅為簡易的字串通訊,尚未加入CRCChecksum等資料校驗,也並未使用XMLJSON等資料格式。天才巧拼所提供的資料分為兩種,如下:

(1)       巧拼拼湊形狀矩陣(Auto mapping array)

要獲取巧拼拼湊形狀的資訊需要先傳送一要求(Request)字元”G”,天才巧拼將回傳矩陣大小與矩陣資訊。舉例來說,如拼成圖4-3的形狀,每塊巧拼會被賦予一個唯一的數字編號,當收到”G”的指令將會回傳” YA0204EL01,02,00,00#03,04,05,06E”的字串。第一個字元”Y”表示次此字串為巧拼形狀矩陣的資訊,其中”A”為起始符”E”為結束符字串為矩陣大小,中間字串”0204”,前兩位為列的總數,後兩位為欄的總數,意即現在的形狀是24欄;以”L”為起始符”E”為結束符的字串是矩陣資訊,中間字串” 01,02,00,00#03,04,05,06”,以逗號分格每塊巧拼,巧拼資訊由左至右,由上至下,小於1的數值表示此位置無巧拼存在,#字號為換行,意即第一列只有0102巧拼,第二列有03040506巧拼。

4-3. 巧拼拼湊形狀,數字為每塊巧拼被賦予的編號

(2)       即時壓力資訊(Sensor raw data)

在獲取完巧拼拼湊形狀資訊後,須先傳送一要求字元”D”,開始讀取天才巧拼的感測器資料,感測器的資訊會在任一感測器發生壓力改變的時候回傳,若同時有多塊巧拼壓力改變,會在同一筆資訊中帶有多快感測器的壓力資訊,此資訊最快一秒回傳一次。舉例來說當巧拼從原本無壓力狀態,變化至如圖4-4的壓力分佈,將回傳壓力資訊字串”S01017040#02030009E””S”為起始符”E”為結束符,以#字號分格各塊巧拼的感測器資訊,其中每塊巧拼資訊為8個字符,前四個字符為長寬資訊,各佔兩個字符;後四個字符為感測器壓力值,由09分為十等份,第一個字符為左上方感測器壓力值,第二個字符為左下方感測器壓力值,第三個字符為右下方感測器壓力值,第四個字符為右上方感測器壓力值。

4-4. 巧拼踩踏情形,紅色為有壓力,灰色為正常無壓力

4.3    WhizMAT工作流程

在了解如何獲取天才巧拼的相關資訊後,WhizMAT即可取用並分析此壓力資訊,不過WhizMAT作為一個可以輕鬆在家中安裝的物聯網產品,必須加入設定網路連線的功能,也需要加入MQTT的通訊與資料傳遞,詳細的程式功能將會在本章的第4段詳加說明,本段將說明WhizMAT整體的工作流程,如下圖4-5

4-5. WhizMAT工作流程圖

WhizMAT開機後,先開啟AP模式,提供使用者設定Wi-Fi網路的接口,同時嘗試連線Wi-Fi,連線未成功將會等待使用者執行網路設定,若連線成功則開始讀取巧拼的拼湊形狀資訊。讀取失敗將會自行重新開機,若成功則會開始監測與讀取感測器資訊,判斷事件發生後會發送一則QoS1MQTT訊息,傳送完畢後繼續監聽與讀取直到關機,同時也透過BLE即時傳送巧拼的即時壓力資訊至智慧型裝置。

4.4    IoT微處理器開發介紹

本研究使用老人福祉科技研究中心所開發的IoT微處理器,此微處理器可以透過Arduino 集成開發環境(Integrated Development Environment, IDE)來撰寫其運行程式。Arduino IDE免費且開源的特性,基於C++的程式語言,使得開發上非常便利,有許多的開源程式庫可以被應用於開發中。下載Arduino IDE後,點開偏好設定在額外的板子管理員網址貼上此網址http://arduino.esp8266.com/stable/package_esp8266com_index.json,之後點選工具,選擇板子管理員並安裝ESP8266此板子,之後將板子選擇Sparkfun ESP8266 Thing Dev即可開始編寫程式。

4.5    程式功能模組

「天才家居」系列產品的微處理器編寫皆會使用到一些相同的功能模組,其中包括Wi-Fi網路連線的設定、MQTT通訊功能。

(1)       Wi-Fi網路連線設定

此功能是讓「天才家居」系列產品能夠輕易被使用者自行安裝的關鍵,微處理器會產身自身的Wi-Fi環境,在這裡稱為AP模式,AP模式提供使用者可以連線至微處理器做連線設定,故此功能需要搭配App使用。此功能在微處理器上執行了三項功能,分別為掃描周遭可連線的Wi-Fi裝置以JSON格式提供App顯示、接收App傳來的Wi-Fi SSID與密碼執行Wi-Fi連線、提供App查詢目前的連線狀態。

Wi-Fi掃描與轉換JSON格式

使用WiFi.scanNetworks()的函式將會開始掃瞄周遭的Wi-Fi裝置,此函式將會返回一整數型態(Integer)的數字,表示其掃描到的Wi-Fi裝置數量。接著需要製作一JSON格式的資料將這些Wi-Fi裝置的資訊回傳至App上。如圖4-6,此JSON格式最外層為一JSON物件,以名稱「MAC」存放微處理器的MAC位址、「SSID」存放目前連線的SSID(若無連線為空值)、「WIFI」存放周遭Wi-Fi列表所轉換的JSON陣列;此JSON陣列每一個元素皆為JSON物件,物件內存放名稱為「SSID」的Wi-Fi SSID、「ENCRYPTION」的Wi-Fi加密型態、「RSSI」的Wi-Fi訊號強度。最後App可以透過網址http://192.168.1.1/WiFi-Search/,以HTTP GET的方式獲取此JSON格式資料。

螢幕快照%202016-07-11%20上午11.23.55.png

4-6. 獲取Wi-Fi列表的JSON格式

連線至指定Wi-Fi

App使用者選擇了一個網路環境並輸入了密碼,可以透過網址http://192.168.1.1/Connect /”SSID”/”PASSWORD”/,以HTTP GET方式將欲連線的SSID與密碼傳送至微處理器,透過WiFi.begin(”SSID”, ”PASSWORD”)的函式進行連線。最後產生一JSON格式回覆App SSID與密碼是否傳送成功,如:{“Status”:”Success”}{“Status”:”Fail”}

查詢連線狀態

當進行連線後,App可以進行網路連線狀態的查詢,以顯示操作結果給使用者,透過網址http://192.168.1.1/WiFi-Status/,以HTTP GET的方式獲取查詢結果的JSON格式,此格式包含連線狀態、目前連線的SSID、所被分配到的IP位址,如{“Status”:”Success”, “IP”:”192.168.0.174”, “SSID”:”d.lab-2.4G”},若連線未成功將會回傳{“Status”:”Fail”, “IP”:”Fail”, “SSID”:”Fail”}JSON資料。

(2)       MQTT通訊

MQTT通訊使用Github開發者Imroy所撰寫的開源的函式庫PubSubClient,此程式庫提供全面的PublishSubscribe功能。所使用的功能與函式如下:

·             IPAddress server(140, 138, 138, 108)
透過宣告一個IPAddress類別指定MQTT Broker主機位置。

·             WiFiClient wclient
宣告一個WiFi客戶端,此功能使得PubSubClient可以取得Wi-Fi的所有功能。

·             PubSubClient client(wclient, server, 1883)
宣告一個PubSubClient並放入參數WiFiClient類、IPAddress類、MQTT Broker連線埠。

·             client.connected()
PubSubClient是否連線至MQTT主機。

·             client.connect(“M0001”)
將此PubSubClient連線至MQTT主機,以”M0001”為此連線的Client ID

·             client. set_callback (callback)
PubSubClient設置一個MQTT訊息的Callback,用以接收Subscribe的訊息。

·             client.subscribe(“Topic”, QoS)
訂閱一個Topic,第一個參數為Topic名稱,第二個參數為訂閱的QoS層級。

·             client.publish(MQTT::Publish(“Topic”, “Payload”).set_qos(1))
使用MQTT C++裡的Publish類別設置所要傳送的TopicPayload,並可以設置QoS層級與Will

·             client.loop()
此函式會檢測MQTT底層的TCP連線,以MQTT Ping的格式傳送保持連線的心跳數據,是維持MQTT連線很重要的一個步驟。