ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Johnny-Five 实践:用 LED 数组与电位器实现多灯联动控制(Leds + Sensor 实战指南)

Johnny-Five 实践:用 LED 数组与电位器实现多灯联动控制(Leds + Sensor 实战指南) Johnny-Five 实践用 LED 数组与电位器实现多灯联动控制Leds Sensor 实战指南【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five本篇技术指南以 Johnny-Five 官方示例docs/led-array-controller.md为核心讲解如何通过Leds数组集合类一次管理多颗 LED并借助模拟电位器Sensor的旋钮位置动态点亮对应的 LED 数量实现旋钮驱动灯条的经典交互场景。读完本文你将掌握Leds集合的构造与批量控制方法、Sensor的模拟量读取与scaleTo()数值映射技巧以及change事件驱动的实时响应编程模式可直接在 Arduino 等开发板上复现运行。示例概览旋钮控制一串 LEDdocs/led-array-controller.md展示了一个小而完整的硬件交互程序在面包板上将 5 颗 LED 分别接到数字引脚 26把一个 10K 电位器的中间抽头wiper接到模拟引脚 A0程序根据电位器旋转位置把 LED 从第一颗开始依次点亮。电位器转到最左端时所有 LED 熄灭向右旋转时灯依次亮起形成类似音量灯条的效果。对应的完整示例代码位于 eg/led-array-controller.js运行命令为node eg/led-array-controller.jsconst {Board, Leds, Sensor} require(johnny-five); const board new Board(); board.on(ready, () { const leds new Leds([2, 3, 4, 5, 6]); const pot new Sensor(A0); pot.on(change, () { const lastIndex Math.round(pot.scaleTo([-1, 4])); if (lastIndex -1) { leds.off(); } else { leds.each((led, index) { if (index lastIndex) { led.on(); } else { led.off(); } }); } }); });文中配有的接线参考图为 docs/breadboard/led-array-controller.png对应的 Fritzing 可编辑工程文件为 docs/breadboard/led-array-controller.fzz可用于在 Fritzing 中查看或修改接线。硬件接线与面包板布局从 Fritzing 图与示例代码可以确认以下接线约定组件连接目标LED 15数字引脚 2、3、4、5、6经限流电阻接地电位器两端5VVCC与 GND电位器中间抽头模拟引脚 A0接线要点每颗 LED 都需串联一个合适的限流电阻典型 220Ω330Ω防止电流过大损坏 LED 或引脚电位器构成分压电路旋转旋钮时 A0 上的电压在 05V 之间连续变化对应 ADC 读数值的变化。核心 APILeds 集合类Leds是 Johnny-Five 提供的 LED 集合Collection类定义在 lib/led/leds.js构造时接收一个引脚数组并批量实例化const leds new Leds([2, 3, 4, 5, 6]);从源码看Leds extends Collection其typegetter 返回Ledlib/led/leds.js因此传入的数字会被逐一包装为Led实例最终得到一个类数组对象{ length: 5, 0: Led, 1: Led, ... }。它还通过Collection.installMethodForwarding把Led原型上的方法如on、off、toggle、brightness、fade、strobe等批量转发到集合上——这意味着leds.off()会一次性关闭集合内所有 LED无需手写循环。Leds还支持传入共享属性对象来批量声明相同配置例如const leds new Leds({ pins: [2, 3, 4, 5, 6], board: board });这种共享属性 pins 数组的初始化方式由 lib/mixins/collection.js 中的构造逻辑支持它会将pins之外的键如board复制到每个 LED 的独立配置对象中。核心 APISensor 与 scaleTo 数值映射Sensor是 Johnny-Five 的通用模拟/数字传感器类定义在 lib/sensor.js。示例中new Sensor(A0)会把 A0 配置为模拟输入ANALOG 模式并持续采样。源码中的关键实现事实传感器默认按 10-bit01023分辨率处理模拟量若板卡 IO 驱动声明了RESOLUTION.ADC则采用该值lib/sensor.js模拟读数通过中位数滤波降低噪声在每个采样周期内积累样本、排序后取中间值再触发data/change事件lib/sensor.js 与 lib/sensor.jschange事件仅在滤波值相对上次结果变化超过threshold默认 1时触发lib/sensor.js避免频繁抖动触发无意义更新。scaleTo(low, high)是示例的灵魂函数其实现位于 lib/sensor.jsscaleTo(low, high) { const scale Array.isArray(low) ? low : [low, high]; return Fn.map(this.raw, 0, this.resolution, scale[0], scale[1]); }它基于Fn.maplib/fn.js把原始 ADC 值raw从[0, resolution]线性映射到目标区间。本例中pot.scaleTo([-1, 4])把 01023 的旋钮读数映射到 -14电位器位置rawscaleTo 输出Math.round 后点亮效果0最左端-1.0-1全部熄灭~2050.00只亮第 1 颗~4091.01亮前 2 颗~6142.02亮前 3 颗~8183.03亮前 4 颗1023最右端4.04全部 5 颗点亮设计 -1 作为下界是为了让最左端熄灭拥有独立的整数值避免与只亮一颗0混淆。由于Fn.map采用按位取整| 0映射结果本身即为整数配合Math.round即可得到稳定的 LED 索引。若需要浮点映射Sensor还提供了fscaleTo()lib/sensor.js。事件驱动控制逻辑拆解程序采用 Johnny-Five 标准的事件驱动模型board.on(ready, ...)等待板卡初始化完成此时 Firmata 等 IO 固件已就绪创建Leds与Sensor实例监听pot的change事件每次旋钮读数变化时重算目标索引lastIndex用leds.each((led, index) ...)遍历集合索引小于等于lastIndex的 LED 点亮其余熄灭lastIndex -1时整体调用leds.off()一次熄灭全部。each回调签名与Array.prototype.forEach一致(element, index)定义于 lib/mixins/collection.js。由于集合方法转发机制leds.off()实际等效于逐个调用每个Led.off()而Led.off()会把状态值置 0 并调用底层update()写入 IOlib/led/led.js。值得注意的细节示例先处理lastIndex -1的分支再处理正常分支避免了在索引为 -1 时index lastIndex的判断把所有 LED 误判为点亮因为此时条件恒成立。深入原理Led.on()/off() 的底层行为从 lib/led/led.js 可以看到on()与off()的底层差异on()在数字输出模式下直接写 HIGH在 PWM 模式下会把亮度值设为 255全亮并处理value为 null 或 0 等边界情况off()一律把状态值置 0 后写回 IO输出低电平熄灭。因此本示例适用于普通数字输出引脚Arduino 的数字引脚 26 均为 OUTPUT 模式实现的是纯开关式非调光控制。若将引脚换为 PWM 引脚Leds集合同样支持brightness()、fade()、pulse()等调光方法可实现亮度渐变与动画效果Leds甚至把pulse、fade、fadeIn、fadeOut、blink这些带回调的方法做了回调收敛处理——只有集合内所有 LED 都完成动画后才会触发回调lib/led/leds.js 与 lib/mixins/collection.js。运行与验证运行环境要求 Node.js 环境、USB 连接的 Arduino或其他受支持板卡以及烧录好的 StandardFirmata 固件。执行node eg/led-array-controller.js程序启动后旋转电位器观察 26 号引脚的 LED 应呈现逐颗点亮、逐颗熄灭的联动效果。若 LED 无反应可依次检查板卡串口是否被占用、固件版本、面包板接线是否短路/断路、限流电阻是否遗漏。如果想在关闭 LED 集合后复用Led还提供了toggle()在isOn状态间切换lib/led/led.js可以基于本示例扩展出更多交互逻辑。小结通过本示例可以掌握 Johnny-Five 中两组高频 API 的组合用法Leds集合以类数组方式批量管理多个 LED内部基于 lib/mixins/collection.js 的集合与方法转发机制Sensor.scaleTo()则负责把连续模拟量映射为离散档位。二者结合即可用最小代码实现模拟输入 → 多路数字输出的典型控制链路是后续构建灯带、电平指示器、仪表盘等应用的直接基础。相关文档与示例可在 docs/led.md、eg/led.js 以及 docs/sensor.md 中继续深入。【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表