使用Raspberry Pi进入房间时播放自己的主题曲

您曾经想过回到家中受到个人欢迎吗?有了Raspberry Pi和一些简单的组件,您就可以!在这个简单的项目中,我们将使用簧片开关在门打开时触发主题曲。尽管您可以使用相同的电路在该项目中使用几乎任何其他微控制器,但在这里我们将使用Raspberry Pi作为控制器。这是一个演示。

您将需要

您可能已经拥有制作所需的所有零件,除了簧片开关(大约$ 2-3),或者您可以只需$ 8,即可得到5包。

  • Raspberry Pi(任何型号都可以使用)。
  • 1 x 220欧姆电阻。
  • 1 x 1K欧姆电阻。
  • 3 x 10K欧姆电阻。
  • 1 x磁簧开关。
  • 1 x LED。
  • 2 x按钮开关。
  • 面包板。
  • 连接线。
  • 电脑扬声器或类似产品。
  • 我们将进入房间后,请使用Raspberry Pi播放歌曲,并在面包板上设计带有按钮的电路以延迟激活它并停止程序。

    此项目主要是为有趣,涵盖了DIY家庭自动化中许多应用的基础知识

    入门

    让我们从制作电路开始。确保您的Pi没电,并按如下所示设置电路:

    LED已连接到我们pi的引脚7。两个按钮开关分别连接到引脚11和13,舌簧开关连接到引脚15。我们的电源连接到引脚1(3v3)和引脚6(Gnd)。

    请务必检查一切都在正确的位置。

    在测试该项目时,可能有助于将簧片开关置于您的面前,因此您可以轻松地将其打开或关闭。在这种情况下,舌簧开关已经安装在门上方。一旦您的项目启动并运行,您可以使用胶带将开关暂时连接到门上,或者如果您更有信心可以将其更永久地连接以用于将来的项目中!

    连接3.5 Pi的mm插孔输出到扬声器系统。一切放好后,它应该看起来像这样:

    请注意,此处使用的面包板具有电源轨,与上面的Fritzing图相反。

    现在启动电源您的Pi,并使用SSH访问它,以便我们可以访问终端。如果您不确定如何执行此操作,本指南可以为您提供帮助。如果您将Raspberry Pi与显示器,鼠标和键盘一起使用,请跳过此步骤并打开终端。

    在开始之前,值得检查您是否最新。在终端中输入 sudo apt-get update

    现在我们可以继续让Pi与电路通信了。

    首先,让我们使用一个简单的程序检查电路。如果您确信到目前为止一切都正确,您可以跳过此步骤,尽管我建议您这样做,因为这样可以避免以后出现头痛。

    如果您以前从未使用过Python编程并且感到有点畏缩,有很多很棒的网站可以帮助您入门。

    在终端中,创建一个新脚本:

    nano test.py

    一旦打开,请将此代码添加到文件,然后在保存对话框后按Ctrl-C退出:

    #This code was written for an article on www.PCPC.me by Ian Buckley.import RPi.GPIO as GPIOimport timeGPIO.setwarnings(False)GPIO.setmode(GPIO.BOARD)GPIO.setup(7,GPIO.OUT)GPIO.setup(11,GPIO.IN)GPIO.setup(13,GPIO.IN)GPIO.setup(15,GPIO.IN)while True:        GPIO.output(7,GPIO.HIGH)        if (GPIO.input(11)==1):                print("Button on GPIO 11")                time.sleep(1)        if (GPIO.input(13)==1):                print("Button on GPIO 13")                time.sleep(1)        if (GPIO.input(15)==1):                print("Button on GPIO 15")                time.sleep(1)GPIO.cleanup()

    此代码读取按钮的值并在按钮更改时打印到屏幕上。两个按钮具有下拉电阻,因此按下时它们报告为高电平。只要其随附的磁铁闭合,磁簧开关就会报告为HIGH。

    运行程序:

    python test.py

    您应该看到LED亮起,并在按下时向屏幕报告您的两个按钮,然后将磁铁从簧片开关上拉开。如果您在按按钮时没有收到反馈,请再次检查电路,并确保一切均已连接。完成测试后,按 CTRL-C 停止程序。

    现在,我们可以放一个简单的程序来设置,触发和重置门传感器。我们将遍历各部分的代码,并简要说明每个部分的功能,但是如果您想向下滚动完整的代码以查看完整的内容,则可以使用。

    我们需要从导入一些模块开始:

    import Rpi.GPIO as GPIOimport pygame.mixerimport time

    我们将使用 Pygame 模块播放音乐。它是Raspbian Jessie的标准配置,并且是编写Python游戏和许多其他出色项目所需的一切的强大库。

    我们将使用一个名为 active 的变量决定我们的系统是否处于活动状态。让我们定义几个函数来为我们做这些事情:

    def activeSetup():        global active        active=0        print("Currently Not Active")def activeState():        global active        if active==1:                active=0                GPIO.output(7,GPIO.LOW)                print("Currently Not Active")        elif active==0:                print ("Activating in 10 seconds")                for x in range(0,10):                        GPIO.output(7,GPIO.HIGH)                        time.sleep(0.5)                        GPIO.output(7,GPIO.LOW)                        time.sleep(0.5)                active=1                GPIO.output(7,GPIO.HIGH)                print("Currently Active")        else: return

    这里的第一个函数创建一个名为 active 的变量,并将其设置为0。为活动状态提供数字值表示如果您打算以后扩展程序以使其具有不同的活动状态,则可以对其进行相应编号。尽管它可能不是世界上最好的Python编程,但对于这个项目来说已经足够了。

    调用时的第二个函数检查系统是否处于活动状态(或 active == 1 )。如果是,它将设置系统为非活动状态( active == 0 ),关闭LED并打印到控制台。如果不是,那么它会为您提供10秒钟的倒数时间,使其离开LED闪烁的房间,然后继续显示系统处于活动状态。

    现在,我们可以定义一个函数来观察我们的磁簧开关:

    def watchDoor():        global playing        playing = False        while True:                if active==1 and GPIO.input(15)==1 and playing == False:                        playing=True                        pygame.mixer.music.play()                if GPIO.input(13)==1:                        print("Stop button pressed: Exiting")                        pygame.mixer.music.stop()                        break                if GPIO.input(11)==1:                        activeState()                        time.sleep(0.5)

    我们在这里创建了另一个名为 playing 的变量-在那里只是为了停止程序,尝试在触发开关时重复开始播放。

    在while循环中,第一个if语句开始播放音乐(我们还没有音乐,但是不用担心,它来了)。仅当系统处于活动状态,簧片开关打开且尚未播放时,音乐才能开始播放。

    第二个if语句用于退出按钮。如果按下此按钮,音乐将停止并且程序将退出。

    第三个if语句用于切换系统是否处于活动状态。此处的 time.sleep 功能是为了防止按下时读取多个按钮。

    现在是时候设置Pi的引脚了。

    GPIO.setmode(GPIO.BOARD)GPIO.setup(7, GPIO.OUT,initial=GPIO.LOW)GPIO.setup(11,GPIO.IN)GPIO.setup(13,GPIO.IN)GPIO.setup(15,GPIO.IN)

    如果您在使用Pi之前已经做过任何实验,那么您应该已经熟悉了。引脚7设置中的 initial = GPIO.LOW 参数将在初始化后立即将其设置为低电平。

    现在,我们可以调用函数,将系统设置为不

    activeSetup()

    音乐大师!

    这时,我们应该开始考虑要播放的音乐。您可以选择所需的任何音乐文件,但是我们现在将选择适合所有人的内容。如果您观看YouTube,您可能已经很熟悉Kevin MacLeod的音乐。让我们下载他的一首美妙的乐曲,称为“独眼大师"。这以及他网站上的许多音乐均已获得知识共享(Creative Commons)的许可,并且有很多充分的理由将这些许可的内容用于您的项目。

    返回我们的代码,我们需要启动Pygame混音器并加载我们的音乐。

    pygame.mixer.init(44100,-16,2,1024)pygame.mixer.music.set_volume(1.0)name = "One-eyed Maestro.mp3"pygame.mixer.music.load(name)print("Loaded track - "+ str(name))

    此块的第一行将启动 Pygame 混音器。括号中的最后一个参数是缓冲区,该缓冲区控制播放声音的延迟。如果以后播放音乐时出现断断续续的播放,请尝试将此数字增加到4096。在Pi 3上可以正常使用的设置。

    如果将音乐文件下载到其他目录,您的 door.py 程序,定义名称变量时需要在方括号内提供完整路径。

    现在剩下要做的就是建立一个循环

    while True:        if(GPIO.input(13)==1):                print("Stop button pressed: Exiting")                pygame.mixer.music.stop()                break        if(GPIO.input(11)==1):                activeState()                time.sleep(0.5)        if(active==1):                watchDoor()                breakGPIO.cleanup()

    此while循环等待来自任一按钮的输入,并相应地退出或更改为活动状态。如果活动状态变为1,则将调用我们之前定义的 watchDoor 函数,并且在下次打开门时将播放我们的乐曲。我们还调用 GPIO.cleanup()来重置退出时的引脚,这通常是对Raspberry Pi上所有编程的一个好习惯。

    这就是我们要做的一切启动并运行该项目,下面是完整的代码:

    import RPi.GPIO as GPIOimport pygame.mixerimport timedef activeSetup():        global active        active=0        print("Currently Not Active")def activeState():        global active        if active==1:                active=0                GPIO.output(7,GPIO.LOW)                print("Currently Not Active")        elif active==0:                print ("Activating in 10 seconds")                for x in range(0,10):                        GPIO.output(7,GPIO.HIGH)                        time.sleep(0.5)                        GPIO.output(7,GPIO.LOW)                        time.sleep(0.5)                active=1                GPIO.output(7,GPIO.HIGH)                print("Currently Active")        else: returndef watchDoor():        global playing        playing = False        while True:                if active==1 and GPIO.input(15)==1 and playing == False:                        playing=True                        pygame.mixer.music.play()                if GPIO.input(13)==1:                        print("Stop button pressed: Exiting")                        pygame.mixer.music.stop()                        break                if GPIO.input(11)==1:                        activeState()                        time.sleep(0.5)GPIO.setmode(GPIO.BOARD)GPIO.setup(7, GPIO.OUT,initial=GPIO.LOW)GPIO.setup(11,GPIO.IN)GPIO.setup(13,GPIO.IN)GPIO.setup(15,GPIO.IN)activeSetup()pygame.mixer.init(44100,-16,2,1024)pygame.mixer.music.set_volume(1.0)name = "One-eyed Maestro.mp3"pygame.mixer.music.load(name)print("Loaded track - "+ str(name))while True:        if(GPIO.input(13)==1):                print("Stop button pressed: Exiting")                pygame.mixer.music.stop()                break        if(GPIO.input(11)==1):                activeState()                time.sleep(0.5)        if(active==1):                watchDoor()                breakGPIO.cleanup()

    如果您在此处向下滚动以立即获取完整的代码,请记住,您仍然需要将音乐下载到Pi上以用于它可以正常工作!

    现在,您应该可以正常运行欢迎的主题曲了!将簧片开关安装到门上,然后尝试一下。令人尴尬的跳舞是可选的,但建议这样做。

    该项目涵盖了各种形式的家庭监控,安全性和自动化的基础知识,希望它也很有趣!

    现在您已经走了这么远,为什么停在那里?您可以添加更多轨道,并让程序从列表中随机选择一个。您可以添加一个中继,并在输入时触发其他对象。如果您有家庭音乐系统,为什么不为每个房间都提供主题曲?

    您会设计自己的个人欢迎家庭信息吗?您是否以其他方式在家里使用磁簧开关进行了创新?如果是这样,请在下面的评论部分中留下您正在计划或已经完成的事情的评论!

    标签: 家庭自动化 Raspberry Pi