在我年轻的时候,我最喜欢的摔跤手绝对是被称为“Heartbreak Kid”的Shawn Michaels。他是一个伟大的运动员和表演者,所做的一切都非常有趣。
从他进入大楼的那一刻开始,这首音乐响起:
这让我开始思考,如果Shawn Michaels可以以这种方式入场,为什么我不能?
是的,有了Raspberry Pi和Python chops,像我(或者您!)这样的家伙也许就可以拥有登场音乐了。
Raspberry Pi如何检测出您的登场?
这里有几种选择。
我们可以检测出您的手机是否连接到无线网络。这很有用,因为Raspberry Pi可以确认是否是您本人在进入(而非您的室友或家人)。
缺点是它对您的距离的测定不太精确。我的意思是,这是登场音乐,对吗?它应该在您进门时开始响起。
您也可以改用PIR运动传感器。这可以将音乐与入门动作精确匹配,不过这种方法无法对正在进入的人作出区分。
所以,我们可以将这两者结合起来。Raspberry Pi将会在您的手机连接到无线网络时检测出您已经到家,然后等待传感器来检测出您进入的确切时间。
如果您更倾向于使用其中的一种,可以直接去除掉其他部分。
使用Python Subprocess模块
本项目还会引入Python的subprocess模块。该模块在标准库中,您无需进行安装。
使用该模块,我们可以在Python内部运行shell命令。这非常方便。如果您已经知道这些命令行是如何执行操作的,只需直接运行该命令即可。
我们将使用的两个命令是mpg123和ping。
mpg123是一个用于播放mp3文件的命令行实用程序。我们需要安装mpg123。
您不需要安装ping,系统中已经有了。这是一个简单的工具,用于检查远程服务器或设备是否处于连通状态并作出响应。我们将使用它来检查您的手机是否连接到了您的无线网络。
所需组件
对于本项目,您将需要以下组件:
带有电源、无线网卡以及一个 SD 卡的 Raspberry Pi |
|
一个PIR运动传感器 (我使用的是XC-4444) |
|
Shawn Michaels所演唱的Sexy Boy高品质MP3文件(或者您也可以选择其他非常钟意的歌曲) | |
从Raspberry Pi播放音乐的某种方式。连接到HDMI端口的家庭娱乐系统是比较理想的 |
您还需要一部智能手机、一个无线家庭网络和3根公对母跳线。
确保您的手机设置为自动连接到您家里的无线网络,并且没有使用任何省电设置,以防手机在不使用时禁用无线网络。
这里我们假设您已经了解PIR运动传感器和GPIO Zero库了。如果没有,请先查看这些相关介绍。您将从中了解该设备的工作原理,在本项目中我们将以大致相同的方式对其进行接线。
本项目用Raspberry Pi OS Buster进行了测试,但是旧版本的Raspbian应该也没问题。我们使用的Python模块和Linux命令都是存在已久的了。
设置Raspberry Pi
我们首先为这个项目创建一个目录,并进入该目录。打开终端并输入:
mkdir ~/entrancemusic
cd ~/entrancemusic
用一种您喜欢的方式将mp3文件复制到此目录中。
然后用以下命令更新您的系统并安装mpg123:
sudo apt update && sudo apt upgrade -y
sudo apt install mpg123
连接PIR运动传感器
这次我们不使用面包板。对于我们的项目来说,面包板将会产生阻碍。
拿起您的PIR运动传感器和跳线。将传感器的电源引脚连接到Raspberry Pi的5V电源引脚。然后将传感器的接地引脚连接到Raspberry Pi上的接地引脚。
然后将数字输出连接到一个GPIO引脚。我使用的是引脚24,因为它的位置比较方便。
这就是运动传感器的全部接线过程。将其摆放为面向您将要进入的门口。
为您的智能手机保留IP地址
几乎所有家庭无线网络都使用DHCP来为所连接的新设备自动分配可用的IP地址。这很方便,因为它很可靠并且无需让您进行管理。
这也意味着特定设备的IP地址可能会不时发生更改。对于本项目,我们希望您的手机始终分配到同一个IP地址上,并且没有其他设备使用该地址。
大多数路由器为一个设备分配的IP地址至少会持续一天左右的时间。因此,如果您只打算执行本项目一次,那么可以愉快地继续进行,不必再为此困扰。
但是如果您想多次运行此脚本,那么您应该为您的设备保留一个IP地址。您可以通过登陆无线路由器的管理面板来执行此操作。不同的路由器对此的处理方式略有不同,但通常操作方式都比较容易。如果您遇到了困难,请使用搜索引擎查找您设备的手册。
我的手机保留的IP地址为192.168.0.5。您的IP地址可能会有所不同,只需按照说明对其进行替换即可。
当还有一点是—您是否有使用SSH通过本地网络访问Raspberry Pi的习惯?请也为其保留一个IP地址。如果它的IP地址是不会改变的,那就更方便了。
使用mpg123播放登场音乐
要从命令行使用mpg123,你只需要输入您要播放的mp3名称即可,如下所示:
mpg123 ‘Sexy Boy (Shawn Michaels).mp3’
从Python运行此命令也并不复杂。
首先,导入subprocess模块中的run函数。然后将以上命令行作为第一个参数传递给该函数,并将“shell=True”作为第二个参数,如下所示:
from subprocess import run
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”, shell=True)
使用Ping检测您的手机是否已连接
您可以通过命令行ping您的手机,如下所示:
ping -c 192.168.0.5
请记得替换您手机的IP地址。我们添加“-c 1”来告诉ping只发送一次请求。如果我们不添加该内容,该命令将会被一直运行,直到被取消。
如果设备响应,ping将会返回成功。如果没有响应,将会返回一个错误代码。
理想情况下,我们可以用此错误代码来查看手机是否已经连接到网络。不幸的是,许多智能手机不会对请求发生响应。这就意味着无论您的手机是否连接到了网络,ping都会返回错误代码。
那么让我们来看看输出内容。如果没有设备在指定的IP地址上,那么输出中将包含语句“Destination Host Unreachabl(目标主机无法访问)”。
Python的subprocess模块包含Popen和PIPE对象,可以让我们对输出进行处理,如下所示:
subprocess import Popen, PIPE
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]
如果您想了解此代码中所运行的内容,请阅读此处。对于本项目来说,知道它运行了ping命令,然后将输出分配给了stdout_value就足够了。
我们可以使用它来编写一个循环程序,当“Destination Host Unreachable”没有出现在输出中时可进行中断。
while True:
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]
if b’Destination Host Unreachable’ not in stdout_value:
break
sl eep(2)
这个循环会一直运行到您的手机连接到网络为止。
将所有程序写到一个脚本中
我们现在已经具备了用于简单的登场音乐程序的所有代码块。输入以下命令打开一个新文件:
nano entrancemusic.py
然后输入(或粘贴)以下内容:
from time import sl eep
from signal import pause
from subprocess import run, Popen, PIPE
from gpiozero import MotionSensor
sl eep(600) # This gives you 10 minutes to leave your home
pir = MotionSensor(24)
while True:
p1 = Popen([“ping”, “-c”, “1”, “192.168.0.5”], stdout=PIPE)
stdout_value = p1.communicate()[0]
if b’Destination Host Unreachable’ not in stdout_value:
break
sl eep(2)
sl eep(5)
pir.wait_for_motion()
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”,
Save and exit nano.
如果您想在回家时安排登场音乐,请在离开家之前运行此脚本,输入:
python3 entrancemusic.py
微调
该脚本会像本文所述的那样运行,但是您可能会想要调试一些功能。
安排您的入场时间
您可能已经注意到了,此脚本会在传令传感器感应运动前休眠5秒钟,这是为什么?
这是为了对时间进行限制,从而防止其他人误用了您的登场音乐。如果您将运动传感器设置在了共享区域(例如客厅或大厅),这一点极为重要。
那么5秒钟是正确的等待时间吗?这取决于您的无线网络范围和家庭的布局。如果您的传感器正对着前门,您可能不希望有任何延迟。您可以进行多次尝试来找到合适的延迟时间。
图片:Raspberry Pi
多晚才算太晚?
如果您要去吃晚饭或去酒吧,很晚回家,这时候用Shawn Michaels的动感音乐吵醒大家怎么办?如果您完全沉迷于自己的角色扮演中,那么这将会是一个刺激竞争对手并且建立主导地位的绝佳机会。
至于我?我不愿意在晚上十点之后播放嘈杂的音乐。
我们可以使用time模块中的localtime()函数来检查时间。可以通过将脚本中的第一行更改为以下内容来导入该函数:
from time import sl eep, localtime
然后我们可以通过以下比较来检查时间是否在上午9点到晚上10点之间:
9 < localtime().tm_hour < 22
接下来,我们只需要将mpg123命令放置在if语句中即可。
if 9 < localtime().tm_hour < 22:
run(“mpg123 ~/entrancemusic/’Sexy Boy (Shawn Michaels).mp3′”, shell=True)
您可以根据自己的情况来调整设备的工作时间。
平凡客厅的隆重登场
世界上很少有人能够称为职业摔跤手。多亏了Python和Raspberry Pi,您也可以享受到隆重登场的感觉了。
您会对此做出进一步调整吗?请在评论中留下您的想法!
DevicePlus 编辑团队
设备升级版适用于所有热爱电子和机电一体化的人。
审核编辑黄宇
-
传感器
+关注
关注
2550文章
51035浏览量
753049 -
Raspberry Pi
+关注
关注
2文章
558浏览量
22195
发布评论请先 登录
相关推荐
评论