嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

建立一個連棟溫室 - 第2部分

title

用Python,MQTT和Node-RED實施監測和控制

在第1部分,我的同事Stuart說明了我們如何挑戰去創建一個連接的溫室 - 集成傳感器和環境控制,那是視覺魅力 , 在繼續介紹主要組成部分及涵蓋機械設計之前。在這篇文章中我繼續完成他未完成的地方,並看看更詳細和軟件配置的電子設備。

子系統

title

整體系統是由許多較小的子系統組成。溫室本身配備了傳感器和致動器/輸出,而它們被連接到控制單元。

所述LED驅動器容納的LED恆流電源,其中必須有其240V電源輸入 - 而不是低電壓輸出 - 切換。這也是通過電線連接到控制單元。

一個傾斜的前桌面外殼裝有7段顯示器和電容式觸摸開關,以提供控制,它可以監測環境和手動控制。

控制和控制面板單元都使用MQTT傳遞信息,這是通過雲端,系統配置使得不需要依賴任何外部(Internet)幫助。

最後,可以查看應用邏輯和用靠運行Ubuntu Linux的英特爾計算棒PC顯示系統,進入一個網頁界面。

每個子系統在下面會更詳細地描述,其中列出,不包括像在第1部分中描述PERF的板,發光二極管,電阻器和連接器的主要組件。

傳感器和執行器

title

title

HTU21D和BH1750傳感器模塊裝配到其中一塊溫室屋頂板,溫度及濕度傳感器朝下,及光傳感器朝上。一個IP68等級12VDC風扇被用作新鮮空氣通風源,及在另一端的通氣口為溫室排氣。通氣口經由齒輪直流電動機轉動,並且所述位置是通過一個凸輪加微感測。園藝LED模塊裝配在另一塊頂板,而其散熱片應該獨自是足夠的,風扇被安裝以便使其保持涼爽的感覺。

控制系統(傳感器和執行器集成)

title

英特爾Edison被選為嵌入式計算平台,因為它提供了一個緊湊的,但相當強大的Linux系統,配備了閃存存儲和無線局域網,同時用大量的GPIO,可以很容易地存取,多虧了Arduino的接口板。

title

一個簡單的電路被建立在一個Arduino原型屏蔽,與正在使用的晶體管至12V切換到三個繼電器線圈。這些繼電器依次切換12V的LED驅動單元加上LED模塊散熱風扇,排氣馬達,和溫室的通風風扇。第四晶體管連接在Edison的PWM輸出,以提供通風風扇的速度控制信號。

通風口位置感測經由凸輪和微開關實現的,連接到Edison的輸入端,當開關觸頭閉合,它就會接地。

title

溫度+濕度及光傳感器板通過I2C總線連接到Edison。

LED驅動器

title

由於LED驅動器從一個主電源供電,所以決定收納它在自己的外殼,及使用繼電器切換其輸入端從控制單元取得信號(12V)。由於Petunia LED模塊產生相當強烈的光線,所以決定使用主開關作市電隔離和紅色指示燈顯示裝置是否取得電源。

控制台(傳感器顯示和手動控制)

title

再次使用英特爾Edison及Arduino接口板作為嵌入式計算平台。電容式觸控式開關閉及提供控制輸入:

  • 模式:自動/手動.
  • 通風:開/關(在手動模式下)
  • 照明:開/關(在手動模式下)

觸控式開關還具有其獨立運作開關功能的RGB LED。這裡決定為使用綠色以指示自動模式已啟動和紅為手動模式已啟動。由於LED需要比Arduino breakout可以安全地供應電流的限制多一點的電流,這些都可以靠BC337晶體管驅動。開關啟動時也可以輸出Vcc,在這個情況下是12V ,所以這被連接到Arduino輸入引腳通過電阻分壓器。

雲端(應用信息和邏輯)

title

