IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载本篇技术指南基于 johnny-fiveJavaScript 机器人及物联网编程框架仓库中的官方示例 docs/led-fade-callback.md 及其配套程序 eg/led-fade-callback.js系统讲解如何利用Leds集合的fadeOut()完成回调驱动一排 PWM 引脚上的 LED 一个接一个地淡出随机或按顺序并深入源码剖析fade()/fadeIn()/fadeOut()的回调触发原理、Leds集合的方法转发与回调协调机制。读完本文你将掌握 johnny-five 中基于回调链驱动多 LED 依次淡入淡出的完整实战方案并理解其底层 Animation 引擎的调用关系。示例概述与适用前提示例演示了通过回调把一个接一个的 LED 依次淡出每次一个 LED 淡出完成后它的完成回调会触发下一个 LED 开始淡出形成一条连续的接力链。核心要点是所接 LED 的引脚必须支持 PWM脉冲宽度调制在 Arduino 等开发板上这类引脚通常用~符号标注如 Uno 上的 3、5、6、9、10、11。按官方说明该示例需要把 LED 接到以下 PWM 引脚11、10、9、6、5、3。接线时每个 LED 的正极长脚经限流电阻接到对应 PWM 引脚负极短脚接到 GND。官方同时提供了面包板接线图与 Fritzing 布线图可直接参考面包板接线图docs/breadboard/led-fade-callback.pngFritzing 布线图docs/breadboard/led-fade-callback.fzz运行方式在仓库根目录下通过命令行直接运行即可前提是已安装 johnny-five 并连接好开发板node eg/led-fade-callback.js运行后可以观察到初始状态下 6 个 LED 全部点亮leds.on()随后第一个 LED 开始淡出其完成回调立即驱动下一个 LED随机或顺序淡出如此循环往复。完整代码与逐段解读示例的完整源码位于 eg/led-fade-callback.js其逻辑与文档完全一致关键代码如下const {Board, Leds} require(johnny-five); const board new Board(); board.on(ready, () { // Set up the following PWM pins as LEDs. // Fade an LED out, and the complete callback will start // fading the next LED in sequence out, and so on. // If randomFade is true, then fading will happen in random // order instead of sequentially. const leds new Leds([11, 10, 9, 6, 5, 3]); const timing 250; const randomFade true; const ledCount leds.length; let fadeIndex 0; function fadeNext() { let candidateIndex fadeIndex; leds[fadeIndex].fadeIn(timing); // Determine the next LED to fade if (randomFade) { while (candidateIndex fadeIndex) { candidateIndex Math.round(Math.random() * (ledCount - 1)); } } else { candidateIndex (fadeIndex ledCount - 1) ? fadeIndex 1 : 0; } fadeIndex candidateIndex; leds[fadeIndex].fadeOut(timing, fadeNext); } leds.on(); leds[fadeIndex].fadeOut(timing, fadeNext); });逐段拆解如下创建 LED 集合new Leds([11, 10, 9, 6, 5, 3])用一组引脚号批量实例化Led对象得到一个类数组的Leds集合对象其实现见 lib/led/leds.js基类为 lib/mixins/collection.js 中的Collection。它支持length、下标访问和迭代器因此leds.length、leds[fadeIndex]都可以直接使用。参数配置timing 250每次淡入/淡出的时长毫秒示例中为 250msrandomFade true控制下一个淡出的 LED 是随机选择还是顺序轮转。改为false即按 0→1→2→3→4→5→0 的顺序循环ledCount集合长度此处为 6用于随机与越界计算fadeIndex当前正在淡出的 LED 下标初始为 0。回调函数fadeNext先把当前 LEDfadeIn(timing)淡入让它在淡出结束后重新点亮从而保证每轮都先复位亮度计算下一个目标下标随机模式下用while循环保证新下标与当前下标不同避免原地不动顺序模式下(fadeIndex ledCount - 1) ? fadeIndex 1 : 0实现回绕调用leds[fadeIndex].fadeOut(timing, fadeNext)把fadeNext本身作为完成回调传入——这正是接力链的关键淡出结束即回调自身驱动下一个 LED 继续淡出如此无限循环。启动链路leds.on()一次性点亮全部 LED然后leds[fadeIndex].fadeOut(timing, fadeNext)触发第一轮淡出。源码级原理fade / fadeIn / fadeOut 的回调机制fadeOut()和fadeIn()并不是独立实现而是fade()的语法糖全部定义在 lib/led/led.js 中fadeIn(duration, callback) { return this.fade(255, duration || 1000, callback); } fadeOut(duration, callback) { return this.fade(0, duration || 1000, callback); }可见fadeIn等价于fade(255, ...)淡入到最亮fadeOut等价于fade(0, ...)淡出到熄灭duration缺省时默认 1000ms。fade的核心实现则依托 johnny-five 的 Animation 引擎fade(val, duration, callback) { const state priv.get(this); this.stop(); const options { duration: typeof duration number ? duration : 1000, keyFrames: [null, typeof val number ? val : 0xff], easing: outSine, oncomplete() { state.isRunning false; if (typeof callback function) { callback(); } } }; // ...支持 (val, duration) 对象形式与函数形式参数重载 state.isRunning true; state.animation state.animation || new Animation(this); state.animation.enqueue(options); return this; }从中可以提炼出几个关键机制参数重载fade的签名是fade(val, duration, callback)但源码允许fade(callback)、fade(val, callback)、fade(val, duration, callback)等多种调用形态——凡传入函数即被识别为回调传入对象则作为 Animation 配置项合并。回调触发点回调挂载在 Animation 的oncomplete钩子上即动画完整播放结束后被调用一次同时把state.isRunning复位为false。动画配置keyFrames: [null, val]中首元素null表示从当前值开始终点值为传入的亮度目标255 或 0easing默认使用outSine缓动曲线非匀速、结束时减速duration决定整个过程的毫秒数。幂等性每次调用fade前先执行this.stop()清理可能残留的 interval 与旧动画队列避免交通拥堵。测试 test/led.js 中fadeCallback、fadeValCallback、fadeValDurationCallback三个用例逐一验证了这三种重载形态下回调均恰好触发一次它们 stub 掉Animation.prototype.enqueue取出入队配置里的oncomplete手动执行再断言 spy 回调计数为 1。集成测试 test/extended/led.js 中的fadeInCallback、fadeOutCallback则验证了fadeIn(100, spy)、fadeOut(100, spy)在真实动画流程结束后的回调行为。Leds 集合方法转发与回调协调示例中对整个集合调用leds.on()之所以能一次点亮全部 LED是因为Leds通过Collection.installMethodForwarding把Led原型上的方法如on、off、fade、fadeIn、fadeOut、stop等逐一分发到集合内每个实例上见 lib/mixins/collection.js。需要注意的是集合级 fade 类方法与单实例回调语义不同。普通方法转发对每个元素调用同样的参数会导致回调被触发N次每个 LED 一次为此 johnny-five 提供了Collection.installCallbackReconciliation把pulse、fade、fadeIn、fadeOut、blink这几个带回调的方法包装成全部元素完成后再触发一次回调的语义内部为每个元素创建 Promise通过Promise.all等待所有元素淡出完成后才调用外层回调见 lib/led/leds.js 与 lib/mixins/collection.js 中的installCallbackReconciliation。这解释了为什么示例程序直接通过下标取单个 LEDleds[fadeIndex].fadeOut(timing, fadeNext)而不是对整个集合调用fadeOut前者每次只驱动一个 LED 并拿到这一个 LED的完成回调天然形成逐次接力若改为集合级调用则是全部 LED 同时淡出、统一回调动画节奏会完全不同。参数调整与变体玩法切换顺序模式将randomFade改为false淡出将按引脚列表下标 0→5 循环呈现整齐的波浪效果。调整淡出速度修改timing例如100更快、500更慢该值同时作用于fadeIn与fadeOut。更换引脚集合只要引脚支持 PWMArduino Uno 上为 3、5、6、9、10、11可以任意增删引脚号johnny-five 会在初始化时依据引脚是否支持 PWM 自动决定工作模式PWM或OUTPUT见 lib/led/led.js 中 DEFAULT 控制器的initializethis.io.MODES[this.board.pins.isPwm(this.pin) ? PWM : OUTPUT]。若把淡入淡出用到不支持 PWM 的引脚上源码会在update中通过Board.Pins.Error抛出 PWM 类型错误。改用fade(val, duration, callback)如果想淡出到中间亮度而非完全熄灭可以直接调用fade(128, timing, fadeNext)指定 0–255 之间的任意目标值。与pulse()的区别pulse(duration, callback)使用keyFrames: [0, 0xff]、metronomic: true、loop: true让 LED 无限循环淡入淡出回调挂载在onloop上每循环一次触发一次适合需要持续呼吸灯效果的场景。小结本文围绕 johnny-five 官方led-fade-callback示例完整还原了一个 LED 淡出完成后由回调驱动下一个 LED 淡出的接力式动画实现并从源码层面厘清了fadeIn/fadeOut对fade的封装关系、Animation 引擎中oncomplete回调的触发时机以及Leds集合方法转发 回调协调的并发语义差异。参照 eg/led-fade-callback.js 与 docs/led-fade-callback.md配合 test/led.js、test/extended/led.js 中的相关用例即可在自己的开发板上快速复现并扩展出属于自己的多 LED 动画序列。赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five LED 渐变实战fadeIn / fadeOut 的 PWM 原理与完整示例Johnny Five LED 渐变实战fadeIn / fadeOut 的 PWM 原理与完整示例 导读 本文以 Johnny Five 官方文档 docsIoT机器人嵌入式Johnny-Five 入门用 Board 与 Led 实现 LED 闪烁Blink实战指南Johnny Five 入门用 Board 与 Led 实现 LED 闪烁Blink实战指南 Johnny Five 是运行在 Node.js 之上的 JIoT机器人嵌入式Johnny-Five LED 滑杆调光实战用 Sensor 与 PWM 精确控制 LED 亮度Johnny Five LED 滑杆调光实战用 Sensor 与 PWM 精确控制 LED 亮度 本篇技术指南聚焦 Johnny Five 官方示例 docsIoT机器人嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
3步搞定模拟退火算法:含完整示例,告别报错 3步搞定模拟退火算法:含完整示例,告别报错 盯着屏幕上一串串红色的 StackTrace,你心里是不是在滴血?明明照着文档抄了代码,结果跑起来全是 IndexError 或者 ValueError… · 2026/9/23 13:40:40
Ceph CPU 性能剖析实战:使用 OProfile 与 perf 定位守护进程热点 存储分布式文件系统对象存储后端高可用 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph 点击查看 免费下载 本指南面向 Ceph 开发者与集群运维人员,介绍如何… · 2026/9/23 13:40:26
供配电系统毕业设计全流程:从负荷计算到设备选型的工程逻辑 简介:一份面向电气工程专业毕业设计或课程设计的完整文档,内容针对某机械厂供配电系统从负荷测算、无功补偿到主变压器选型与主接线方案设计展开,同时覆盖短路电流计算和高低压电气设备选择校验,适合需要参考毕业设计框架与计算过… · 2026/9/23 14:31:01
UHFReader09 C# DEMO 实战:串口/TCP 盘存与避坑指南 简介:这是一份面向C#开发者与RFID入门者的UHF RFID阅读器演示工程,围绕UHFReader09设备型号展开,帮助读者理解如何用C#与超高频阅读器通信、控制参数并处理标签数据,可应用于仓储管理、物流追踪、资产盘点等长距离识别场景。压缩包… · 2026/9/23 14:30:54
柳青丈夫面试必问避坑指南 3天搞定环境配置 柳青丈夫面试必问避坑指南 3天搞定环境配置 配置环境就卡半天,这大概是每个程序员入行时最痛的记忆。你盯着黑底白字的终端窗口,报错信息滚得飞快,脑子里全是“我到底哪步错了”。更扎心的是,当你终于跑通Hello… · 2026/9/23 14:30:54
Prisma API 详解:基于数据模型自动生成的 GraphQL 接口与 Playground 探索指南 后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 本篇指南聚焦 Prisma&… · 2026/9/23 14:30:48
Nginx UI 集成 Casdoor:OAuth 2.0 统一身份认证接入指南 Nginx UI 集成 Casdoor:OAuth 2.0 统一身份认证接入指南 【免费下载链接】nginx-ui Yet another WebUI for Nginx 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui
本篇技术指南围绕 Nginx UI 的 Casdoor 认证提供方配置展开,完整讲解 En… · 2026/9/23 14:30:47
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29