20世纪90年代曾有一款风靡一时的“智能家居”产品,只需要拍拍手就可以使唤家里的家电。当年的奥秘就藏在这个盒子里面,来回顾这段经典广告视频吧:
https://v.qq.com/x/page/s08351fzs20.html
虽然现在的智能家居已经离智能更进一步,但就使用便捷性来说,拍拍手还是比吼一嗓子“XX精灵”要更有范儿吧!
下面我们介绍如何用树莓派实现一个“啪啪”声控开关。
在本项目中,它被用来控制 LED 灯的开关。项目是使用拍手来启动开关并执行基本命令。设备还可以通过拍手来实现其他操作,如关闭树莓派,调整灯光,播放音乐,激活电机,甚至可以将树莓派连接到社交媒体并发送推文等。总之,只要动动手就有无限可能~
pi-clap-master.zip
[1772 Bytes at 2019-02-04, 121 次下载]
树莓派(Raspberry Pi)3B+ ×1
母对母跳线 ×2
红色 LED ×1
安装最新版本的 Raspbian 。查看详细步骤。
1、访问树莓派终端。你可以通过 Raspbian 桌面或使用 PuTTY 等远程登录工具来操作。
2、启用 SSH 。请点击查看,了解如何通过SSH登录树莓派。
3、运行以下脚本,安装 GPIO 工具。
树莓派拍手开关将激活 LED 灯。发送信号让它运行,在此,需要使用 GPIO 引脚,使用树莓派 GPIO 来控制它们。
pip install RPi.GPIO
拍手动力机制将通过麦克风输入进行控制。要在脚本中使用音频,需要安装 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秒后即可拍手检测!
你现在可以用拍手去控制你想开关的任何设备!