跳转到内容

RTTTL 蜂鸣器

rtttl 组件允许您轻松地将无源压电蜂鸣器连接到微控制器并播放单音歌曲。它接受铃声文本传输语言(RTTTL)格式(维基百科),该格式可以存储简单的旋律。

蜂鸣器模块

重要的是您的蜂鸣器是无源的,如果您给它供电 3.3V 时它会发出蜂鸣声,那么它不是无源的,此库将无法正常工作。

音调发生器需要一个支持 PWM 的输出才能工作,目前仅支持 ESP8266 软件 PWM 输出ESP32 LEDC 输出

# 示例配置项
output:
- platform: ...
id: rtttl_out
...
rtttl:
output: rtttl_out
id: my_rtttl
gain: 60%

音调发生器也可以与扬声器一起使用来输出音频。

# 示例配置项
speaker:
- platform: ...
id: my_speaker
...
rtttl:
speaker: my_speaker
id: my_rtttl
gain: 0.8
  • output (互斥, ID): 用于此蜂鸣器的浮点输出的 ID。

  • speaker (互斥, ID): 用于播放歌曲的扬声器的 ID。

  • id (可选, ID): 手动指定用于代码生成的 ID。

  • gain (可选, 百分比): 使用此值可以设置音量。

  • on_finished_playback (可选, 自动化): 播放完成时要执行的动作。

NOTE

您只能使用 outputspeaker 变量,不能同时使用两者。

  • id (可选, ID): 如果您有多个组件,手动指定 RTTTL 的 ID。

播放 RTTTL 音调。

on_...:
then:
- rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

配置选项:

  • rtttl (必填, 字符串, 可模板化): RTTTL 字符串。

NOTE

如果当前正在播放旋律,您必须在开始新旋律之前调用 rtttl.stop 动作。

您可以在网上找到许多 RTTTL 字符串。您可以使用 RTTTL 在线播放器在将旋律添加到配置之前进行测试。有关详细信息,请参阅下面的格式说明。

停止播放。

on_...:
then:
- rtttl.stop

当播放处于活动状态时,此条件返回 true。

# 在某个触发器中:
on_...:
if:
condition:
rtttl.is_playing
then:
logger.log: '播放处于活动状态!'

RTTTL 字符串由三个部分组成,用冒号 (:) 分隔:

name:d=4,o=5,b=120:notes
  1. 名称: 旋律的简短标识符(最多 10 个字符)
  2. 控制参数: 包含 dob 参数的控制部分
  3. 音符: 编码为音符数据的实际旋律
  • d (时值): 默认音符时值。有效值为 1(全音符)、2(二分音符)、4(四分音符)、8(八分音符)、16(十六分音符)和 32(三十二分音符)。默认为 4。
  • o (八度): 音符的默认八度。有效值为 4、5、6 或 7。较高的值产生较高的音调。默认为 6。
  • b (节拍): 每分钟节拍数 (BPM) 的速度。决定旋律播放的速度。默认为 63。

旋律中的每个音符遵循此模式:[时值][音符][#][八度][.]

  • 时值 (可选): 覆盖默认时值 (1, 2, 4, 8, 16, 32)
  • 音符: 音符名称:cdefgabp 表示休止
  • # (可选): 升号修饰符,将音符升高半音
  • 八度 (可选): 覆盖默认八度 (4-7)
  • . (点) (可选): 附点音符,将时值延长 50%
  • 8e6 - 八分音符 E,八度 6
  • 4c#5 - 四分音符升 C,八度 5
  • 2g. - 附点二分音符 G,使用默认八度
  • 4c#5. - 附点四分音符升 C,八度 5
  • 16p - 十六分音符休止

提示:您可以尝试调整控制值来改变歌曲的听感。例如,增加 b 会使歌曲播放更快,而更改 o 会将音调升高或降低。

您也可以自己制作蜂鸣音模式!这里有一个简短的集合,您可以直接使用或根据喜好调整:

two_short:d=4,o=5,b=100:16e6,16e6
long:d=1,o=5,b=100:e6
siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e
scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b
star_wars:d=16,o=5,b=100:4e,4e,4e,8c,p,g,4e,8c,p,g,4e,4p,4b,4b,4b,8c6,p,g,4d#,8c,p,g,4e,8p
mission_imp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d
mario:d=4,o=5,b=100:16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6

使用以下代码,您可以快速设置一个节点,并在 Home Assistant 的开发者工具中使用服务。 例如,要调用 rtttl.play,选择服务 esphome.test_esp8266_rtttl_play,并在服务数据中输入

song_str: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
esphome:
name: test_esp8266
esp8266:
board: nodemcuv2
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
output:
- platform: esp8266_pwm
pin: GPIOXX
id: rtttl_out
rtttl:
output: rtttl_out
on_finished_playback:
- logger.log: '歌曲结束!'
api:
actions:
- action: rtttl_play
variables:
song_str: string
then:
- rtttl.play:
rtttl: !lambda 'return song_str;'