對于我們這些北半球的人來說,三伏天的夏天快結束了。但是,雖然這個有趣、無憂無慮的季節就在這里,但大部分時間陽光明媚,隨之而來的是可能有害的紫外線 (UV) 輻射。在本系列的最后一篇文章中,我們將構建我們的電路并對 Arduino MKR1000 進行編程以執行我們之前建立的功能。此外,請務必閱讀本系列的第二篇博客,以更好地了解陽光下安全樂趣背后的科學原理。
快速回顧一下,這些是您的紫外線監測器和警報項目的頂級要求。您的設備應該:
持續檢測紫外線輻射暴露水平。
確定暴露是否超過了預先指定的限制。
如果超出暴露限值,則觸發一個有趣且異想天開的警報。
能夠重置曝光計數。
電池供電。
將曝光數據發送到云端以供將來分析(請注意,此步驟有助于教孩子們如何閱讀圖表和圖形。)
簡而言之,這個項目的目標是建立一個設備來監測我們暴露在陽光下的情況,讓我們知道什么時候應該在室內休息一下或者多涂一些防曬霜。這是預制購物車中的物料清單 (BOM) ,如果您在之前的博客中錯過了它。話雖如此,讓我們開始吧!
組裝硬件
您可能還記得本系列的第 2 部分,我們將使用Silicon Labs Si1145 傳感器來監測我們的陽光照射。我們將通過 I2C 串行接口將傳感器數據傳送到Arduino MKR1000嵌入式開發平臺。MKR1000 將處理數據處理和與云數據庫的通信,以存儲所有數據供以后分析。MKR1000 還可以方便地使用鋰聚合物 (Li-Po) 電池供電,這讓我們可以在享受陽光的同時將設備帶到戶外。
以下是您和您年輕有抱負的工程師構建此電路的步驟概要(圖 1 中的硬件原理圖和圖 2中的電路圖也提供了可視化圖示。):
將 MKR1000 放在面包板的邊緣,確保微型 USB 端口懸掛在末端。要指示 MKR1000 上的唯一引腳,請使用白色條紋,因為這是接地引腳。
將 Si1145 UV 傳感器(帶有插頭引腳)放置在面包板與 MKR1000 接地引腳相同的一側。
將 MKR1000 的接地引腳和 Si1145 紫外線傳感器的接地引腳連接到面包板的接地(藍色)導軌。
將 MKR1000 的 Vcc 引腳和 Si1145 紫外線傳感器的 Vin 引腳連接到面包板的電源(紅色)軌。
將微控制器和傳感器的 I2C 端口連接在一起。將 D12 (SCL) 引腳連接到 Si1145 紫外線傳感器上的 SCL 引腳。這是共享時鐘信號。然后,將 D11 (SDA) 引腳連接到 Si1145 紫外線傳感器上的 SDA 引腳。這是兩個設備之間的共享數據總線。
測試到目前為止建立的連接,以確保您已正確連接所有內容。為此,請轉至Mouser 的 GitHub站點并上傳 Arduino STEAMYSummer2018_MRK1000.ino 文件和 Wifi_Info.h 文件。成功加載代碼后,啟動 Arduino 集成開發環境 (IDE) 的串行監視器并確保您獲得可見光、紅外線 (IR) 和紫外線傳感器讀數。如果您在 MKR1000 上沒有看到綠色發光二極管 (LED) 或在串行監視器中收到錯誤消息“找不到 Si1145”,請務必再次檢查接線圖(圖 2)。
圖 1:此硬件原理圖說明了引腳設置。(來源:作者)
圖 2:此電路圖說明了面包板布局。(來源:作者)
硬件設置的第一部分完成后,讓我們將注意力轉向用戶界面組件。回想一下,對于警報,我們將使用壓電蜂鳴器,它肯定會引起附近任何人的注意。具體來說,選擇的蜂鳴器是 TDK Corporation 的PS1240P02BT,因為它的工作電壓為 3V。我們還將添加一個電阻器和晶體管來幫助為蜂鳴器供電并確保它驅動足夠的電流以使蜂鳴聲明顯。來自通用輸入/輸出 (GPIO) 引腳的電流限制為 7mA。微控制器的 GPIO 引腳(“D6”引腳)應打開晶體管并允許您:
將 NPN 晶體管放在面包板上。
將蜂鳴器的紅線連接到電源(紅色)導軌。
將黑線連接到晶體管的集電極引腳。
在面包板上放置一個 1kΩ 電阻,將一根導線連接到 NPN 晶體管的基極,然后將另一根電阻導線連接到 MKR1000 的 D6 引腳。
將 NPN 晶體管的發射極引腳連接到面包板的接地(藍色)導軌。
回想一下,一旦觸發警報,我們需要一種重置設備的方法。為完成此要求,我們選擇了一個常開 (NO)瞬時按鈕。一個 10kΩ 的下拉電阻將用于將連接到微控制器 GPIO 引腳的按鈕接地,以防止任何浮動輸入。現在讓我們連接它們(圖 3):
接下來連接按鈕,將按鈕的一側掛在電源(紅色)導軌上。
將 10kΩ 電阻的一個端子連接到按鈕的另一側。
將電阻器的剩余端子接地。
將 MKR1000 D7 引腳連接到電阻器和按鈕的連接點。
圖 3:此印刷電路板 (PCB) 圖像說明了布局。(來源:作者)
該電阻用作下拉電阻,確保 MKR1000 上的 GPIO 引腳在未按下按鈕時始終處于干凈的接地狀態。如果沒有電阻器,該引腳容易受到噪聲的影響,這可能會導致微控制器錯誤地檢測到按鈕按下。
使用軟件
圖書館
貿澤為此項目開放的庫包含以下工具、資源和功能:
#include
提供使用 I2C 串行通信協議所需的代碼。
#include “Adafruit_SI1145.h”
提供一組易于使用的函數,用于與環境光傳感器進行交互。
#include
#include
允許安全的 Wi-Fi 通信。
#include "Wifi_Info.h"
存儲服務集標識符 (SSID)、Wi-Fi 保護訪問 II (WPA2) 密碼和 IFTTT(我們將在本文后面討論的工具)應用程序接口 (API) 密鑰。將這些安全項目放在單獨的文件中是一個好習慣,這樣如果您共享代碼,就不必在每次共享修訂版時都記住刪除這些敏感信息。
圖 4提供了在 Arduino IDE 中編寫的源代碼示例。
圖 4:這是在 Arduino IDE 中編寫的源代碼。(來源:作者)
關鍵變量
靜態常數 int DELAY_AMT = 60000;
此變量等于 60,000 毫秒或 60 秒。它允許我們將傳感器讀數的數量限制為每分鐘一個。
靜態常數 int AVG_ARRAY_SIZE = 60;
由于我們關心的是前一小時的平均 UV 讀數,并且我們每分鐘讀取一個讀數,因此該變量將使我們能夠對需要的 60 個讀數進行平均,以找到前一小時的當前平均 UV 指數。
static const int BUZZER_PIN = 6;
蜂鳴器將在 MKR1000 的 GPIO D6 引腳控制下運行。
靜態常量 int RESET_BUTTON_PIN = 7;
重置按鈕將連接到 MKR1000 的 GPIO D7 引腳。
靜態常量浮動 UV_THRESHOLD = 3.0;
如果前一小時的平均紫外線指數讀數為 3.0 或更高,則會觸發警報。
靜態常數 int TONE_FREQ = 2500;
觸發警報將產生 2,500Hz 的蜂鳴音。
char ssid[] = "MY_SSID_HERE";
在 WiFI_Info.h 文件中,務必將此默認值替換為您的本地 Wi-Fi SSID。請務必保留引號。
字符密碼[] =“MY_WPA2_KEY_HERE”;
在 WiFI_Info.h 文件中,務必將此默認值替換為您的 Wi-Fi 密碼。請務必保留引號。
char IFTTT_APP_KEY[] = "YOUR_IFTTT_APP_KEY_HERE";
在 WiFI_Info.h 文件中,確保將此默認值替換為您在為此項目創建 Webhook 時將生成的個人 IFTTT API 密鑰。請務必保留引號。
職能
無效設置()
void setup() 函數是必需的,所有初始化都將在其中進行。此初始化包括建立調試串行通信通道、設置 Wi-Fi 模塊和 Si1145 環境光傳感器,以及確保輸入或輸出的 GPIO 引腳配置正確。
無效循環(){
浮動 currentUVindexReading = takeReading();
浮動 avgUVindexReading = runningAverage(currentUVindexReading);
sendDataToCloud(currentUVindexReading);
alertCheck(avgUVindexReading);
延遲(DELAY_AMT);
}
此處展示了整個主 loop() 函數,以突出重要的編程范例。主循環應包含盡可能少的代碼。事實上,目標應該是分解代碼,讓每個函數只做一件事。依靠函數調用使代碼更易讀,更容易排除故障。從上面的 void loop() 范例中,很容易創建 MKR1000 完成 setup() 函數中規定的任務后將發生的事情的概要。
概要應按如下流程進行:首先,需要將傳感器讀數存儲在名為 currentUVindexReading 的變量中。該值傳遞給另一個函數,該函數記錄新的 UV 讀數并返回運行平均值。然后,修改后的運行平均值將傳遞給將其發送到 IFTTT 以附加到 Google 表格電子表格的函數。接下來,將平均值與閾值進行比較,結果將在必要時觸發警報。最后,系統必須暫停一分鐘,然后這個功能會重復執行。
以下是主循環中每個增量函數的代碼分解:
浮動 takeReading()
此函數與 Si1145 環境光傳感器交互。它接收讀數并在串行端口上顯示結果,然后將 UV 指數值作為浮點數返回。
浮動運行平均值(浮動新讀數)
此函數保留一個靜態數組(意味著值在函數調用返回后保留)以跟蹤去年 UV 指數的運行平均值。它以浮點數形式返回當前平均 UV 指數。
void alertCheck(浮動 avgUVindexReading)
此功能將當前平均紫外線指數與預定義閾值進行比較,并在必要時發出警報。
void generateAlert()
此函數使用 Arduino IDE 內置的 tone() 函數來生成蜂鳴器音調。它一直持續到按下重置按鈕,此時平均紫外線指數重置,設備返回監測模式。
此功能利用 IFTTT.com webhook API 將當前的紫外線指數讀數傳遞到 Google 表格電子表格,使您能夠遠程研究數據。
把它們放在一起
我們將利用名為 IFTTT(“If This Then That”的縮寫)的網絡服務來允許 MKR1000 與 Google 表格通信(圖 5)。具體來說,IFTTT 服務被稱為“Maker Webhooks”。IFTTT 在其網站上提供了有關如何使用其服務的精彩教程。結果是一個數據日志和一個漂亮的圖表,以幫助可視化數據。我們建議您通讀 IFTTT 網站上 webhook 的文檔部分,因為您需要在 Wifi_info.h 文件中包含特定于您的 IFTTT 帳戶的密鑰。
圖 5:MKR1000 通過 IFTTT 將其數據發送到 Google 表格。(作者)
如果您希望將項目從試驗板上移開并在戶外進行測試,我們會提供 EagleCAD 原理圖和印刷電路板 (PCB) 布局來幫助您。我們還提供了一個 3D 打印機就緒的 STL 文件作為容納硬件的外殼(圖 6和圖 7)。
圖 6:這是電路板屏蔽罩的 3D 渲染圖。(來源:作者)
圖 6:這個 3D 打印項目外殼包含硬件。(來源:作者)
最后,設計文件和源代碼可在 Mouser 的GitHub 存儲庫中獲取。
審核編輯黃昊宇
-
傳感器
+關注
關注
2550文章
51039瀏覽量
753087 -
Mouser
+關注
關注
3文章
160瀏覽量
52881
發布評論請先 登錄
相關推薦
評論