用树莓派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 来控制它们。

1
pip install RPi.GPIO

安装 pyaudio


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

1
sudo apt-get install python-pyaudio

安装树莓派“拍手”脚本


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/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。

1
sudo python clap.py

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

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

设置开机启动


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

1
crontab -e

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

1
@reboot nohup python clap.py &

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

测试成品


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

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

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

https://www.quwj.com/2019/02/14/raspberry-pi-clapper.html

这是一篇发布于 6年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


15 评论

发表评论

你的邮件地址不会公开


*