使用 Raspberry Pi SSH 远程控制你的圣诞树

目前还没有读者喜欢这篇文章。
LightShowPi Christmas tree

Anderson Silva。CC BY-SA 4.0。

今年早些时候,我写了一篇文章,关于如何使用 Raspberry Pi 和一个名为 LightShowPi 的开源项目来创建一个音乐灯光秀。我的小型圣诞树灯光秀非常受欢迎,我受邀为北卡罗来纳州的一群中学生演示它。

这让我想到了今年的圣诞季。我曾考虑将灯光秀搬到户外,但由于生活的繁忙,我最终没有足够的时间(或动力)来实现这一飞跃。不过,我确实花了一些时间来改进去年的设置。

我不再是五个通道运行 500 个灯,而是八个通道运行 800 个灯。我还修改了 LightShowPi 的配置,以更自定义灯光。我正在四个通道中运行所有歌曲,并镜像其他四个通道。这使得灯光更有趣,并减少了某些歌曲期间未使用通道造成的黑屏。

我的配置现在也是无头的(即没有显示器),并且运行在 Raspberry Pi 2 上。无头配置很好,因为我不再需要在树下为显示器腾出空间。Raspberry Pi 2(而不是 B+)并没有太大的区别,因为 LightShowPi 在任何版本中的性能都很好。借助 WiFi 加密狗,我可以随时通过手机 SSH 连接到 Pi,并启动/停止灯光和音乐。

最后,今年我还对歌曲选择进行了一些更多的思考,尝试在播放列表中添加更多种类和有趣的歌曲。

Christmas playlist screenshot

这是今年圣诞树样子的示例

在圣诞树灯亮起并“跳舞”后,一个问题立即变得显而易见:我的妻子和孩子们想要一种简单的方法来在“常亮”和“跳舞”模式之间切换。

所以,我翻看了我的 Raspberry Pi CanaKit,并决定尝试使用它附带的按钮来解决这个有趣的问题。

为了帮助我设置按钮,我使用了 这个不错的视频教程。这是结果。

LightShowPi wiring

然后我必须编写一些代码来使其工作。起初,我的代码是基于我上面链接的 YouTube 视频,但我不喜欢它有太多的循环。所以,我做了更多的阅读,并能够想出一个更好的代码片段。诚然,我确信代码可以改进很多,但对于小型个人项目/概念验证来说已经足够好了。


#!/usr/bin/env python

import RPi.GPIO as gpio
import os
import time

gpio.setmode(gpio.BCM)
gpio.setup(4, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(17, gpio.IN, pull_up_down=gpio.PUD_UP)
lights = 0

while True:
    b1 = gpio.input(4)
    b2 = gpio.input(17)
    #button 1 (solid lights)
    if (b1 == False):
       if lights == 0:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo python /home/pi/lightshowpi/py/hardware_controller.py --state=on")
           lights = 1
       elif lights == 1:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo python /home/pi/lightshowpi/py/hardware_controller.py --state=off")
           lights = 0

    #button 2 (dancing mode)
    if (b2 == False):
       if lights == 0:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo lightshowpi/bin/start_music_and_lights")
           lights = 1
       elif lights == 1:
           os.system("export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi; sudo lightshowpi/bin/stop_music_and_lights")
           lights = 0

    # trying not to waste cycles on the pi
    time.sleep(0.2)

上面的代码基本上使用 python RPi python 库与我用于按钮的两个 GPIO 引脚(引脚 4 和 17)进行交互,如果按下按钮并且灯已经熄灭,则将其打开,反之亦然。

最后——这花了我一段时间才弄清楚——我必须修改 LightShowPi 自带的 $SYNCHRONIZED_LIGHTS_HOME/bin/stop_music_and_lights 脚本,因为它上面有一个 sudo killall python,会杀死我的 Python 脚本。

所以,我将该行修改为

sudo kill $(ps aux | grep 'synchronized_lights.py' | awk '{print $2}')

就是这样!这是最终结果的预览

User profile image.
Anderson 在 1996 年由他的叔叔介绍接触了 Linux。在 2000 年代初期,他从开发人员转型为系统管理员。如今,Anderson 领导 Red Hat 信息安全事件响应团队。他还是 Fedora 软件包的活跃维护者。

9 条评论

我喜欢这篇文章,我想尝试做你所做的事情。我有一个 Raspberry Pi Canakit,感谢你精彩的文档,我很有机会做到这一点。:)

好的。那么有没有办法通过手机 SSH 连接来让灯光常亮?我现在才刚开始学习 SSH,所以我不确定我的问题是否好或者是否有意义。

是的。至少在使用 LightShowPi 时,你需要一个 SSR 板(如 Sainsmart),你可以 ssh 连接到 Pi,并运行命令:export SYNCHRONIZED_LIGHTS_HOME=/home/pi/lightshowpi && sudo python /home/pi/lightshowpi/py/hardware_controller.py --state=on

你可以阅读我之前的文章,了解如何入门。

回复 作者 Rick Weinberg (未验证)

Anderson,这项工作和文档都很棒。从灯光常亮切换到跳舞是我还没有尝试过的。我喜欢你的设置方式。也许我会有时间在明年准备好它。今年没时间了。

请原谅我的新手问题,但是你只是通过 rpi 和继电器来打开和关闭灯光吗?

我不确定我是否理解你的问题,但我正在使用 lightshowpi 来完成整个跳舞灯光的事情,但在 lightshowpi 中,有一种方法可以打开和关闭灯光……所以我添加了它。但是可以把圣诞灯连接到继电器和 raspberry pi,然后只编写一些简单的 python 代码来做同样的事情。这有帮助吗?

回复 作者 zenmaster (未验证)

嗨,Anderson。太棒了!很棒的文章!!!你的名字很像葡萄牙语。你是巴西人还是葡萄牙人?

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© 2025 open-source.net.cn. All rights reserved.