前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云中树莓派(4):利用声音传感器控制Led灯

云中树莓派(4):利用声音传感器控制Led灯

作者头像
SammyLiu
发布2019-06-28 18:06:08
1.1K0
发布2019-06-28 18:06:08
举报
文章被收录于专栏:世民谈云计算世民谈云计算

云中树莓派(1):环境准备

云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示

云中树莓派(3):通过 AWS IoT 控制树莓派上的Led

云中树莓派(4):利用声音传感器控制Led灯

1. 声音传感器及其配置

声音传感器如下图所示:

将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20。

要注意,模块在环境声音强度达不到设定阈值时,OUT输出高电平(1),当外界环境声音强度超过设定阈值时,模块OUT输出低电平(0)。

2. GPIO Event 机制

树莓派提供了三种电信号事件反馈机制。

(1)GPIO.wait_for_edge:直接等待电信号达到某种条件(升高还是降低或者任意),并且可以设置超时时间。在超时时间内,函数会一直等待,直到期望的电信号改变出现,或者超时。

代码语言:javascript
复制
# wait for up to 5 seconds for a rising edge (timeout is in milliseconds)
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:    
  print('Timeout occurred')
else:    
  print('Edge detected on channel', channel)

(2)GPIO.add_event_detect:设置事件触发检测,一旦检测到,会返回True。

代码语言:javascript
复制
GPIO.add_event_detect(channel, GPIO.RISING)  
# add rising edge detection on a channel
do_something()
if GPIO.event_detected(channel):    
  print('Button pressed')

(3)GPIO.add_event_detect:回调函数机制。注册回调函数,一旦指定事件触发,回调函数会被调用。

代码语言:javascript
复制
def my_callback(channel):    
  print('This is a edge event callback function!')    
  print('Edge detected on channel %s'%channel)    
  print('This is run in a different thread to your main program')
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)  
# add rising edge detection on a channel

3. 利用声音检查模块控制Led灯

实现目标:当检测到声音时,改变Led 灯的状态。

3.1 代码


import RPi.GPIO as GPIO

import time

from time import sleep

SOUND_PIN_NUM = 20 #声音模块的输出引脚接的GPIO

LED_PIN_NUM = 26 #LED 的长脚接的GPIO

state = 0 #保存led 的状态

timeLast = time.time() #保存上次触发的时间

# in one sounding, the callback function will be invoked for a few times, so need wait for some time to

validDuration = 0.1

GPIO.setmode(GPIO.BCM)

GPIO.setup(SOUND_PIN_NUM, GPIO.IN)

GPIO.setup(LED_PIN_NUM, GPIO.OUT)

def callback_fun_soundOccurred(input_pint):

global timeLast

timeNow = time.time()

duration = timeNow - timeLast

if (duration < validDuration):

print("ignored because duration " + str(duration) + " is too short")

timeLast = timeNow

return

print("accepted for valid duration " + str(duration))

timeLast = timeNow

switchLed()

def switchLed():

global state

if (state):

turnOffLed()

state = 0

else:

turnOnLed()

state = 1

def turnOnLed():

print("Turn on")

GPIO.output(LED_PIN_NUM,GPIO.HIGH)

def turnOffLed():

print("Turn off")

GPIO.output(LED_PIN_NUM, GPIO.LOW)

GPIO.add_event_detect(SOUND_PIN_NUM, GPIO.RISING, callback=callback_fun_soundOccurred)

try:

while True:

sleep(0.1)

except KeyboardInterrupt:

GPIO.remove_event_detect(SOUND_PIN_NUM)

GPIO.cleanup()


3.2 两个小技巧

(1)尽管一个只需要一块五毛钱,但声音检测模块的灵敏度是可以调节的。使用螺丝刀转动上面的旋钮,边转变说话,看其开关指示灯的反应,亮表示检测到声音,亮度表示声音大小。旋到合适的位置即可。默认时,它非常灵敏,任何细小的声音都会触发它。

(2)在一句话说话过程中,回调函数会被触发好多次。因此,需要的话,如上面代码,可以计算两次调用之间的事件间隔,把太短的间隔过滤掉。下面是一句短话过程中函数被触发的情况:

代码语言:javascript
复制
ignored because duration 0.000501155853271 is too short
ignored because duration 0.000110864639282 is too short
ignored because duration 0.00215411186218 is too short
ignored because duration 0.000218868255615 is too short
ignored because duration 0.000470161437988 is too short
ignored because duration 0.000167846679688 is too short
ignored because duration 0.000583171844482 is too short
ignored because duration 0.000425815582275 is too short
ignored because duration 0.0010621547699 is too short
ignored because duration 0.000314950942993 is too short
ignored because duration 0.000555038452148 is too short
ignored because duration 0.000130891799927 is too short
ignored because duration 0.000461101531982 is too short
ignored because duration 0.00022292137146 is too short
ignored because duration 0.00274705886841 is too short
ignored because duration 0.000133037567139 is too short
ignored because duration 0.00597095489502 is too short
ignored because duration 0.000155925750732 is too short
ignored because duration 0.00107598304749 is too short
ignored because duration 0.000198125839233 is too short

参考链接:

  • https://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-2
  • https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 世民谈云计算 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 声音传感器及其配置
  • 2. GPIO Event 机制
  • 3. 利用声音检查模块控制Led灯
    • 3.1 代码
      • 3.2 两个小技巧
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档