这是一种使用 Android 设备上的蓝牙通信以及支持蓝牙的 Arduino 来控制和监控紫外线杀菌灯的方法。该蓝牙控制模块是为岭南大学岭南创业计划的“紫外光”计划设计的,用于控制紫外线杀菌灯。该项目所使用的灯能够对香港的低收入住房进行消毒。在 COVID-19 大流行期间,来自当地非政府组织的志愿者使用这些灯对香港 1000 多个低收入住宅进行了消毒。这些蓝牙控制的灯设计为安全、耐用且易于使用。该项目由岭南大学、香港大学社会工作及社会行政学系合作,由香港赛马会慈善信托基金资助的明爱青年及社区服务和健康行动
该项目可用于控制任何紫外线(或传统灯),但专门设计并使用 Project Ultra-Violite 灯进行了测试。
该项目存在使用交流电源以及 C 波段紫外线的风险。
使用主电源并与之交互是危险的。此项目中的接线只能由受过培训且能够熟练使用主电源的人员完成。如果您不熟悉交流电源的安全要求,请向受过适当培训的技术人员寻求帮助。
C波段的紫外线对眼睛和皮肤有害。接触会导致失明和灼伤。切勿以您或其他生物可能以任何方式暴露在光线下的方式操作灯。您必须确保没有人与灯光在同一个房间内,或在灯光运行时可能暴露在灯光下的任何位置。
该项目由四个主要组件组成:将 Arduino Nano BLE 连接到传感器和紫外线灯的电路,用于与传感器和灯交互的 Arduino 代码,使用 MIT App Inventor 创建的用于交互和监控灯的 Android 应用程序,以及用于将控制器连接到三脚架的 3D 打印支架。
这些灯使用常见的市售硬件,并带有一些可选的 3D 打印部件以帮助组装。让我们回顾一下制作灯所需的零件的详细信息:
电路的核心是 Arduino Nano BLE Sense。这提供了使用 Android 设备通过蓝牙与电路进行通信的能力。Arduino 从四个传感器接收信息——三个 PIR 传感器和一个 UV-C 传感器。PIR 传感器连接到 Arduino 的三个数字引脚,每个引脚都连接到 5V 电源和接地。UV-C 传感器连接到 Arduino 的模拟引脚之一,以及 5V 电源和接地。
Arduino 有两个主要输出,10A 继电器和一个状态 LED。继电器充当开关来打开和关闭灯的电源。它通过电平转换器连接到 Arduino,因为 Arduino Nano 工作在 3.3V,继电器只能由 5V 信号触发。电平转换器连接到来自 Arduino Nano 的 3.3V 电源(用于 3.3V 逻辑参考)、来自稳压器的 5V 电源(用于 5V 逻辑参考)和公共接地。电平转换器还有一个使能引脚,当驱动为高电平时,该引脚使能电平转换器的输出。因此,它通过一个 1K 欧姆电阻连接到 Arduino Nano 上的数字引脚。继电器还连接到 5V 电源和接地。灯的带电电源线穿过继电器,可以打开和关闭。
状态 LED 通过 1K 欧姆电阻连接到 Arduino 的数字引脚。它充当控制单元的电源和连接状态的视觉指示器。
通过使用 HiLink HLK-PM01 5V AC/DC 稳压器提供电源。它通过 13 安培保险丝连接到主电源。如果您接受过适当的培训并且习惯于使用交流电源,则可以在电路中包含此稳压器来为这些其他组件供电。如果没有,则使用其他电源,例如小电池或手机充电器。如果您选择使用手机充电器,可以通过 USB 端口连接到 Arduino。原理图的重置保持不变。如果您选择使用 HiLink HLK-PM01,您可以考虑使用来自 OpenHardware 的分线板:该分线板使用两种类型的保险丝和压敏电阻增加了安全性。
您可以根据下面的示意图将电路组装在面包板、原型板、条板或其他类似平台上。虽然我们尚未为该电路创建印刷电路板,但如果其他人希望这样做,我们已经包含了初步的 Eagle 文件。
由于该项目包括交流电源,因此适当的外壳对于防止意外接触高压非常重要。我们使用了尺寸为 150 毫米 x 70 毫米 x 27 毫米的通用塑料电气外壳。我们用热胶安装了原型板、继电器和 3D 打印部件。
我们还设计了一个支架,将盒子和 PIR 运动传感器连接到用于固定灯的 Phottix P220 三脚架上(请参阅我们在此处构建灯的教程)。CAD 文件包含在本教程中,但可能需要针对不同尺寸的外壳或三脚架进行修改。
Arduino 代码是使用 ArduinoBLE 库编写的。低功耗蓝牙设备可以是外围设备,充当服务器来保存正在通信的信息,也可以是中央设备,它向外围设备查询数据,并可以修改外围设备中包含的数据。在我们的实现中,Arduino 是外围设备,连接的 Android 设备是中央设备。
低功耗蓝牙通信以服务为中心,允许组织设备之间通信的数据。每个服务都包含多个特征,这些特征包含特定的数据。在此示例中,有一个服务(“lightService”服务)和四个特性。有一个 Characteristic 保存关于继电器是否应该打开或关闭的数据,一个保存关于运动传感器是否已被触发的数据,一个保存来自 UV-C 传感器的数据,一个保存关于是否有任何数据的数据Android 设备连接到 Arduino。这些服务和特征在草图的开头定义,如下面的代码块所示。
在草图的开头还定义了本地名称。这很重要,因为 Android 应用程序会在自动连接到灯时搜索此名称的一部分。例如,我们的 Android 应用程序版本在可用蓝牙设备的名称中搜索短语“LU_Light”。如果它找到这个短语,它会自动连接。因此,我们使用的灯光被命名为“LU_Light_1”、“LU_Light_2”、“LU_Light_3”等。因此,您应该选择设置 LocalName 以包含您编写 Android 应用程序要搜索的任何短语。更多内容在下面的“Android 应用程序”部分中进行了解释。
代码的下一部分是Arduino引脚的标准定义和变量的初始化:
在设置部分,看门狗定时器首次出现。看门狗定时器用于处理 Arduino 的任何意外断开连接或冻结。此计时器倒计时所需的时间(在本例中为 2 秒)。通过在代码中调用resetWDT()
战略位置,我们可以确保计时器不会达到零。如果该resetWDT()
命令从未被调用并且计时器达到零,这意味着 Arduino 在下一个resetWDT()
命令之前已冻结或断开连接。因此,看门狗定时器重新启动 Arduino,允许我们重新连接到它。这一点尤其重要,因为用户始终能够监控灯的状态并在必要时关闭灯是至关重要的。
此草图中的看门狗定时器特别有用,因为使用 ArduinoBLE 库的 Arduino Nano BLE 存在一个已知错误。Arduino Nano BLE 无法正确识别断开事件。因此,如果 Android 设备意外断开连接,Arduino 可能会继续像已连接一样,然后无法重新连接和监视或控制灯。为了克服这个问题,Arduino 监听来自 Android 设备的轮询消息。如果它收到此消息,我们知道它们仍然正确连接,并且可以重置看门狗定时器并且 Arduino 继续正常运行。如果没有及时收到轮询消息,则看门狗定时器不会重置,达到“零”,并重新启动 Arduino。
特别感谢 Arduino 用户dniklewicz提出使用看门狗定时器的建议。
在下面的代码片段中,enableWDT()
和resetWDT()
是在草图末尾定义的函数。在这个片段中,我们也可以看到 resetWDT() 函数的第一次使用。我们尝试启动蓝牙库。如果它无法开始,我们会保持 LED 闪烁以指示出现问题。该resetWDT()
函数用于 while 循环中,以防止看门狗定时器达到零和 Arduino 重新启动。
在下一节中,配置蓝牙服务。接下来,将特征添加到服务中,确保其数据对连接的设备可见。此外,还附加了运动传感器的中断。如果运动传感器检测到运动,它将触发此中断。
下一部分开始循环,该循环将重复运行。在循环中,Arduino 监听要连接的设备。如果没有连接,LED 会闪烁。我们在这里看到另一个resetWDT()
确保看门狗定时器不会启动 Arduino 的重启。
下一部分处理运动传感器。正如稍后将在草图中看到的那样,在最初打开灯后的三秒钟内,运动传感器被禁用。这是因为我们发现当灯打开时发生的突然的光线变化错误地触发了运动传感器。因此,我们在打开灯后短时间内禁用运动传感器。如果自灯打开以来已经足够长(大约 3 秒),我们重新启用运动传感器。
如果运动传感器已被触发(由草图末尾的中断服务程序motionFlag
设置为),那么我们更改 motionCharacteristic 的值,该值将自动报告给连接的设备并向用户显示一条消息。我们还通过切换继电器自动关闭灯。最后,设置为以便以后可以在需要时再次触发。true
motionDetected()
motionFlag
false
下一节处理来自其他特征的数据。首先是connectionCharacteristic
,它跟踪 Android 设备是否仍处于连接状态。它通过侦听0x01
Android 设备发送的值来实现。这表明它们仍处于连接状态,因此看门狗定时器被复位。如果 Android 设备发送 0x00,这表明用户希望断开与灯的连接。
这switchCharacteristic
是灯的“开/关”开关。如果 Android 设备发送0x01
,则用户已按下“开启”按钮。因此继电器打开(由低信号触发)。如上所述,运动传感器也被暂时禁用以避免由于灯的快速闪烁而导致错误触发,并且记录时间以便可以在大约三秒内重新启用运动传感器。如果0x00
发送了字节,则用户希望关闭灯并关闭继电器(设置为高电平)。
由于出于安全原因,用户在操作时不能与灯在同一个房间,因此我们配备了一个紫外线传感器,以便他们可以验证灯是真正打开还是关闭。紫外线传感器按所需的时间间隔轮询,默认情况下每秒轮询一次。我们使用 10 读数运行平均值来确定紫外线水平是否超过阈值。该变量uvReadings
是一个包含 10 个 UV 读数的列表,索引为 1 到 10。读数分 10 个步骤收集。在每一步,从总读数中减去该步骤的旧读数,并添加新读数。然后通过将总数除以所读取的读数数量来收集平均值。如果平均值低于阈值,则确定灯关闭,并且0x00
byte 被发送到 Android 设备,以便为用户创建指示。如果平均值高于阈值,则指示灯亮起0x01
并向 Android 设备发送一个字节。
最后一部分是草图中前面使用的函数。第一个是用于启用看门狗定时器的功能。值得注意的是CRV,它是用来设置超时时间的。它的计算公式为超时 = (CRV-1)/32768。因此,如果您希望有 6 秒的超时,则必须将 CRV 设置为 196609,因为 (196609 - 1) / 32768 = 6。此计算来自用于在处理器中保持时间的晶体的自然频率 32768赫兹。
第一部分是用于复位看门狗定时器的代码。最后一个是在运动传感器被触发时使用的中断服务程序。如果您不熟悉 Arduino 中断,可以在此处了解更多信息:http: //gammon.com.au/interrupts。如果触发发生在灯打开后的三秒内,我们故意禁用灯,则什么也不做。如果不是,则将motionFlag
变量设置为 true。在循环的下一次迭代中,继电器将关闭,并向 Android 设备发送一条消息,指示已检测到运动。
Android 应用程序是使用带有 BluetoothLE 扩展的 MIT App Inventor 2 构建的。该应用程序旨在与一组三个灯一起使用。但是,它也可以仅与一套或两套一起使用。灯的主要功能是通过蓝牙将 Android 设备连接到灯、打开和关闭灯、监控灯的状态以及处理灯运动传感器检测到的运动通知。
当用户打开应用程序时,他们会看到四个按钮,允许他们连接到设备、断开与设备的连接、打开连接的灯或关闭连接的灯。屏幕的下半部分显示每个灯的状态。灯的名称显示在左侧。连接状态使用中心的“无线”符号指示。穿过符号的红色“X”表示灯未断开。没有“X”表示设备已连接。右侧会显示一个灯泡图标,指示灯是否亮起。否则,没有灯泡出现表示灯已关闭。
第一步是连接到可用的灯。当用户按下连接按钮时,应用程序开始扫描可用的蓝牙设备,并将其聚合到一个列表中。在扫描过程中,无线图标为黄色。对于它找到的每个蓝牙设备,它都会查询设备的名称。如果设备的名称与用于指定 UV 灯的前缀匹配,在我们的例子中,我们使用前缀LU_Light ,那么它将连接到该灯。
连接灯后,将显示设备名称并且无线图标变为蓝色。
当连接了所需数量的灯时,可以使用“ON”按钮打开灯。按下“ON”按钮会导致 Android 设备向上述0x01
所有灯发送一个字节switchCharacterstic
。当灯亮起时,灯中的紫外线传感器会检测到这一点,灯内的 Arduinos 会0x01
在statusCharacteristic
. 然后使用屏幕右侧的灯泡图标在屏幕上指示。
按下“OFF”按钮会导致一个0x00
字节被发送到所有的灯switchCharacteristic
。当灯中的紫外线传感器检测到它们没有打开时,Arduinos 会发送一个 0x00 byte
on statusCharacteristic
,并且灯泡图标会消失。
当其中一个灯检测到运动时,Arduino 会在motionCharacteristic
. 这会触发 Arduino 设备向所有灯发送一个0x00
字节switchCharacteristic
,确保所有灯都关闭。应用程序屏幕上显示一条消息。可以通过单击“X”图标清除此消息。
每当灯连接到 Android 应用程序时,Android 设备都会0x01
在connectionCharacteristic
. 如上面的 Arduino 部分所述,这表明设备仍然正确连接。当按下“断开连接”按钮时,应用程序会在所有灯上发送一个0x00
字节。connectionCharacteristic
这会触发他们断开连接。尽管 MIT App Inventor 包含一个“断开连接”功能,但发现它不能与 Arduino Nano BLE Sense 可靠地工作,因此我们没有发送明确的“断开连接”命令,而是发送0x00
触发 Arduino 自行断开连接的字节。
我们已经包含了应用程序的 .apk 文件以及使用 .aia 格式的 MIT App Inventor 项目文件。要从 .apk 安装,只需在您的 Android 设备上从下方下载文件。点击下载的文件将开始安装过程。您可能需要在设备设置中允许安装非市场应用程序。有关安装 from.apk 的更多信息,
使用包含的 Arduino 代码和 .apk 文件是最简单的入门方法。如果您想修改应用程序,请按照以下步骤操作。
要修改应用程序,您需要先在 MIT App Inventor 上创建一个帐户(如果您没有帐户)。然后,从下面下载.aia 文件。在 MIT App Inventor 中,单击文件 -> 导入并选择 .aia 文件。打开文件将带您进入 App Inventor 工作区,您可以在其中从 Designer 选项卡修改界面或从 Blocks 选项卡修改代码。包含的代码已完整记录。要在 MIT App Inventor 中查看评论,请单击每个 Block 左上角的问号。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !