Node.js 树莓派 GPIO - 流动 LED
使用数组和输出创建流动 LED
在本节中,我们将使用多个 GPIO 引脚,通过按顺序打开和关闭它们来创建“流动”效果。
我们需要什么?
为此,您需要
注意:您需要的电阻器可能与我们使用的不同,具体取决于您使用的 LED 类型。大多数小型 LED 仅需要一个小电阻器,大约 200-500 欧姆。具体使用哪个值通常并不重要,但电阻器值越小,LED 的亮度就越高。
单击上面列表中的链接,了解不同组件的描述。
构建电路
现在是时候在面包板上构建电路了。
如果您是电子学新手,建议您关闭树莓派的电源。并使用防静电垫或接地带,避免损坏它。
使用以下命令正确关闭树莓派:
pi@w3demopi:~ $ sudo shutdown -h now
树莓派上的 LED 停止闪烁后,拔掉树莓派的电源插头(或关闭它连接的电源线)。
如果在没有正确关机的情况下直接拔掉插头,可能会导致内存卡损坏。
查看上面的电路图。
- 在树莓派上,将跳线的母端连接到一个 GND 引脚。在我们的示例中,我们使用了物理引脚 6 (GND,第 3 行,最右边列)
- 在面包板上,将连接到 GND 电源的跳线公端连接到右侧的 接地总线。面包板的整列都连接在一起,所以哪一行都可以。在我们的示例中,我们将其连接到第 1 行。
- 对于每个 LED:将 LED 连接到 2 个接线点行。在我们的示例中,我们连接了
- LED1 到第 5 行(阴极)和第 6 行(阳极),J 列
- LED2 到第 8 行(阴极)和第 9 行(阳极),J 列
- LED3 到第 11 行(阴极)和第 12 行(阳极),J 列
- LED4 到第 14 行(阴极)和第 15 行(阳极),J 列
- LED5 到第 17 行(阴极)和第 18 行(阳极),J 列
- LED6 到第 20 行(阴极)和第 21 行(阳极),J 列
- LED7 到第 23 行(阴极)和第 24 行(阳极),J 列
- LED8 到第 26 行(阴极)和第 27 行(阳极),J 列
- 对于每个 LED:将 220 欧姆电阻的一条引脚连接到右侧的 接地总线 列,另一条引脚连接到右侧的接线点行,该行连接到 LED 的阴极引脚。在我们的示例中,我们连接了
- LED1 到第 5 行,I 列
- LED2 到第 8 行,I 列
- LED3 到第 11 行,I 列
- LED4 到第 14 行,I 列
- LED5 到第 17 行,I 列
- LED6 到第 20 行,I 列
- LED7 到第 23 行,I 列
- LED8 到第 26 行,I 列
- 对于每个 LED:将跳线的母端连接到树莓派上的 GPIO 引脚,将跳线的公端连接到右侧的接线点行,该行连接到 LED 的阳极引脚。在我们的示例中,我们连接了
- LED1 从物理引脚 7 (GPIO 4,第 4 行,最左边列) 到接线点行 6,F 列
- LED2 从物理引脚 11 (GPIO 17,第 6 行,最左边列) 到接线点行 9,F 列
- LED3 从物理引脚 13 (GPIO 27,第 7 行,最左边列) 到接线点行 12,F 列
- LED4 从物理引脚 15 (GPIO 22,第 8 行,最左边列) 到接线点行 15,F 列
- LED5 从物理引脚 12 (GPIO 18,第 6 行,最右边列) 到接线点行 18,F 列
- LED6 从物理引脚 16 (GPIO 23,第 8 行,最右边列) 到接线点行 21,F 列
- LED7 从物理引脚 18 (GPIO 24,第 9 行,最右边列) 到接线点行 24,F 列
- 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
结束程序。