麦克风
bibo.microphone 模块用于访问 micro:bit 板载麦克风,可用来响应声音。麦克风输入位于主板正面,旁边有麦克风活动指示灯,麦克风工作时该灯会亮起。

声音事件
麦克风可响应一组预定义的声音事件,这些事件基于声音的振幅与波长。
声音事件由 SoundEvent 类的实例表示,可通过 bibo.SoundEvent 中的变量访问:
bibo.SoundEvent.QUIET:表示从「响」到「静」的声音过渡,例如说话或背景音乐。bibo.SoundEvent.LOUD:表示从「静」到「响」的声音过渡,例如拍手或喊叫。
函数
current_event()
获取最近一次记录的声音事件。
返回值: 事件对象,SoundEvent('loud') 或 SoundEvent('quiet')。
was_event(event)
检查自上次调用以来是否至少听到过一次指定声音。
此调用在返回前会清空声音历史记录。
参数:
event:要检查的事件,例如SoundEvent.LOUD或SoundEvent.QUIET。
返回值: 若自上次调用以来至少听到过一次,返回 True,否则返回 False。
is_event(event)
检查最近检测到的声音事件。
此调用不会清空声音事件历史记录。
参数:
event:要检查的事件,例如SoundEvent.LOUD或SoundEvent.QUIET。
返回值: 若最近听到的是该事件,返回 True,否则返回 False。
get_events()
以元组形式获取声音事件历史记录。
此调用在返回前会清空声音历史记录。
返回值: 事件历史元组,最近的事件在最后。
set_threshold(event, value)
设置声音事件的阈值。
当声音电平向上越过该阈值(从「静」到「响」)时,将触发 SoundEvent.LOUD 事件;向下越过时(从「响」到「静」)触发 SoundEvent.QUIET 事件。
若设置的 SoundEvent.LOUD 值低于 SoundEvent.QUIET,则「静」阈值会被降至「响」阈值以下一个单位。若 SoundEvent.QUIET 值高于 SoundEvent.LOUD,则「响」阈值会被设为高出一个单位。
参数:
event:声音事件,例如SoundEvent.LOUD或SoundEvent.QUIET。value:阈值级别,范围 0–255。超出范围的值会被截断。
sound_level()
获取声压级。
返回值: 声压级的数值表示,范围 0–255。
示例
以下示例演示麦克风 API 的部分功能:
# 麦克风基础测试。按下按钮 A 时,若当前听到响或静的声音,应更新显示屏并打印结果。
# 按下按钮 B 时,若曾听到响或静的声音,应更新显示屏并打印结果。
# 摇晃时打印最近听到的声音——请在摇晃前先制造一次响声和一次轻声。
from bibo import *
display.clear()
sound = microphone.current_event()
while True:
if button_a.is_pressed():
if microphone.current_event() == SoundEvent.LOUD:
display.show(Image.SQUARE)
uart.write('isLoud\n')
elif microphone.current_event() == SoundEvent.QUIET:
display.show(Image.SQUARE_SMALL)
uart.write('isQuiet\n')
sleep(500)
display.clear()
if button_b.is_pressed():
if microphone.was_event(SoundEvent.LOUD):
display.show(Image.SQUARE)
uart.write('wasLoud\n')
elif microphone.was_event(SoundEvent.QUIET):
display.show(Image.SQUARE_SMALL)
uart.write('wasQuiet\n')
else:
display.clear()
sleep(500)
display.clear()
if accelerometer.was_gesture('shake'):
sounds = microphone.get_events()
soundLevel = microphone.sound_level()
print(soundLevel)
for sound in sounds:
if sound == SoundEvent.LOUD:
display.show(Image.SQUARE)
elif sound == SoundEvent.QUIET:
display.show(Image.SQUARE_SMALL)
else:
display.clear()
print(sound)
sleep(500)