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