我們是英特爾NUC的忠實粉絲,因為它在很小的體積中包含了很優越的性能,特別是當你利用M.2 SSD存儲,而去消除對外置SATA驅動器的需求。我們以前在一些項目中使用Core i5 NUCs,甚至是Core i3幾乎肯定是過份優勝,但它的而且確為我們提供了大量的空間。

顯示(應用程序Web界面)

title

運行Ubuntu Linux的英特爾計算棒被選為是一個靈巧的方法去進入用來監控和配置應用程序的網絡界面。這個可以簡單地被安裝在HDMI顯視器後面並經由無線鍵盤和鼠標控制。

軟件

title

init-pins-control 文件的一部份

所有子系統都運行Linux,同時也可以使用Arduino IDE來寫適用於英特爾Edison的應用程序,我們決定使用Python。我們同樣可以已經使用其它語言,如JavaScript或C。

英特爾Edison GPIO多路復用並Arduino接口板增加了緩衝和可選的上拉電阻器,所有這些都可以在Linux GPIO sysfs界面設定,在Control and Console systems分別使用了init-pins-controlinit-pins-console腳本。

title

在啟動時,通過init-pins service中的systemd配置去執行pin初始化腳本,上圖所示的就是控制系統的例子。

控制

title

控制系統中有兩個Python腳本:一個是讀取傳感器和發佈數值在MQTT broker,另一個則是訂閱MQTT主題以接收控制消息。

從這些第一主迴路,sensors-mqtt-pub,可以在上面看到。該腳本讀取溫度濕度+光傳感器,列出讀數到主題:

  • 傳感器/溫度
  • 傳感器/濕度
  • 傳感器/光度

如果腳本無法讀取傳感器,它會列出0.00到主題從而表示故障。每當它成功發布消息,一個紅色LED會在Arduino proto shield上閃爍。如果該LED保持持續亮起就意味著它已經發布失敗。

title

第二個腳本是actuators-mqtt-sub,它訂閱MQTT和接收信息從而設置風扇的開/關和速度,打開和關閉通風口,並設置horticultural LED模塊的開/關。這方面可以在上面看到,顯示出了排氣口開/關功能和它一部分是設置風扇速度的功能。一個關Edison的偉大事情是,它具有PWM生成的硬件支持和配置,這是猶如在Linux文件系統寫入文件一樣簡單。

主題關乎這Python腳本是:

  • 執行器/照明
  • 執行器/通風
  • 執行器/風扇轉速 

前兩個課題的有效信息是“開”和“關”, 與這些轉動Petunia horticultural LED模塊開/關,以及打開或關閉排氣口,同時也有通風風扇開/關。所述風扇轉速主題採用50-100之間的一個數字用於風扇佔空比,與任何數量<50造成本被設置為50%和任意數量>100將其設置為100%。

每次腳本接收一個消息都會在Arduino proto shield閃爍綠色LED。如果該LED持續亮起就意味著它沒有訂閱。

在實踐中,如果有一個問題關於發布或訂閱MQTT,那麼往往是網絡或MQTT broker本身的問題,導致所有LED維持亮起。

兩個Python腳本需要greenhouse-sensors.service and greenhouse-actuators.service systemd才能執行,這確保他們適當的GPIO引腳初始化腳本運行後才開始啟動執行。

控制台

 title

控制台運行三項Python腳本,其中第一個是,sensor-indicators-mqtt-sub,訂閱MQTT並接收傳感器讀數其用於更新七段LED顯示。

 title

第二個腳本,switches-mqtt-pub,讀取三個電容式觸控開關的狀態和發布信息到主題:

  • 溫室/模式(“自動”或“手動”)
  • 溫室/手動/照明(“開”或“關”)
  • 溫室/手動/通氣(“開”或“關”)

除了發布到MQTT,這個腳本把開關模式的顏色設置為紅色或綠色,取決於它的啟動了(手動模式)或還沒有啟動(自動模式 - 默認)。

title

第三個腳本actuator-indicators-mqtt-sub,訂閱了以下MQTT主題:

  • 溫室/模式
  • 執行器/照明
  • 執行器/通風

