1. 文档中心
  2. 比卜创造 Micro:bit
  3. API 参考
  4. 麦克风

麦克风

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)