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