使用 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 中有一种方法可以打开和关闭灯...所以我添加了它。 但可以将圣诞灯连接到继电器和树莓派,然后只编写一些普通的 python 代码来做同样的事情。 这有帮助吗?

回复 作者 zenmaster (未验证)

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

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议授权。
© . All rights reserved.