今年早些时候,我写了一篇文章,关于如何使用 Raspberry Pi 创建音乐灯光秀,使用了一个叫做 LightShowPi 的开源项目。 我的圣诞树灯光秀很受欢迎,我被邀请为北卡罗来纳州的一群中学生演示它。
这使我想到了今年的圣诞季。我曾想过将灯光秀搬到室外,但由于生活琐事,我最终没有足够的时间(或动力)来实现这一飞跃。 不过,我确实花了一些时间来改进去年的设置。
不再是五个通道运行 500 个灯,而是八个通道运行 800 个灯。 我还修改了 LightShowPi 的配置,以更自定义灯光。 我在四个通道中运行所有歌曲,并镜像其他四个通道。 这样,灯光会更有趣,并且在某些歌曲期间,未使用的通道引起的熄灭现象也会减少。
我的配置现在也是无头的(即,没有显示器),并且在 Raspberry Pi 2 上运行。 无头配置很好,因为我不再需要树下的空间来放显示器。 Raspberry Pi 2(而不是 B+)没有太大区别,因为 LightShowPi 的性能在任何版本中都很好。 有了 WiFi 加密狗,我只需通过手机 SSH 连接到 Pi,就可以随时启动/停止灯光和音乐。
最后,今年我还花了一些心思在歌曲选择上,试图在播放列表中添加更多种类和有趣的歌曲。
这是今年圣诞树的样子示例
在圣诞树灯亮起并开始“跳舞”之后,一个问题立即变得明显:我的妻子和孩子们想要一种简单的方法来在“常亮”和“跳舞”模式之间切换。
所以,我翻阅了我的 Raspberry Pi CanaKit,并决定尝试使用它附带的按钮来解决这个有趣的问题。
为了帮助我设置按钮,我使用了这个不错的视频教程。 这是结果。
然后我必须编写一些代码才能使其工作。起初,我的代码基于我上面链接的 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}')
就是这样! 这是最终结果
9 条评论