相關文章

C3af50d3e9a51811ac439f20a5a4e16d 上篇文章「Maker物聯網實作:用DHx溫濕度感測模組回傳天氣溫溼度」提到DHT11的感測元件,一般來說,Maker找到這個元件,只要去Google或Github搜尋一下,很快就找到DHT11的感測元件對應函式庫,但是隨筆者出版的電子書越來越多,使用的開發板的種類也就越來越多。

文\曹永忠、許智誠、蔡英德

目前在86Duino系列:86Duino程式教學(網路通訊篇):86duino Programming (Networking Communication)中,使用DHT11的感測元件,開始發現,除非使用者永遠使用Arduino開發板,或等待他人將感測元件對應的函式庫寫出來並分享給大家使用,否則一離開Arduino開發領域,馬上就會遇到您熟悉的感測元件似乎都離我們遠去,不在是那麼易學易用了。

自己看規格書攥寫函式庫

如果您是C語言高手,也是軔體程式設計的高手,那這篇文章您應該不用繼續讀下去了,但是要自己看感測器的規格書(DataSheet)來攥寫函式庫,那可能這篇文章會很難以閱讀,所以筆者將86Duino程式教學(網路通訊篇):86duino Programming (Networking Communication)的改寫可用的函式庫的經驗,分享在這篇文章,相信許多讀者未來遇到這樣的問題,可以得到一些協助。

首先,我們採用下圖所示之DHT11溫濕度感測器,並且使用86Duino系列的EDUCAKE開發板開發相關程式。

▲DHT11溫濕度感測器。

使用Arduino開發板範例

如上圖所示,先參考溫濕度感測模組(DHT11)腳位接法,在遵照下表之溫濕度感測模組(DHT11)接腳表進行電路組裝,完成如下圖所示之插好DHT11的EDUCAKE。

▲溫濕度感測模組(DHT11)接腳表。資料來源:Arduino程式教學(常用模組篇):Arduino Programming (37 Modules)(曹永忠, 許智誠, & 蔡英德, 2015c, 2015d) 。

▲插好DHT11的EDUCAKE。

我們打開Arduino 開發板的開發工具:Sketch IDE整合開發軟體,編寫一段程式,如下表所示之DHT11溫濕度感測模組測試程式,我們就可以透過溫濕度感測模組(DHT11)來偵測任何溫度與濕度。

▼DHT11溫濕度感測模組測試程式

DHT11溫濕度感測模組測試程式(DHT_Ok_for_Arduino)

原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們可以看到溫濕度感測模組測試程式結果畫面,在Arduino開發板上,可以非常正常使用DHT11溫濕度感測模組與對應的函式庫與範例。

▲DHT11溫濕度感測模組測試程式結果畫面。

但是,如果把程式原封不動的移到86Duino的開發工具,並把該dht的函式庫也安裝到86Duino的開發工具,則會發現函式庫不相容,比較圖如下圖所示,我們發現,無痛轉移開發板並不是這樣的簡單,因為這樣簡單的範例程式,卻連編譯都失敗,更不用說能夠成功運行了。

▲無法正常編譯的DHT11範例。

尋求原廠協助

為了能夠把DHT11溫濕度感測模組安裝在86Duino的EDUCAKE開發板之上,並能夠正常運作,筆者找上了86Duino的開發者:瞻營全電子股份有限公司。

86Duino是國內『瞻營全電子股份有限公司』開發出來相容於Arduino開發板的傑作,其相容度更是少人能比,相信DHT11溫濕度感測模組這樣基礎的模組,一定是可以完全支援的,果然在瞻營全電子股份有限公司的商品官網:http://shop.dmp.com.tw/,馬上找到DHT11溫濕度感測模組的產品支援,網址如http://shop.dmp.com.tw/INT/products/67,在其官網找到『dht11_test.ino』,筆者跟據本實驗的接腳,改寫如下表所示之DHT11溫濕度感測模組測試程式,我們就可以透過DHT11溫濕度感測模組來偵測任何溫度與濕度。

▼表3:DHT11溫濕度感測模組測試程式。

DHT11溫濕度感測模組測試程式(DHT_OK_For_86duino_Product)

資料來源:瞻營全電子股份有限公司,原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510 

果然,原廠的服務無卸可擊,如下圖所示,我們可以看到溫濕度感測模組測試程式結果畫面。

▲官網可正常執行之DHT11溫濕度感測模組測試程式結果畫面。

改寫成函式庫的語法

但是,上述的程式,在使用DHT11溫濕度感測模組時,並不像以往我們熟悉的方式,把DHT11溫濕度感測模組的使用,封裝成一個專有的函式庫提供給使用者使用,而是將DHT11溫濕度感測模組使用的類別、方法等都與主程式混在同一隻程式,這樣不但使用上很容易誤解,未來改寫功能時,更有極大個可能將DHT11溫濕度感測模組使用的類別、方法給與破壞等問題。

但是,筆者看看上面瞻營全電子股份有限公司的DHT11溫濕度感測模組的範例程式,對於DHT11溫濕度感測模組所建構的類別、方法非常清處,並且易懂,所以希望可以將這隻程式『DHT_Bad_for_86duino』,成功轉成封裝的函式庫。

