这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】+05过程贴:成功驱动蜂鸣器,实现八节

共1条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】+05过程贴:成功驱动蜂鸣器,实现八节音符

高工
2025-12-14 22:41:52     打赏
一:蜂鸣器介绍:这是最简单的一款声音生成模块,你可以通过高/低电平来驱动它。只需改变其发出嗡嗡声的频率,便能听到不同的声音。它被广泛应用于日常设备中,如个人电脑、冰箱、手机等。此外,你还能借助这款小巧而实用的模块来创建许多有趣且互动性强的项目。试试看吧!!你会发现创造电子声音非常有趣。二:实物连接图片如下所示:

05-1.png

三:软件代码如下所示:3.1 蜂鸣器的驱动函数如下所示:

buzzer = pwmio.PWMOut(board.A0, duty_cycle=0, frequency=440, variable_frequency=True)

def play_tone(frequency, duration):
    if frequency == 0:
        buzzer.duty_cycle = 0
    else:
        buzzer.frequency = frequency
        buzzer.duty_cycle = 32768
        time.sleep(duration)
        buzzer.duty_cycle = 0
        time.sleep(0.05)
3.2 音符的实现

# 音调频率表
yifu_f = [262, 360, 460, 569, 760, 860, 960,
        1060, 1160, 1260, 1360, 1460, 1560, 1660]

# -----------------------
# 八阶音符定义
# -----------------------
# 八阶音符频率 (C4-C5 八度)
# 低音到高音: C4, D4, E4, F4, G4, A4, B4, C5
# 对应的颜色映射: 红, 橙, 黄, 绿, 青, 蓝, 紫, 白
note_frequencies = [262, 294, 330, 349, 392, 440, 494, 523]  # 单位: Hz

# 音符时长定义
QUARTER_NOTE = 0.2  # 四分音符时长
EIGHTH_NOTE = 0.1   # 八分音符时长

def get_note_for_color(r, g, b):
    """根据RGB值确定要播放的音符和时长"""
    # 确定主色调
    max_val = max(r, g, b)
    if max_val == 0:
        return 0, QUARTER_NOTE  # 黑色,无声
    
    # 计算颜色比例
    r_ratio = r / max_val
    g_ratio = g / max_val
    b_ratio = b / max_val
    
    # 根据颜色确定音符
    if r_ratio > 0.8 and g_ratio < 0.3 and b_ratio < 0.3:  # 红色
        return note_frequencies[0], QUARTER_NOTE
    elif r_ratio > 0.8 and g_ratio > 0.5 and b_ratio < 0.3:  # 橙色/黄色
        return note_frequencies[1], QUARTER_NOTE
    elif r_ratio > 0.7 and g_ratio > 0.7 and b_ratio < 0.3:  # 黄色
        return note_frequencies[2], QUARTER_NOTE
    elif r_ratio < 0.3 and g_ratio > 0.8 and b_ratio < 0.3:  # 绿色
        return note_frequencies[3], QUARTER_NOTE
    elif r_ratio < 0.3 and g_ratio > 0.8 and b_ratio > 0.8:  # 青色
        return note_frequencies[4], QUARTER_NOTE
    elif r_ratio < 0.3 and g_ratio < 0.3 and b_ratio > 0.8:  # 蓝色
        return note_frequencies[5], QUARTER_NOTE
    elif r_ratio > 0.7 and g_ratio < 0.3 and b_ratio > 0.7:  # 紫色
        return note_frequencies[6], QUARTER_NOTE
    elif r_ratio > 0.7 and g_ratio > 0.7 and b_ratio > 0.7:  # 白色/灰色
        return note_frequencies[7], QUARTER_NOTE
    else:  # 其他颜色,根据亮度决定音符
        # 亮度值映射到音符
        brightness = (r + g + b) / 3
        note_index = int((brightness / 255) * 7)
        note_index = max(0, min(7, note_index))
        duration = QUARTER_NOTE if brightness > 127 else EIGHTH_NOTE
        return note_frequencies[note_index], duration

def play_melody(r, g, b):
    """播放八阶音符组成的旋律"""
    # 获取基本音符
    base_freq, base_duration = get_note_for_color(r, g, b)
    
    if base_freq == 0:  # 无声
        time.sleep(base_duration)
        return
    
    # 播放简单的旋律:主音符 + 上方三度 + 主音符
    # 计算三度音程
    third_freq = int(base_freq * 1.25)  # 大三度
    
    # 播放旋律
    play_tone(base_freq, base_duration)
    play_tone(third_freq, base_duration * 0.5)
    play_tone(base_freq, base_duration * 0.5)

至此,完成了diy的基本任务。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]