如果Petunia LED模塊被設定為亮起或通風啟動了,照明和通風電容開關的LED 會亮起。然而,它們亮起的顏色 - 綠色或紅色 – 亦會用於指示系統是否處於自動或手動模式。

如與控制系統,用於Arduino原屏蔽的綠色和紅色LED以指示MQTT發布和訂閱的成功和失敗。 systemd也再次用*.service文件來設定,在啟動同時也開始Python腳本,但要經過GPIO引腳被初始化之後才會發生。

雲端

雲系統被配置為運行Ubuntu Linux操作系統和以下應用:

隨著配置MQTT,傳感器讀數可以通過控制系統予以公佈,通過Console訂閱和用於更新7段LED顯示器。電容式觸控開關狀態也會被讀取並發布到MQTT主題。然而,沒有進程發布到MQTT主題的用於控制系統的輸出,如通風(風機+通風口)和照明(LED模塊)。

雖然我們可以通過上述的Python腳本或其他腳本來實行控制邏輯,就做到這一點,可以通過節點-RED,節點-RED是用於連接物聯網的可視化工具。因為這將保持其與物理世界接口的代碼 - 傳感器和輸出 - 適當地簡單,同時也使非常迅速新的邏輯原型變得有可能,我們應該希望,與其它系統進行集成,這要歸功於節點 – RED的能力。

應用程式流程

title

整個節點-RED流從上面可以看出,在這我們可以在左邊看到,我們訂閱MQTT主題溫度,濕度,光度,隨著主題模式開關的狀態,通風開關和照明開關。

其中右手側的發布到MQTT通風,風扇速度和照明的主題。

因為我們對於溫室內的溫度沒有任何控制,我們只需連接這個MQTT主題輸出到調試節點,使我們能夠由收到的話題打印消息。

title

經由濕度MQTT主題接收到的消息會被輸入到一個濕度控制功能。這個會被配置有最大允許濕度,其中如果超過,並且系統是在自動模式下,將導致在通風被接通及在通風主題發布“開啟”。

同樣地,光水平讀數由光控制功能分析,這取決於這些和系統運行模式解析,將發出一個“開”或“關”的訊息,然後發布到照明主題。

title

在flow底部我們有三種功能可以設置全局變量以反映電容式觸摸開關的狀態三種功能。如果系統處於手動模式,則濕度和光照控制功能將忽略傳感器讀數,並使用電容式開關狀態,以確定是否通風和光照應開啟或關閉。

還要注意,每個功能具有附加幾行的代碼用來更新狀態指示,一點就指示自動模式,一個圓圈是手動,而紅色是關及綠色是開。例如,濕度控制功能下的綠色圓圈表示,該系統在自動模式和通風是活動的。

 title

最後,通風風扇轉速經由注入節點設定,可以允許有效載荷進行配置設置。在這種情況下,風扇佔空比會發布到致動器/風扇轉速主題。

可能的改進

現在,我們有足夠的通風和照明通過節點RED控制,從溫度,濕度和光線感應器提供的數據,我們可以非常迅速地更改應用程序邏輯和/或整合其他系統,如通過網絡的API,來實現更先進的功能。

一個明顯的改進是加快和放慢風扇馬達隨著濕度增大和減小,而不是簡單地切換通風風扇和關閉。而加上溫度控制只是很簡單的電路通過繼電器或者通過一個遙控電源開關用來控制加熱器。我們可以很容易地繪製傳感器測量和控制輸出,添加電子郵件通知等等......這些潛在的改進是無止境的。

總結

title

這是一個有趣的項目,希望演示使用Python簡單的腳本可以與一個通用平台,如英特爾Edison,從而快速整合傳感器和輸出。使用MQTT作為“膠水”,通過節點RED快速發展的控制邏輯和更先進功能的潛在集成,加快分佈式系統的發展。

自定義亞克力組件的設計文件與外殼和Python腳本可以一起在項目GitHub知料庫找到。

— Andrew Back

Vincenty 还没写个人简介...