用树莓派DIY“啪啪”声控开关


MAKER:Ash/译:趣无尽 Cherry(转载请注明出处)
20世纪90年代曾有一款风靡一时的“智能家居”产品,只需要拍拍手就可以使唤家里的家电。

当年的奥秘就藏在这个盒子里面,来回顾这段经典广告视频吧:

虽然现在的智能家居已经离智能更进一步,但就使用便捷性来说,拍拍手还是比吼一嗓子“XX精灵”要更有范儿吧!

下面我们介绍如何用树莓派实现一个“啪啪”声控开关。

在本项目中,它被用来控制 LED 灯的开关。项目是使用拍手来启动开关并执行基本命令。设备还可以通过拍手来实现其他操作,如关闭树莓派,调整灯光,播放音乐,激活电机,甚至可以将树莓派连接到社交媒体并发送推文等。总之,只要动动手就有无限可能~

材料清单

树莓派(Raspberry Pi)3B+ ×1
母对母跳线 ×2
红色 LED ×1

安装并更新Raspbian

安装最新版本的 Raspbian 。查看详细步骤

安装树莓派的 GPIO


1、访问树莓派终端。你可以通过 Raspbian 桌面或使用 PuTTY 等远程登录工具来操作。
2、启用 SSH 。请点击查看,了解如何通过SSH登录树莓派
3、运行以下脚本,安装 GPIO 工具。
树莓派拍手开关将激活 LED 灯。发送信号让它运行,在此,需要使用 GPIO 引脚,使用树莓派 GPIO 来控制它们。

pip install RPi.GPIO

安装 pyaudio


拍手动力机制将通过麦克风输入进行控制。要在脚本中使用音频,需要安装 pyaudio 。安装很简单,只需运行以下脚本即可。

sudo apt-get install python-pyaudio

安装树莓派“拍手”脚本


我使用的拍手检测脚本是由 nikhiljohn10在 github 上创建的。
可以在项目文件库中下载。
https://make.quwj.com/project/97
代码如下:

#!/usr/bin/python
import pyaudio
import sys
import thread
from time import sleep
from array import array
import RPi.GPIO as GPIO

clap = 0
wait = 2
flag = 0
pin = 24
exitFlag = False    

def toggleLight(c):
    GPIO.output(c,True)
    sleep(1)
    GPIO.output(c,False)
    print("Light toggled")

def waitForClaps(threadName):
    global clap
    global flag
    global wait
    global exitFlag
    global pin
    print "Waiting for more claps"
    sleep(wait)
    if clap == 2:
        print "Two claps"
        toggleLight(pin)
    # elif clap == 3:
    #     print "Three claps"
    elif clap == 4:
        exitFlag = True
    print "Claping Ended"
    clap = 0
    flag = 0

def main():
    global clap
    global flag
    global pin

    chunk = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 44100
    threshold = 3000
    max_value = 0
    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT,
                    channels=CHANNELS, 
                    rate=RATE, 
                    input=True,
                    output=True,
                    frames_per_buffer=chunk)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.OUT)
    try:
        print "Clap detection initialized"
        while True:
            data = stream.read(chunk)
            as_ints = array('h', data)
            max_value = max(as_ints)
            if max_value > threshold:
                clap += 1
                print "Clapped"
            if clap == 1 and flag == 0:
                thread.start_new_thread( waitForClaps, ("waitThread",) )
                flag = 1
            if exitFlag:
                sys.exit(0)
    except (KeyboardInterrupt, SystemExit):
        print "\rExiting"
        stream.stop_stream()
        stream.close()
        p.terminate()
        GPIO.cleanup()

if __name__ == '__main__':
    main()

请将其放在/home/pi目录下。

连接麦克风

树莓派通过麦克风收集拍手的声音,我使用 USB 麦克风。请将你的首选设备连接到树莓派。
根据房间里的噪音水平,你可能会发现不同麦克风的收音音频效果不一样。你可以使用在文本编辑器来编辑拍手脚本,手动调整拍手阈值。该项目需要对麦克风和拍手脚本设置进行一定程度的微调。

连接输出设备


触发“拍手”的设备是由你自己决定的。你可以选择激活特定设备、运行程序、播放特定声音、或其他由 Python 脚本触发的内容。

本教程中,使用2个拍子点亮 LED,4个拍子关闭 LED 。
将触发的设备连接到 GPIO 引脚。设置LED的接线电路如图所示。根据不同的 LED,你可能需要一个电阻。

测试拍手的次数

重启树莓派。打开终端或使用 SSH 连接到树莓派。运行 clap.py。

sudo python clap.py

拍手!如果一切正常,需要注册并检查终端确认。如果检测到拍手,程序将打出一行文字。

这是你微调麦克风灵敏度和调整拍击脚本设置的机会。尝试使用阈值限制来减少因拍手而检测到的额外噪音。

设置开机启动


把 clap.py 添加到 crontab 启动列表中。使用以下命令打开 crontab 文件。

crontab -e

在文件的底部,添加一行。

@reboot nohup python clap.py &

保存文件并关闭。现在,你的树莓派将在启动时自动开始侦听拍手声了。

测试成品


一切完成后,重新启动树莓派。
当它启动时,树莓派应该立即启动拍手检测脚本。大概10-20秒后即可拍手检测!

你现在可以用拍手去控制你想开关的任何设备!

via https://make.quwj.com/project/97

坐沙发

发表评论

你的邮件地址不会公开


*