Mouser 的 STEAMy Summer:第 3 部分

电子说

1.3w人已加入

描述

Mouser

对于我们这些北半球的人来说,三伏天的夏天快结束了。但是,虽然这个有趣、无忧无虑的季节就在这里,但大部分时间阳光明媚,随之而来的是可能有害的紫外线 (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)。

Mouser

图 1:此硬件原理图说明了引脚设置。(来源:作者)

Mouser

图 2:此电路图说明了面包板布局。(来源:作者)

硬件设置的第一部分完成后,让我们将注意力转向用户界面组件。回想一下,对于警报,我们将使用压电蜂鸣器,它肯定会引起附近任何人的注意。具体来说,选择的蜂鸣器是 TDK Corporation 的PS1240P02BT,因为它的工作电压为 3V。我们还将添加一个电阻器和晶体管来帮助为蜂鸣器供电并确保它驱动足够的电流以使蜂鸣声明显。来自通用输入/输出 (GPIO) 引脚的电流限制为 7mA。微控制器的 GPIO 引脚(“D6”引脚)应打开晶体管并允许您:

将 NPN 晶体管放在面包板上。

将蜂鸣器的红线连接到电源(红色)导轨。

将黑线连接到晶体管的集电极引脚。

在面包板上放置一个 1kΩ 电阻,将一根导线连接到 NPN 晶体管的基极,然后将另一根电阻导线连接到 MKR1000 的 D6 引脚。

将 NPN 晶体管的发射极引脚连接到面包板的接地(蓝色)导轨。

回想一下,一旦触发警报,我们需要一种重置设备的方法。为完成此要求,我们选择了一个常开 (NO)瞬时按钮。一个 10kΩ 的下拉电阻将用于将连接到微控制器 GPIO 引脚的按钮接地,以防止任何浮动输入。现在让我们连接它们(图 3):

接下来连接按钮,将按钮的一侧挂在电源(红色)导轨上。

将 10kΩ 电阻的一个端子连接到按钮的另一侧。

将电阻器的剩余端子接地。

将 MKR1000 D7 引脚连接到电阻器和按钮的连接点。

Mouser

图 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 中编写的源代码示例。

Mouser

图 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 帐户的密钥。

Mouser

图 5:MKR1000 通过 IFTTT 将其数据发送到 Google 表格。(作者)

如果您希望将项目从试验板上移开并在户外进行测试,我们会提供 EagleCAD 原理图和印刷电路板 (PCB) 布局来帮助您。我们还提供了一个 3D 打印机就绪的 STL 文件作为容纳硬件的外壳(图 6和图 7)。

Mouser

图 6:这是电路板屏蔽罩的 3D 渲染图。(来源:作者)

Mouser

图 6:这个 3D 打印项目外壳包含硬件。(来源:作者)

最后,设计文件和源代码可在 Mouser 的GitHub 存储库中获取。 

审核编辑 黄昊宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分