0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Mouser 的 STEAMy Summer:第 3 部分

梁宏满 2023-01-05 09:43 次阅读

poYBAGOzf4GAKRHZAAKucJVMdhU778.jpg

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

pYYBAGOzf4SAIgnlAABdyoq-hJg611.jpg

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

poYBAGOzf4iAFP_HAACPFC4JKlY194.jpg

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

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

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

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

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

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

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

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

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

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

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

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

poYBAGOzf4uAUQypAADO2FzQ38k665.jpg

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

poYBAGOzf46AXY7ZAADHVQrXLXE709.jpg

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

pYYBAGOzf5KAOv45AADDDCQcjvo696.jpg

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

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

poYBAGOzf5WAcFAiAABpyxLfO-U859.jpg

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

pYYBAGOzf5eAfCqnAACz2WMeNJ8188.jpg

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

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

审核编辑黄昊宇

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

    关注

    2525

    文章

    48134

    浏览量

    740228
  • Mouser
    +关注

    关注

    3

    文章

    160

    浏览量

    52767
收藏 人收藏

    评论

    相关推荐

    NEPCON China 2024同期会议一览

    联系我们 咨询热线 孙梅 女士(Summer Sun) 电话:400 650 5611 +86 182 3187 0376 邮箱:mei.sun@rxglobal.com 主办单位
    发表于 04-11 14:06 127次阅读
    NEPCON China 2024同期会议一览

    【米尔-瑞萨RZ/G2UL开发板】3.杂项测试

    last_summer.mp3 root@192.168.0.100:/home/root iptables 默认允许 ping ping 192.168.0.102 -n 4 添加防火墙规则 iptables
    发表于 02-28 15:25

    AD7655并行模式工作,为何采集的数据无论什么时候16bit中都是3~0位为F,变化的是4~11位?

    AD7655并行模式工作,为何我采集的数据无论何时候16bit中都是3~0位一直为F,变化的是4~11位,在原理图设计中我将byteswap引脚接地了,在sigtap中采集的波形图如下,急求指点呀
    发表于 12-22 07:22

    AD7794的2脚CLK和19脚PSW可以悬空么?

    大家好,我想请问一下:AD7794的2脚CLK和19脚PSW可以悬空么?也就是说我用内部时钟,不用外部时钟, 19脚就不需要接什么了吧?
    发表于 12-19 06:44

    AD9704BCPZ达不到datasheet里面的最大值是什么原因导致的?

    现有客户在Mouser渠道购买的型号为AD9704BCPZ,数量为160pcs的物料,在参照原厂相关datasheet的指导下随机抽样6pcs进行测试,6pcs的最大输出更新率fCLOCK测试结果
    发表于 12-11 06:58

    AD2S1210异常发热的原因有哪些?

    我司最近设计的一款产品中使用了贵司的AD2S1210芯片,使用中出现了以下问题,调试了很久不能解决,希望给予支持。 首先芯片从mouser采购,可以保证是正品。 系统上电时会有部分概率出现
    发表于 12-11 06:23

    执行部分第7段 ADI

    电子发烧友网为你提供ADI(ADI)执行部分第7段相关产品参数、数据手册,更有执行部分第7段的引脚图、接线图、封装手册、中文资料、英文资料,执行部分第7段真值表,执行部分第7段管脚等资
    发表于 10-11 19:06
    执行<b class='flag-5'>部分</b>第7段 ADI

    Android Runtime源码解析》+学习心得首发(3

    的基础进行介绍;2部分包括2~4章,主要介绍ART中的compiler部分,包括dex2oat工具,属于编译时阶段;
    发表于 09-28 13:09

    STEVAL-IPMNG3Q数据手册

    STEVAL-IPMNG3Q 是一种基于 SLLIMM™-nano(小型低损耗智能成型模块) 2 系列产品(STGIPQ3H60T-H)的紧凑型电机驱动电源板。该产品为驱动大功率电机提供了一种经济
    发表于 09-13 07:01

    如何在Keil uVision3 IDE中基于ARM开发板调试和运行程序

    调试代理。 本应用笔记包含以下部分: 1.获取必要的材料4页介绍了所需的材料以及从哪里获取这些材料。 这包括基于ARM的开发板、Keil uVision3 IDE、JTAG编程加密狗和H-JTAG调试
    发表于 08-29 06:21

    ARM CoreTile Express A15×2 A7×3技术参考手册

    以下部分: • • • • • • 系统互连信号概述 高速总线 (HSB) 到其他子板,见 2-8 页 静态内存总线 (SMB) 见 2-8 页 多媒体总线 (MMB) 见 2-
    发表于 08-02 10:25

    AMBA重映射和暂停模块用户手册

    本文档提供了有关“重新映射和暂停”模块的信息,该模块连接到高级外围总线(APB)。它包含以下部分: •关于AMBA重新映射和暂停,见1-2页 •1-3页的硬件接口和信号说明 •
    发表于 08-02 07:51

    当连接4个电池单元时,bms显示4个电池为0V是为什么?

    我最近买了 RDDRONE-BMS772。连接 4 节电池,3 节电池显示正确电压,但 4 节电池显示 0v。请参考图片,任何人都可以指出我还可以做些什么来纠正这个问题吗? BMS 显示屏显示电池 4 为 0V 黄色
    发表于 06-07 07:36

    变压器部分的识读

      这是一张典型的低压系统图,主要就包括这么几个部分,顶上的,是变压器部分,这个图纸是有两个变压器供电的,左右两边互为备用。 01 低压系统图:变压器部分的识读 ▲ 变压器部分 为了方
    的头像 发表于 05-30 09:24 2881次阅读
    变压器<b class='flag-5'>部分</b>的识读

    在哪里可以买到可以焊接到性能板上的CPU插槽?

    我在哪里可以买到可以焊接到性能板上的 CPU 插槽?如果我不想直接焊接到穿孔板上,请问Mouser或Digikey叫什么名字?
    发表于 05-11 07:41