作者:Michael Parks 在之前的園藝項目中,我們研究了溫度、環境濕度、自身濕度、pH值和CO2含量對植物生長的影響。在本文中,我們將研究植物光合作用的另一個關鍵因素—光照。本項目將允許園藝工作人員監測和遠程控制人工光照。控制環境園藝(CE)是借助數字技術來控制植物生長的一種奇妙方式,它正在成為一種越來越重要的機制,協助穩定地球糧食供應鏈。與室內垂直農場一樣,有時我們的園藝項目無法保證光照度,這時使用人工智能照明就非常重要。 本項目將利用Medium One端到端物聯網云平臺,允許終端用戶監控、自動化和遠程控制園藝設施中的人工照明,無論是溫室、垂直農場還是其他需要此類功能的環境,都適用。 準備材料 本項目將使用支持快速原型設計的Microchip Xplained開發板系列,以及SAM W25 Xplained Pro評估套件。Xplained開發板搭載基于Arm®Cortex®-M0+的ATSAMD21G18A微控制器。其他關鍵組件包括: 1、Sparkfun TEMT6000環境光傳感器 2、開關電源(額定值為75.6W、2.1A @ 36V) 3、Microchip MIC3202 HB LED驅動器 4、LED燈條 物料清單 物料清單(BOM)如下所示。您也可以訪問mouser.com訂購所需的零件。截至本文撰寫時,以下物料清單的價格約為125美元(USD),其中不含LED燈條。若把LED燈條計算在內,成本也就是400美元多一點。表1列出了物料清單中的物料。 工具和其他資源 以下是完成本項目所需的推薦工具列表: 運行Arduino IDE或Atmel Studio 7.0的Windows計算機 Wi-Fi網絡(802.11/b/g/n/ac) 剝線鉗 數字萬用表 尖嘴鉗 18AWG或16AWG、300V(最小值)、雙線電纜(用于室外照明) Wieland RST 16i2/3母接頭 圖1:Wieland RST 16i2/3連接器適用于可能存在濕氣的環境(例如園藝應用) 概覽 本項目中使用的傳感器和控制器板通過兩種方式與Xplained微控制器板進行通信—一種是以數字方式利用脈寬調制信號,另一種是利用微控制器的模數轉換器(ADC)所讀取的0V-5V模擬信號。 1、MIC3202 HB LED驅動器:MIC3202有兩個在邏輯電平電壓下工作的控制引腳。第一個是EN(或ENABLE)引腳。此引腳控制輸出(-LED和+LED)的開關。如果將EN引腳置高,則功率被輸送到LED電源線。相反,如果將EN引腳接地,到LED的輸出電壓將被切斷,從而關閉所有連接到輸出的LED。 第二個引腳是DIM引腳,負責控制LED的亮度。DIM引腳尋找脈寬調制(PWM)信號來作為LED亮度的控制信號。改變PWM信號的占空比將導致亮度變化—100%占空比可實現最大亮度,0%將關閉LED。 2、TEMT6000環境光傳感器:該傳感器的作用類似于一個NPN晶體管,其基極引出端由光照控制。它被配置在共集電極放大電路拓撲中,使輸入端的任何細微變化,都能讓連接到微控制器模數轉換器(ADC)引腳的CE系統輸出放大的信號。光線亮度越高,微控制器ADC輸入引腳上的電流就越大,電壓也越高。 組裝電子設備 本項目必須牢記的一點是我們要使用交流電源,安全高于一切。觸電和火災都是潛在的危險,所以要注意硬件和電線插頭。要確保電線絕緣,并準備好滅火器。最后,在將電線插入墻上的交流插座之前,檢查所有連接線兩次。另外還要注意,我是在美國,這里的電壓是120VAC,頻率為60Hz,您的設備需要根據您所在地區的電氣規格進行調整。 本項目的組裝步驟如下: LRS 75-36開關電源 1、使用一端帶有NEMA 15-5P插頭的電纜,露出電纜另一端的火線、零線和地線。 2、用萬用表確認插座孔與地線、火線和零線的對應關系。不同電纜的這幾根線顏色不一樣,所以不要太過依賴下面的圖片。 3、將電纜的火線插入電源上標有“L”的插孔。 4、將電纜的零線插入電源上標有“N”的插孔。 5、將電纜的地線插入電源上標有“G”的插孔。 6、取一英尺長的16AWG雙線室外照明電纜,并剝去兩端。 7、選擇電纜的一端,將白線插入電源的V+插孔。 8、將黑線插入電源的V-插孔。 圖2:電源接線完成。頂部為 NEMA 15-5P插頭,底部為16AWG室外照明電纜,連接到LED驅動板 MIC3202 HB LED驅動板 1、使用前面的16AWG雙線室外照明電纜的另一端,將白線焊接到VIN雙轉塔焊接端子上。 2、將黑線焊接到GND雙轉塔焊接端子上。 3、取一根6英尺長的16AWG雙線室外照明電纜,并剝去兩端。 4、選擇電纜的一端,將白線焊接到LED+雙轉塔焊接端子上。 5、將黑線焊接到LED-雙轉塔焊接端子上。 圖3:雙轉塔焊接端子 SAM W25 Xplained Pro開發板 1、將MIC3202板上的EN引腳連接到Xplained Pro開發板上的引腳5。 2、將MIC3202板上的DIM引腳連接到Xplained Pro開發板上的引腳7。 3、將MIC3202板上的GND引腳連接到Xplained Pro開發板上的GND引腳。 圖4:SAM W25板(頂部)、TEMT6000光傳感器(左下方)和LED驅動板(右下方) TEMT6000環境光傳感器 1、將3引腳公接頭焊接到TEMT6000分線板。 2、將TEMT6000板上的“VCC”引腳連接到Xplained Pro開發板上的VCC引腳。 3、將TEMT6000板上的“GND”引腳連接到Xplained Pro開發板上的GND引腳。 4、將TEMT6000板上的“SIG”引腳連接到Xplained Pro開發板上的引腳3。 圖5:TEMT6000環境光傳感器 LED燈條 1、找到連接至MIC3202板的6英尺長16AWG雙線室外照明電纜的另一端。 2、將兩根裸露的電線插入Wieland RST16i2/3母接頭。 3、將Wieland RST16i2/3母接頭連接到LED燈條上的Wieland RST16i2/3公接頭。 圖6:項目的功能框圖 軟件 在這一節,我們將詳細介紹本項目中涉及的軟件,闡述Microchip Xplained開發板所需的固件和支持文件,以及Medium One沙盒在您的網絡瀏覽器中的設置。您可以根據自己的個人喜好,使用Atmel Studio 7或Arduino IDE來編輯為本項目提供的源代碼。 為方便您使用Arduino IDE,Microchip在其GitHub網站上提供了所需的文件。在Arduino IDE中,轉到File>Preferences>Additional Boards Manager URLs,然后添加此URL:https://github.com/AtmelUniversi ... le_0.3.0_index.json 本項目的軟件分為三部分: 1、微控制器固件,使用C語言編寫。 2、向終端用戶智能手機和微控制器發送命令并從其接收命令的云應用程序,使用Python編寫。 3、Medium One提供的智能手機應用程序,針對本項目專門配置。 Microchip Xplained開發板固件 在微控制器板上運行的固件很簡單。代碼按順序執行以下操作: 設置 1、建立到主機的9600波特串行調試連接。 2、嘗試連接所需的無線網絡。 3、連接到MQTT代理。 4、訂閱MQTT代理,此代理為從Medium One發送到微控制器的所有消息提交主題。 5、將各個I/O引腳設置為輸入或輸出。 主重復循環 6、使用心跳消息輪詢MQTT服務器以保持連接。 7、讀取TEMT6000環境光傳感器的讀數。 8、確定系統處于手動還是自動模式。 9、如果是處于自動模式,則通過將0至1023的數字化亮度信號映射到255至0的值來控制在DIM引腳上發送的PWM信號的占空比,從而調整LED亮度。 10、如果處于手動控制模式,則通過將用戶智能手機上設置的0%至100%的設定值映射到255至0的值來控制在DIM引腳上發送的PWM信號的占空比,從而調整LED亮度。 11、檢查自上次向MQTT代理發送消息以來是否至少經過了1000毫秒。如果是,則向代理發送包含環境光傳感器最新讀數的新消息。 12、處理從MQTT代理接收的任何消息。 13、將收到的消息輸出到串行端口。 14、將有效載荷轉換為字符串。 15、確定字符串是否正在請求打開或關閉手動控制;或者確定它是不是應指定為手動亮度設定值的整數。 關于項目中使用的map函數的簡要說明——map函數的定義如下: map(value, fromLow, fromHigh, toLow,toHigh) map函數可用于將數字從一個范圍映射到另一個范圍。例如,模數轉換器(ADC)的分辨率為1024,而analogWrite函數只接受0到255的值。map函數接受5個參數,包括: 1、要映射的數字。 2、當前范圍值的下限。 3、當前范圍值的上限。 4、目標范圍值的下限。 5、目標范圍值的上限。 map函數將返回映射到新范圍的整數。例如: X=map(50, 1, 100, 1, 200); 在這個示例中,x將設置為100,因為50是原來1和100范圍內的中間值,而100是新范圍內的中間值。 項目文件 以下文件位于:https://github.com/Mouser-Electr ... orticultureLighting。 MicrochipHorticultureLighting.ino:用于本文任務的項目特定代碼存儲在此文件中。它基于Medium One提供的示例,演示嵌入式設備如何與物聯網平臺的后臺交互。 secrets.h:在使用公開發布的項目時,始終存在泄露敏感數據(如密碼或API密鑰)的風險。我們可以創建一個未發布的頭文件來存儲這些信息,而不是直接將這些信息硬編碼到固件中,這樣就不必在每次Git提交之前更改代碼。 庫 預處理器指令#include允許我們將庫添加到項目中,從而促進代碼復用。除非您有非常特殊的需求,否則就不需要再重新編寫代碼。本項目使用以下庫: ArduinoMQTTClient.h:這個庫為基于MQTT的服務提供一個方便的接口。 WiFi101.h:這個庫提供ATWINC1500芯片接口,以簡化與Wi-fi網絡的交互。 圖7:來自微控制器和智能手機應用程序的原始數據流 變量與常量 前幾個變量是存儲各種必要信息的字符數組。首先,SSID和WPA2是連接到所需無線網絡的密鑰。接下來,broker和port存儲MQTT服務器的URL及其使用的TCP端口。然后,topic和subtopic存儲URL路徑,并通過MQTT消息從Medium One接收數據或將數據提交到Medium One。最后,pubMessageStart和pubMessageEnd是消息的固定部分,它們將亮度讀數發送到Medium One。 char ssid[ ]=SECRET_SSID const char broker[ ]=SECRET_BROKER const int port=SECRET_PORT char pass[ ]=SECRET_PASS const char topic[ ]=SECRET_TOPIC const char subtopic[ ]=SECRET_SUBTOPIC const char pubMessageStart[ ]="{"event_data":{"lux":"" const char pubMessageEnd[ ]=""}}" 接下來,有幾個常量用于控制硬件的功能和交互。 const int lightSensorPin=3:設置ADC輸入引腳,用于接收來自TEMT600光傳感器的輸出信號。 const int DIMControlPin=7:將PWM引腳設置為連接到LED驅動板上DIM引腳的輸出,用于控制LED的亮度。 const int ENControlPin=5:將GPIO引腳設置為連接到LED驅動板上EN引腳的輸出,用于打開或關閉驅動板的輸出。 const long interval=1000:將發往Medium One服務器的傳輸間隔設置為1000毫秒(即1秒)。 接下來,還有幾個常量用于控制硬件的功能和交互。 unsigned long previousMillis=0:跟蹤上次向MQTT代理發送消息時的時間戳。 unsigned int manualBrightSetPoint=100:存儲處于手動控制模式時LED亮度級別的設定值。 unsigned int setBrightPWM=255:將轉換后的設定值存儲在連接到LED驅動板上DIM引腳的PWM引腳所需的占空比值中。 unsigned int sensorBrightnessReading=0:存儲從TEMT6000環境光傳感器獲取的最新亮度讀數。 bool manualMode_ON=false:一個布爾變量,用于跟蹤用戶希望系統在手動還是自動控制模式下運行。 最后,我們還提供各種類的示例: WiFiClient:創建WiFi客戶端類的實例,該實例允許ATSAMD21G18A芯片與ATWINC1500 wifi芯片交互,并建立到Wi-Fi網絡的連接。 MQTTClient:創建MQTT客戶端類的實例,該實例允許固件通過簡單的函數調用與Medium One的MQTT代理交互。 函數 void setup():要運行的第一個函數將初始化所需的許多硬件和軟件組件,如串行通信、Wi-Fi連接、傳感器接口以及與GPIO引腳的交互。 void loop():這是將持續運行的功能的核心。注意確保主循環的代碼盡量簡單,并將功能分配給專門的函數承擔,每個函數負責執行項目運轉所需的某項任務。 void onMQTTMessage(int messageSize):此函數處理從Medium One服務器接收的任何消息。 配置Medium One Medium One為物聯網開發人員提供了一個平臺,在這個平臺上開發人員的物聯網設備可以傳輸和編譯來自多個物聯網設備的數據集。Medium One提供了一個很棒的教程,介紹如何開始使用其服務。本指南將重點介紹我們在設置Microchip Xplained通過其MQTT API與Medium One通信時遇到的問題。本項目將利用Medium One的MQTT(消息隊列遙測傳輸)協議。MQTT是一個基于發布-訂閱的消息傳遞協議,位于TCP/IP協議之上。與RESTful API相反,MQTT需要一個集中式消息代理。因此,端點設備不能彼此直接通信。這有利也有弊。RESTful API依賴客戶機始終啟動通信,而MQTT由于使用了發布/訂閱(Pub/Sub)架構,允許服務器推送數據。RESTful設備可以直接相互通信。MQTT依賴于集中式消息代理(例如,云中的服務器),在傳輸此類遙測數據時效率要高得多。 圖8:Medium One的配置畫面 第一步是在https://www.medium.one上創建一個免費帳戶。有了帳戶后,需要從其Web用戶界面的右上角創建一個新項目。 新項目激活后,必須記下Medium One自動生成的一些關鍵信息,以便后面在固件中使用(具體來說,就是把這些信息存儲在secretstuff.h頭文件中)。這些關鍵信息包括: Project ID:這個字母數字字符串是分配給項目的唯一標識符。它讓Medium One知道,如果有多個項目托管在他們的web服務上,需要將Microchip Xplained開發板環境數據傳送到哪個項目。 API Key:這個自動生成的字母數字字符串,允許我們登錄并使用Medium One的API服務。 MQTT ID:每個項目可以有多個貢獻者。注意,登錄ID與MQTT ID不同。MQTT ID是Medium One生成的字母數字字符串。登錄ID是終端用戶創建的人類可讀字符串。例如“sallymsith”。固件需要的信息是MQTT ID而不是登錄ID。 User Password:這是每個用戶在為項目建立帳戶時創建的密碼。出于安全原因,它不會顯示在任何地方,因此請務必記住此密碼! 接下來,我們確定可以從Medium One 網站的哪個地方獲取這些信息: Setup->Project Info:此處將顯示Project ID。 Setup->Manage Users:此處包含Login ID和用戶的MQTT ID。請記住,固件需要的是MQTT ID,而不是Login ID。 Setup->Manage API Keys:這里可以找到API Key。 固件還需要另外兩項關鍵信息:Medium One MQTT服務器URL(MQTT.mediumone.com)和TCP端口,端口值為61619(非安全)或61620(安全)。最后,我們需要設置一個儀表板,看是否收到了來自Microchip Xplained開發板的數據。為此我們需要: 轉至Dashboard并選擇Single User Real-Time Events Stream選項。 從下拉框中選擇要查看的用戶。 這將創建儀表板并開始監聽數據。如果綠色播放按鈕可見,則單擊它開始收聽。否則,將有一個紅色的暫停按鈕,可用于在需要時暫停饋入。 如果一切正常,來自Microchip Xplained開發板的原始MQTT數據包應開始在瀏覽器中顯示。請確保Microchip Xplained開發板通過計算機的USB連接供電,或通過墻壁上的交流電源插座供電。 云和智能手機應用程序 Medium One提供易于使用的資源,創建與物聯網設備交互的基本智能手機應用程序。這些應用程序目前僅適用于iOS設備,但預計將來也會支持Android。 對于本項目,請下載Medium One在Apple iOS App Store上提供的專用"IoT Controller"。 圖9:Medium One Workflow Studio 圖10:將新的小部件添加到智能手機應用程序中 要詳細了解設置手機應用程序的步驟說明,請點擊查看Medium One的教程。本節將重點介紹此特定項目需要完成的工作。我們將從添加新的小部件開始,讓用戶控制燈光是自動控制模式還是手動控制模式。 1、在智能手機應用程序上,單擊+Add New Widget。 2、選擇Switch。 3、在Stream中輸入raw。 4、輸入“ManualControl”作為標簽。 5、單擊Done。 6、單擊Save。 7、撥動開關并查找要在Real Time Events Stream中顯示的消息。 8、回到臺式機上,從Medium One儀表板單擊Config>Data Streams>Raw。 9、確保raw.manualControl標簽勾選了Active復選框。 10、從Medium One儀表板單擊Workflow Studio > Create。 11、將其命名為類似“Switch for Manual Control”的名稱。 12、在屏幕的右側,選擇Tags & Triggers>raw>manualControl并拖到Studio屏幕上。 13、在屏幕的右側,選擇Modules>Foundation>Base Python并拖到Studio屏幕上。 14、雙擊Base Python模塊并在Script部分輸入以下代碼: import MQTT mode=IONode.get_input('in1')['event_data']['value'] if(mode == "on"): MQTT.publish_event_to_client('device1','manualControl_ON', encoding='utf-8') else: MQTT.publish_event_to_client('device1','manualControl_OFF', encoding='utf-8') 15、按Save and Activate。 16、撥動智能手機上的開關,確認在打開和關閉manualControl的情況下分別顯示manualControl_ON和manualControl_OFF消息。 圖11:完成時的用戶界面(UI) 接下來,讓我們創建一個滑塊來控制LED的亮度。 1、在智能手機應用程序上,單擊+Add New Widget。 2、選擇Switch。 3、在Stream中輸入raw。 4、輸入“ManualBrightnessSetPoint”作為標簽。 5、單擊Done。 6、單擊Save。 7、上下滑動開關,查找要在Real Time Events Stream中顯示的消息。 8、回到臺式機上,從Medium One儀表板單擊Config>Data Streams>Raw。 9、確保為raw.ManualBrightnessSetPoint標簽勾選Active復選框。 10、從Medium One儀表板單擊Workflow Studio>Create。 11、將其命名為類似“Set Manual Brightness Level”的名稱。 12、在屏幕的右側,選擇Tags & Triggers>raw>ManualBrightnessSetPoint并拖到Studio屏幕上。 13、在屏幕的右側,選擇Modules>Foundation>Base Python并拖到Studio屏幕上。 14、雙擊Base Python模塊并在Script部分輸入以下代碼: import MQTT level=IONode.get_input('in1')['event_data']['value'] MQTT.publish_event_to_client('device1',str(level), encoding='utf-8') 15、按Save and Activate。 撥動智能手機上的開關,確認顯示的消息包含0到100之間的字符串值(整數)。 圖12a:負責處理智能手機交互的后臺代碼。頂部:設置手動亮度設定值。底部:打開和關閉手動模式 圖12b:底部:打開和關閉手動模式 圖13:使用智能手機控制照明 運行中的項目 在項目編譯好之后,將Xplained開發板連接到計算機并啟動串行終端。您應該能遙測到來自光傳感器的數據流以及發往和來自Medium One MQTT代理的MQTT消息。如果沒有,請檢查是否有錯誤消息。一些常見錯誤包括: 1、電源的火線、零線、地線接錯。 2、電源或LED驅動板上的V+和V-接反。 3、LED燈條或LED驅動板上的LED-和LED+接反。 4、傳感器的電源線和地線接反。 5、如果給設備供電,確保電源至少能提供1A的電流。 6、無線網絡未運行,或者SSID/安全密鑰輸入錯誤。 圖14:左側:亮度約為50%、右側:亮度約為90% 文章來源:貿澤電子 作者簡介:專業工程師Michael Parks是貿澤電子的特約作者,同時也是GreenShoe Garage的所有者。Green ShoeGarage是一個提供定制電子設計的工作室和技術咨詢機構,位于馬里蘭州南部。MichaelParks創辦了《S.T.E.A.M. Power Podcast》播客來提升公眾對科技的認知,他擁有馬里蘭州專業工程師資質并擁有約翰·霍普金斯大學的系統工程碩士學位。 |