首先,寫過Arduino函式庫的人,都知道,一般函式庫都有兩隻程式,一隻是.h檔,就是一般的include檔,另一個就是C++程式檔,一般為CPP檔。

一般說來,.h檔,就是一般的include檔都是定義大部份的巨集,或define一些變數,主要.h檔用來將主體的類別設計出來,但是只有將方法(Method)與屬性(Property)用Interface的方式先行定義出來,所以我們很快的就把原有的程式內,所有的『#define』與『class』等分離出來,如下表所式,寫在dht.h的include檔上。

▼改寫為Include檔。

▲原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們發現編譯有問題。

▲無法編譯的include檔。

但是仔細看一看,如上圖所示,我們發現編譯的許多問題都是型態有問題,我們發現,原來class寫在arduino的ino檔內,許多型態的宣告是自動,但是一但將這些程式獨立到外部的C++程式,這些include檔的宣告,就不會自動幫我們加上去,所以筆者將這些常用的型態宣告找出來後,發現大部份的宣告都在『Arduino.h』之中,而Arduino.h又會用到stdint.h,所以如下表所示,我將這兩行include程式加到dht.h檔之中。

▼常用的型態宣告 include檔。

#include <Arduino.h>
#include <stdint.h>

如下表所示,我將這上表這兩行include程式加到dht.h檔之中,並且開始編譯。

▼改寫為Include檔。

擴增Arduino型態include檔之include 

原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們可以看到dht.h可以正常編譯成功。

將函式庫元件實體寫出的語法

寫過Arduino函式庫的人,都知道C++程式檔,一般為CPP檔,最主要的用處就是將主體的類別給與實作出來,如下表所示,所以我們很快的就把原有的程式內,所有的實作的方法(Method),將那些程式碼移到dht.cpp檔上,其內容主體大部份是有『dht::』等相關的內容。

▼改寫為CPP檔。

原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們可以看到溫濕度感測模組測試程式結果畫面,我們發現,主要的錯誤訊息:dht.cpp:2:5: error: 'dht' has not been declared。

如下圖所示,我們可以看到溫濕度感測模組測試程式結果畫面,我們發現,主要的錯誤訊息:dht.cpp:2:5: error: 'dht' has not been declared。

我們發現,dht.cpp雖然將dht類別實作出來,但是卻缺乏dht類別的宣告與產生,但是我們又不能在dht.cpp之中又把dht類別重新宣告與產生,雖然這樣可以編譯成功,但是,Arduino函式庫的寫法並非這樣,這樣又回到原來『DHT_OK_For_86duino_Product』的寫法。

所以筆者將dht類別的宣告與產生的include檔,用include的方法加入程式,將宣告與產生類別的 include檔含入的語法,將dht類別的宣告與產生送入dht.cpp之中。

將宣告與產生類別的 include檔含入的語法

#include "dht.h"

如下表所示,我將這上表這一行include程式加到dht.cpp檔之中,並且開始編譯。

▼將include包入函式實體之CPP檔。

原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們可以看到dht.cpp可以正常編譯成功。

整合函式庫的範例

到這裡我們已經可以成功將DHT11溫濕度感測模組的函式庫改寫到dht.cpp & dht.h之中,但是我們發現,原來剩下的程式:int chk = DHT.read11(DHT11_PIN);,卻因dht類別的宣告與產生的相關程式碼都已移到dht.cpp & dht.h之中而無法編譯成功。

原因是原有的程式(DHT_OK_For_86duino_Product.ino)是沒有使用外部的函式庫,所以當將dht類別的宣告與產生的相關程式碼移出後,DHT的物件自然消失不見了。

所以我們既然已將DHT11溫濕度感測模組給與函式化,我們就可以使用標準的Arduino 元件函式庫的語法,將該函式庫的include檔給與含入,就可以開始DHT11溫濕度感測模組。

如下表所示,我們使用『#include "dht.h"』的語法將DHT11溫濕度感測模組的函式庫包入,就可以使用『dht DHT』的方式,來產生DHT物件,其它的地方就跟原有的原有的程式(DHT_OK_For_86duino_Product.ino)一樣,可以不需修改就可以輕易使用DHT11溫濕度感測模組。

▼整合函式庫的範例測試程式。

原始碼下載網址:https://github.com/brucetsao/techbang/tree/master/201510

如下圖所示,我們可以看到使用函式庫方式之DHT11溫濕度感測模組測試程式結果畫面。

本文內容稍為艱深難讀,且讀者需要熟悉C語言與C++語言的基礎,並對Arduino開發板對於外加的函式庫用法也有相當程度的了解,不過,網路上對於這樣進階的文章很少,國內更少,希望透過本文分享,可以有更多Makers可以在Maker路上走個更遠,更深入,這也是筆者分享此文的初衷。

作者介紹

曹永忠 (Yung-Chung Tsao):目前為自由作家、台灣資訊傳播學會秘書長,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。

Email:prgbruce@gmail.com ,Line ID:dr.brucetsao 

Arduino部落格:http://taiwanarduino.blogspot.tw/

範例原始碼網址:https://github.com/brucetsao/arduino_RFProgramming

臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/

Arduino活動官網:http://arduino.kktix.cc/

Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ

使用 Facebook 留言

發表回應

謹慎發言,尊重彼此。按此展開留言規則