Arduino音乐键盘程序

程序功能

该程序实现了一个基于Arduino的8键音乐键盘:

  1. 使用8个按钮(连接引脚12,11,10,9,7,6,5,4)
  2. 每个按钮对应特定音调(中音C到高音C):
    NOTE_C4→NOTE_C5 \text{NOTE\_C4} \rightarrow \text{NOTE\_C5} NOTE_C4→NOTE_C5
  3. 按钮按下时,通过8号引脚连接的扬声器播放对应音符
  4. 按钮释放时停止发声
核心机制
  • 引脚配置 :按钮引脚启用内部上拉电阻(INPUT_PULLUP)

    c 复制代码
    pinMode(buttonPins[i], INPUT_PULLUP);
  • 音调映射 :按钮索引与音符频率对应

    c 复制代码
    buttonTones[] = {NOTE_C4, NOTE_D4, ... NOTE_C5};
  • 扫描检测 :循环检测按钮状态(LOW表示按下)

    c 复制代码
    if (digitalRead(buttonPins[i]) == LOW)
  • 声音控制 :使用tone()播放/noTone()停止

    c 复制代码
    tone(SPEAKER_PIN, pitch);  // 播放
    noTone(SPEAKER_PIN);       // 停止

制作教程(步骤详解)

所需材料
组件 数量 说明
Arduino开发板 1 Uno/Nano等
按钮开关 8 常开型
扬声器 1 8Ω 0.5W
面包板 1 用于电路连接
杜邦线 若干 公对公/公对母
电路连接
  1. 按钮连接

    • 每个按钮一脚接指定数字引脚(4,5,6,7,9,10,11,12)
    • 另一脚全部接地(GND)
    plaintext 复制代码
    [按钮]----[Arduino引脚]
       |        |
      GND     (代码定义)
  2. 扬声器连接

    • 正极 → 引脚8
    • 负极 → GND
    plaintext 复制代码
    [扬声器+]---[Pin8]
    [扬声器-]---[GND]
代码准备
  1. 创建pitches.h头文件(包含音符频率定义):
c 复制代码
#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978
  1. 主程序结构:
c 复制代码
#include "pitches.h"

#define SPEAKER_PIN 8

const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 };
const int buttonTones[] = {
  NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
  NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};
const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]);

void setup() {
  for (uint8_t i = 0; i < numTones; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  pinMode(SPEAKER_PIN, OUTPUT);
}

void loop() {
  int pitch = 0;
  for (uint8_t i = 0; i < numTones; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {
      pitch = buttonTones[i];
    }
  }
  if (pitch) {
    tone(SPEAKER_PIN, pitch);
  } else {
    noTone(SPEAKER_PIN);
  }
}
使用说明
  1. 上传程序到Arduino
  2. 按下不同按钮时:
    • 按钮1(引脚12) → 中音C(262Hz)
    • 按钮8(引脚4) → 高音C(523Hz)
  3. 同时按多个按钮时,优先级由扫描顺序决定(高索引按钮优先)

注意事项:确保扬声器功率不超过引脚负载能力(推荐使用外接放大器驱动大功率扬声器)

相关推荐
时空自由民.19 小时前
蓝牙协议栈介绍
linux·网络·单片机
蓝天居士19 小时前
M24C64芯片资料与程序代码(2)
嵌入式硬件·芯片资料
asjodnobfy21 小时前
开关电源尖峰电压计算
嵌入式硬件·硬件工程
振南的单片机世界1 天前
开漏输出:只能拉低,不能拉高,高电平靠“外部”帮忙
stm32·单片机·嵌入式硬件
FFF团团员9091 天前
CCS快速使用4(tim,pwm)
单片机·嵌入式硬件
某先森不吃鱼1 天前
工程日志——离轴编码器矫正与磁场串扰解决
嵌入式硬件
黑白园1 天前
STM32 通过I2C 读写EEPR0M AT24C02
stm32·单片机·嵌入式硬件
ACP广源盛139246256731 天前
ASW3742@ACP# 产品规格详解
网络·人工智能·嵌入式硬件·计算机外设·电脑
llilian_161 天前
晶体频率测试仪 破解晶振品控核心难题:晶体频率网络测试仪深度解析 晶体网络分析仪
网络·功能测试·单片机·嵌入式硬件·测试工具·51单片机
YJlio1 天前
《Windows Internals》10.5.1 ETW 概述:看懂 Windows 的“事件高速公路”
java·windows·笔记·stm32·嵌入式硬件·学习·eclipse