Menu
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Node.js 树莓派 GPIO - 流动 LED


使用数组和输出创建流动 LED

在本节中,我们将使用多个 GPIO 引脚,通过按顺序打开和关闭它们来创建“流动”效果。


我们需要什么?

为此,您需要

注意:您需要的电阻器可能与我们使用的不同,具体取决于您使用的 LED 类型。大多数小型 LED 仅需要一个小电阻器,大约 200-500 欧姆。具体使用哪个值通常并不重要,但电阻器值越小,LED 的亮度就越高。

单击上面列表中的链接,了解不同组件的描述。


构建电路

现在是时候在面包板上构建电路了。

如果您是电子学新手,建议您关闭树莓派的电源。并使用防静电垫或接地带,避免损坏它。

使用以下命令正确关闭树莓派:

pi@w3demopi:~ $ sudo shutdown -h now

树莓派上的 LED 停止闪烁后,拔掉树莓派的电源插头(或关闭它连接的电源线)。

如果在没有正确关机的情况下直接拔掉插头,可能会导致内存卡损坏。

Raspberry Pi 3 with Breadboard. Flowing LEDs circuit

查看上面的电路图。

  1. 在树莓派上,将跳线的母端连接到一个 GND 引脚。在我们的示例中,我们使用了物理引脚 6 (GND,第 3 行,最右边列)
  2. 在面包板上,将连接到 GND 电源的跳线公端连接到右侧的 接地总线。面包板的整列都连接在一起,所以哪一行都可以。在我们的示例中,我们将其连接到第 1 行。
  3. 对于每个 LED:将 LED 连接到 2 个接线点行。在我们的示例中,我们连接了
    1. LED1 到第 5 行(阴极)和第 6 行(阳极),J 列
    2. LED2 到第 8 行(阴极)和第 9 行(阳极),J 列
    3. LED3 到第 11 行(阴极)和第 12 行(阳极),J 列
    4. LED4 到第 14 行(阴极)和第 15 行(阳极),J 列
    5. LED5 到第 17 行(阴极)和第 18 行(阳极),J 列
    6. LED6 到第 20 行(阴极)和第 21 行(阳极),J 列
    7. LED7 到第 23 行(阴极)和第 24 行(阳极),J 列
    8. LED8 到第 26 行(阴极)和第 27 行(阳极),J 列
  4. 对于每个 LED:将 220 欧姆电阻的一条引脚连接到右侧的 接地总线 列,另一条引脚连接到右侧的接线点行,该行连接到 LED 的阴极引脚。在我们的示例中,我们连接了
    1. LED1 到第 5 行,I 列
    2. LED2 到第 8 行,I 列
    3. LED3 到第 11 行,I 列
    4. LED4 到第 14 行,I 列
    5. LED5 到第 17 行,I 列
    6. LED6 到第 20 行,I 列
    7. LED7 到第 23 行,I 列
    8. LED8 到第 26 行,I 列
  5. 对于每个 LED:将跳线的母端连接到树莓派上的 GPIO 引脚,将跳线的公端连接到右侧的接线点行,该行连接到 LED 的阳极引脚。在我们的示例中,我们连接了
    1. LED1 从物理引脚 7 (GPIO 4,第 4 行,最左边列) 到接线点行 6,F 列
    2. LED2 从物理引脚 11 (GPIO 17,第 6 行,最左边列) 到接线点行 9,F 列
    3. LED3 从物理引脚 13 (GPIO 27,第 7 行,最左边列) 到接线点行 12,F 列
    4. LED4 从物理引脚 15 (GPIO 22,第 8 行,最左边列) 到接线点行 15,F 列
    5. LED5 从物理引脚 12 (GPIO 18,第 6 行,最右边列) 到接线点行 18,F 列
    6. LED6 从物理引脚 16 (GPIO 23,第 8 行,最右边列) 到接线点行 21,F 列
    7. LED7 从物理引脚 18 (GPIO 24,第 9 行,最右边列) 到接线点行 24,F 列
    8. LED8 从物理引脚 22 (GPIO 25,第 11 行,最右边列) 到接线点行 27,F 列

现在您的电路应该已经完成,并且您的连接应该与上面的图示非常相似。

现在是时候启动树莓派并编写 Node.js 脚本与它交互了。



树莓派和 Node.js 流动 LED 脚本

转到“nodetest”目录,创建一个名为“flowingleds.js”的新文件

pi@w3demopi:~ $ nano flowingleds.js

现在文件已打开,可以使用内置的 Nano 编辑器进行编辑。

编写或粘贴以下内容

flowingleds.js

var Gpio = require('onoff').Gpio; // 包含 onoff 来与 GPIO 交互
var LED04 = new Gpio(4, 'out'), // 为所有 GPIO 输出引脚声明变量
  LED17 = new Gpio(17, 'out'),
  LED27 = new Gpio(27, 'out'),
  LED22 = new Gpio(22, 'out'),
  LED18 = new Gpio(18, 'out'),
  LED23 = new Gpio(23, 'out'),
  LED24 = new Gpio(24, 'out'),
  LED25 = new Gpio(25, 'out');

// 将所有 LED 变量放入数组中
var leds = [LED04, LED17, LED27, LED22, LED18, LED23, LED24, LED25];
var indexCount = 0; // 计数器
dir = "up"; // 流动方向变量

var flowInterval = setInterval(flowingLeds, 100); // 每 100 毫秒运行一次 flowingLeds 函数

function flowingLeds() { // 流动 LED 的函数
  leds.forEach(function(currentValue) { // 数组中的每个项目
    currentValue.writeSync(0); // 关闭 LED
  });
  if (indexCount == 0) dir = "up"; // 如果计数达到零,将流动方向设置为“向上”
  if (indexCount >= leds.length) dir = "down"; // 如果计数达到 7,将流动方向设置为“向下”
  if (dir == "down") indexCount--; // 如果方向向下,则向下计数
  leds[indexCount].writeSync(1); // 打开与计数匹配的数组索引的 LED
  if (dir == "up") indexCount++ // 如果方向向上,则向上计数
};

function unexportOnClose() { // 退出程序时运行的函数
  clearInterval(flowInterval); // 停止流动间隔
  leds.forEach(function(currentValue) { // 每个 LED
    currentValue.writeSync(0); // 关闭 LED
    currentValue.unexport(); // 取消导出 GPIO
  });
};

process.on('SIGINT', unexportOnClose); // 用户使用 Ctrl+C 关闭时运行的函数

按“Ctrl+x”保存代码。使用“y”确认,使用“Enter”确认名称。

运行代码

pi@w3demopi:~ $ node flowingleds.js

现在 LED 应该按顺序打开和关闭,从而产生流动效果。

使用 Ctrl+c 结束程序。


×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.