Johnny-Five 数字微波传感器接入指南:基于 Sensor.Digital 的移动侦测实战
【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five
导读
本篇以 johnny-five 官方文档 docs/sensor-digital-microwave.md 为核心,讲解如何用 JavaScript 通过 Johnny-Five 框架在 Arduino 上读取数字微波传感器(Digital Microwave Sensor)的输出信号。此类传感器常用于人体移动侦测,输出数字高低电平,非常适合用 johnny-five 的Sensor.Digital组件处理。读完本文你将掌握:数字微波传感器的硬件接线方法、new five.Sensor.Digital(pin)的构造方式、data与change事件的使用、以及数字传感器在 lib/sensor.js 中的底层读取与事件分发机制,并能在此基础上扩展出报警、灯光联动等实际应用。
文档示例总览:读取微波传感器的数字输出
原文档给出的示例完整且可直接运行,其核心逻辑是:在板卡ready事件后,为连接在数字引脚 7 上的微波传感器创建一个数字传感器实例,并监听其change事件,把最新的值打印到控制台。
var five = require("johnny-five"); var board = new five.Board(); board.on("ready", () => { var microwave = new five.Sensor.Digital(7); microwave.on("change", () => { console.log(microwave.value); }); });对应的完整可运行示例代码位于 eg/sensor-digital-microwave.js,在项目根目录执行以下命令即可运行:
node eg/sensor-digital-microwave.js提示:示例中的
require("johnny-five")在直接运行eg/目录下的脚本时,应改为相对路径require("../lib/johnny-five.js")(示例文件 eg/sensor-digital-microwave.js 即采用此写法)。若你的项目通过npm install johnny-five安装依赖,则保持require("johnny-five")即可。
硬件接线:数字微波传感器与 Arduino
接线图与 Fritzing 文件
原文档提供了对应的面包板接线图与 Fritzing 设计文件,可在仓库中直接查看:
- 接线图:docs/breadboard/sensor-digital-microwave.png
- Fritzing 源文件:docs/breadboard/sensor-digital-microwave.fzz
三线连接说明
数字微波传感器模块通常只有三个引脚,与 Arduino UNO 的接线方式如下表所示:
| 传感器引脚 | 导线颜色 | 连接至 Arduino UNO | 说明 |
|---|---|---|---|
| VCC | 红色 | 5V 引脚 | 为传感器供电,典型工作电压为 5V |
| GND | 黑色 | GND 引脚 | 共地连接 |
| OUT(数字输出) | 黄色 | 数字引脚(示例使用 D7) | 输出高/低电平,高电平通常表示检测到移动目标 |
接线要点:
- 将传感器的 VCC 与 GND 接到 Arduino 的 5V 与 GND,为传感器提供稳定供电;
- 将传感器 OUT 引脚接到 Arduino 的数字引脚,示例程序使用数字引脚 7,因此
new five.Sensor.Digital(7)中的数字7与硬件接线必须一一对应; - 部分微波传感器模块(如 RCWL-0516 等常见人体感应模块)输出为数字电平,可直接接入 GPIO 读取,无需分压电路。
核心 API:Sensor.Digital的构造与底层实现
构造器:从快捷工厂到通用 Sensor
five.Sensor.Digital并不是一个独立的类,而是 johnny-five 在 lib/johnny-five.js 中定义的快捷构造器。它的作用是把用户传入的引脚号或配置对象包装成type: "digital",再交给通用的Sensor类:
module.exports.Sensor.Digital = function(options) { let pin; let type = "digital"; if (typeof options === "number" || typeof options === "string") { pin = options; options = { type, pin }; } else { options.type = type; } return new module.exports.Sensor(options); };从源码结构看,这意味着你可以用两种等价的方式创建实例:
// 方式一:直接传引脚号(示例文档所用) var microwave = new five.Sensor.Digital(7); // 方式二:传配置对象(可附加 freq、threshold 等选项) var microwave = new five.Sensor.Digital({ pin: 7, freq: 50, // 采样/事件处理间隔,单位 ms,默认 25 threshold: 1 // 变化阈值,数字模式下固定为 ±1 });同时,Sensor.Analog被定义为Sensor本身(lib/johnny-five.js),Sensor.Digital只是对通用Sensor的数字模式封装。两个快捷构造器最终都会进入同一个 lib/sensor.js 构造器。
数字模式的关键分支逻辑
在 lib/sensor.js 中,构造器根据options.type决定引脚模式与读取方式:
if (!options.type) { options.type = "analog"; } // Set the pin to ANALOG (INPUT) mode this.mode = options.type === "digital" ? this.io.MODES.INPUT : this.io.MODES.ANALOG; this.io.pinMode(this.pin, this.mode);type: "digital"→ 引脚设为MODES.INPUT,并调用io.digitalRead(pin, callback)读取数字电平;- 默认的
type: "analog"→ 引脚设为MODES.ANALOG,调用io.analogRead(pin, callback)读取 ADC 值。
数字模式还影响噪声过滤行为:构造器中只有非数字类型才把原始读数累积到samples数组(lib/sensor.js),数字信号本身就是稳定的 0/1,无需中位数滤波。state.booleanBarrier在数字模式下初始化为0(lib/sensor.js),这也决定了后面boolean属性的判定基准。
事件处理:data 与 change 的触发规则
Sensor构造器内部通过setInterval周期性执行事件处理函数eventProcessing(lib/sensor.js)。对数字模式,其流程非常直接:
if (options.type === "digital") { this.emit("data", raw); if (last !== raw) { this.emit("change", raw); last = raw; } return; }由此可以总结数字微波传感器的两个事件语义:
data事件:每个采样周期(freq,默认 25ms)都会触发一次,携带当次读取到的原始电平值(0 或 1)。适合持续轮询场景,如周期性刷新状态显示;change事件:仅当读取到的电平与上一次不同(即last !== raw)时才触发,携带新的电平值。适合边沿触发场景,如"检测到有人进入"或"目标离开"。
示例程序正是监听change事件,因此每当微波传感器检测到移动状态翻转(如无目标 → 有目标,或有目标 → 无目标)时,控制台就会打印microwave.value。
该行为也由测试用例验证:在 test/sensor.js 的 "Sensor - Digital" 测试中,模拟digitalRead回调先传入1、再传入0,断言data事件分别携带1与0,change事件同样分别触发且携带对应值;test/sensor.js 的change用例进一步确认"两次电平不同才触发"的边沿语义。
采样频率 freq 与事件节流
数字传感器的采样频率由freq选项控制,默认值为 25ms(lib/sensor.js)。在构造器末尾,若state.enabled为真,则设置this.freq = state.freq(lib/sensor.js),freq的 setter 会创建对应周期的setInterval(lib/sensor.js)。
这意味着:
- 若微波模块的移动检测响应较慢,可将
freq调大(如 100)以降低事件处理频率、减少 CPU 占用; - 若需要更灵敏的响应,可将
freq调小,但需注意底层 IO 的digitalRead推送能力与事件循环开销。
数字模式下change事件要求电平与上一次不同才触发,因此即使调小freq,同一个电平状态也不会产生重复的change事件,这正是文档示例可以放心使用change的原因。
属性与扩展能力:从裸电平到业务状态
Sensor.Digital实例除了value之外,还暴露了多个常用属性与方法,对数字微波传感器尤其有意义:
| 属性/方法 | 说明 | 数字模式下的行为 |
|---|---|---|
value | 当前读取值 | 直接返回原始电平 0/1(未设置 scale 时) |
raw | 原始读数 | 与value一致,均为数字电平 |
boolean | 布尔化状态 | 与默认booleanBarrier = 0比较,value > 0即true,等价于"电平为 1" |
booleanAt(barrier) | 自定义布尔判定阈值 | 可手动设置判定基准 |
scale(low, high) | 值域映射 | 数字模式按电平值作索引,scale(0, 100)后低电平 → 0、高电平 → 100 |
scaleTo(low, high)/fscaleTo(low, high) | 即时数值映射 | 把原始电平映射到目标范围 |
enable()/disable() | 启停采样 | 关闭/恢复内部定时器 |
其中boolean属性的实现位于 lib/sensor.js:数字模式下的booleanBarrier初始为0,因此只要读到电平 1 即返回true,非常适合直接表达"是否有目标进入感应区"。
scale方法在数字模式下的行为可以从测试用例 test/sensor.js 中确认:调用this.sensor.scale(50, 100)后,电平1被映射为100,电平0被映射为50。这一特性可用来把微波传感器的裸电平直接映射为业务含义明确的数值(如置信度百分比)。
实战扩展:从打印电平到完整的移动侦测方案
以下示例在官方示例基础上扩展,组合change事件、boolean属性与 LED 输出,实现"检测到移动 → 点亮 LED"的完整回路,并演示freq与scale的配合:
var five = require("johnny-five"); var board = new five.Board(); board.on("ready", () => { // 微波传感器接数字引脚 7,LED 接数字引脚 13 var microwave = new five.Sensor.Digital({ pin: 7, freq: 50 }); var led = new five.Led(13); // 监听电平变化(0 → 1 或 1 → 0) microwave.on("change", () => { console.log("Motion state:", microwave.boolean, "| value:", microwave.value); }); // 使用 boolean 属性直接驱动动作 microwave.on("data", () => { if (microwave.boolean) { led.on(); } else { led.off(); } }); });注意:
eg/目录下已有大量可直接运行的示例(如 eg/sensor.js、eg/led-blink.js 等),开发时可将它们作为拼接模块的参考。本扩展示例仅供学习,运行前请根据实际接线调整引脚号。
运行上述代码后,当有人体(或其他移动目标)进入微波传感器的感应范围时,控制台会打印电平从0变为1的状态变化,板载 LED 点亮;目标离开后电平恢复0,LED 熄灭。
总结与进阶阅读
数字微波传感器接入 johnny-five 的核心流程可以概括为四步:
- 接线:VCC → 5V、GND → GND、OUT → 数字引脚(参考 docs/breadboard/sensor-digital-microwave.png);
- 构造:
new five.Sensor.Digital(pin),或传入包含pin、freq、threshold的配置对象; - 监听:用
data事件周期性取电平,用change事件响应电平翻转; - 扩展:利用
boolean、scale等属性把电平转换为业务状态,联动 LED、蜂鸣器等执行器。
相关源码与测试文件可进一步深入研读:
- 组件核心实现:lib/sensor.js(数字/模拟分支、事件处理、属性定义)
- 快捷构造器定义:lib/johnny-five.js
- 官方示例:eg/sensor-digital-microwave.js
- 数字模式测试:test/sensor.js
- 通用 Sensor 文档:docs/sensor.md
- 常用数值工具函数:lib/fn.js(
map、fmap、constrain等)
如果你需要同时读取多个传感器,johnny-five 还提供了Sensor.Collection(即five.Sensors,定义于 lib/sensor.js,别名注册于 lib/johnny-five.js),可一次性管理多个微波传感器或混合传感器阵列,适合多区域同时侦测的场景。
【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考