在过去的节日里,我决定通过设置 DIY 灯光显示来为我们的房子增添一些乐趣。 我使用了 Raspberry Pi、可编程灯串和 Python。
由于 WS12911/2(或 NeoPixel)系统的灵活性,您可以按照这些说明为任何场合设置自己的灯光显示。
先决条件
您将需要
- 1 – 带排针和以太网或 WiFi 连接的 Raspberry Pi。 我使用了带排针的 Raspberry Pi Zero W。
- 1 – WS12811/2 灯串。 我使用了 Alitove WS2811 可寻址 LED 像素灯 50,但还有许多其他类型可用。 Adafruit 将这些品牌命名为 NeoPixel。
- 1 – 用于 WS12811 的 5v/10A AC-DC 电源(如果您使用 Alitove)。 其他灯可能带有电源。
- 1 – 面包板
- 2 – 面包板到 Pi 排针的跳线。 我使用蓝色作为 Pi GPIO 引脚 18,黑色作为 Pi 接地。
- 1 – 74AHCT125 电平转换芯片,用于安全地将 Pi GPIO 电线信号传输到 5v/10A 电源,而不会反馈到 Pi。
- 8 – 面包板到面包板的跳线或实芯 24 AWG 电线。 我使用红色/橙色作为 5v 电源,黑色作为接地,黄色作为数据。
- 1 – 安装了 Raspberry Pi OS 的 SD 卡。 我使用了 Raspberry Pi OS Lite 并在启用 SSH 的无头模式下进行了设置。
什么是 WS2811/2 可编程 LED?
WS2811/2 类可编程灯将红色、绿色和蓝色 LED 灯与驱动芯片集成到一个微小的表面贴装封装中,并通过单根导线控制。

(Darin London,CC BY-SA 4.0)
每个灯都可以使用 RGB 整数集或十六进制等效项单独编程。 这些灯可以组合成矩阵、灯串和其他外形尺寸,并且可以使用对该外形尺寸有意义的数据结构以编程方式访问它们。 我使用的灯串使用标准 Python 列表寻址。 Adafruit 有一个很棒的 关于接线和控制灯的教程。
使用 Python 控制 NeoPixel LED
Adafruit 为其销售的大部分零件创建了一整套 Python 库。 这些库旨在与 CircuitPython 配合使用,CircuitPython 是 Adafruit 专为低成本微控制器板设计的 Python 端口。 您不需要在 Raspberry Pi OS 上安装 CircuitPython,因为预安装的 Python 2 和 Python 3 是兼容的。
您将需要 pip3
来安装 Python 3 的库。使用以下命令安装它
sudo apt-get install python3-pip
然后安装以下库
一旦安装了这些库及其依赖项,您就可以编写如下代码来编程一个或多个连接到您的 Raspberry Pi 的灯,使用 sudo python3
(需要 sudo)
import board
import neopixel
num_lights = 50
# program 50 lights with the default brightness 1.0, and autoWrite true
pixels = neopixel.NeoPixel(board.D18, num_lights)
# light 20 bright green
pixels[19] = (0,255,0)
# light all pixels red
pixels.fill((255.0,0))
# turn off neopixels
pixels.fill((0,0,0))
设置您的照明系统
- 将 SD 卡安装到 Raspberry Pi 中并固定好,将面包板和灯 放置在需要的位置(魔术贴适用于 Pi 和面包板)。
- 根据此原理图安装 74AHCT125 电平转换芯片、灯、电源和 Pi
- 使用连接器将额外的灯串连接到第一个灯。 请注意灯的总数。
- 将电源插入墙壁插座。
- 将 Raspberry Pi 电源插入墙壁插座,并等待它启动。

(Darin London,CC BY-SA 4.0)

(Darin London,CC BY-SA 4.0)

(Darin London,CC BY-SA 4.0)
安装灯光控制器和 Flask Web 应用程序
我编写了一个 Python 应用程序和库来与灯光交互,以及一个在 Pi 上运行的 Flask Web 应用程序。 有关代码的更多信息,请参见我的 Raspberry Pi Neopixel Controller GitHub 存储库。
lib.neopixc 库
lib.neopixc
库扩展了 neopixel.NeoPixC
类,以使用以串行方式连接的两个 50 灯 Alitove 灯串,使用可编程的 RGB 颜色列表。 它添加了以下函数:
set_color
:接受 RGB 颜色的列表的新列表walk
:遍历每个灯并按顺序将其设置为颜色rotate
:将列表的列表中的最后一种颜色推送到列表的列表的开头,以闪烁灯光
如果您的灯的数量不同,则需要编辑此库以更改 self._num_lights
值。 此外,某些灯需要在 order 构造函数属性中使用不同的参数。 Alitove 与默认 order 属性 neopixel.GRBW
兼容。
run_lights.py 脚本
run_lights.py
脚本使用 lib.neopixc
来支持颜色文件和状态文件,以动态设置灯在任何时候的行为。 颜色文件是 RGB(或 RGBW)整数数组的 JSON 数组,使用其 set_colors
方法将其作为颜色馈送到 lib.neopixc
对象。 状态文件可以包含以下三个词之一
static
:不在 while 循环的每次迭代中旋转灯光blink
:在主 while 循环的每次迭代中旋转灯光down
:关闭所有灯
如果状态文件不存在,则默认状态为 static
。
该脚本还具有 HUP 和 INT 信号处理程序,当收到这些信号时,它们将关闭灯。
注意:由于 GPIO 18 引脚需要在 Raspberry Pi 上使用 sudo 才能工作,因此必须使用 sudo 运行 run_lights.py
脚本。
neopixel_controller 应用程序
neopixel_controller
Flask 应用程序,位于 github 存储库的 neopix_controller 目录中(见下文),提供了一个前端浏览器图形用户界面 (GUI) 来控制灯光。 我的 raspberry pi 连接到我的 wifi,并且可以在 raspberrypi.local 访问。 要在浏览器中访问 GUI,请转到 http://raspberrypi.local:5000。 或者,您可以使用 ping 查找 raspberrypi.local 的 IP 地址,并将其用作主机名,如果您有多个连接到您的 wifi 的 raspberry pi 设备,这将非常有用。

(Darin London,CC BY-SA 4.0)
当前状态和三个前端按钮使用 JavaScript 与 Flask 应用程序提供的一组 REST API 端点进行交互
/api/v1/state
:返回共享状态文件的当前状态,如果状态文件不存在,则默认为static
/api/v1/blink
:将状态文件设置为 blink/api/v1/static
:将状态文件设置为 static/api/v1/down
:将状态文件设置为 down
我编写了两个脚本和相应的 JSON 定义文件,用于启动 run_lights.py
和 Flask 应用程序
launch_christmas.sh
launch_new_years.sh
这些可以在设置好 Pi 后,从 Pi 上的命令行会话(终端或 SSH)启动(它们不需要 sudo,但在内部使用 sudo)
./launch_christmas.sh
您可以使用 lights_down.sh
关闭灯并停止 run_lights.sh
和 Flask 应用程序。
该库和 flask 应用程序的代码位于 Raspberry Pi Neopixel Controller GitHub 存储库中。
2 条评论