/**
* Arduino迷你钢琴 / Mini-Klavier für Arduino
*
* 使用说明 / Bedienungsanleitung:
* 1. 仿真运行时点击示意图获取焦点 / Klicken Sie nach dem Start der Simulation auf das Schema, um es zu fokussieren
* 2. 使用键盘数字键1-8演奏音符(1对应最低音,8对应最高音) /
* Verwenden Sie die Tasten 1-8 auf Ihrer Tastatur, um die Noten zu spielen (1 = tiefste Note, 8 = höchste Note)
*
* 版权所有 (C) 2021, Uri Shaked。根据MIT许可证发布。 /
* Copyright (C) 2021, Uri Shaked. Veröffentlicht unter der MIT-Lizenz.
* 代码优化:中文注释添加,代码结构优化 /
* Code-Optimierung: Hinzufügen von chinesischen und deutschen Kommentaren, Code-Strukturverbesserung
*/
#include "pitches.h" // 包含音符频率定义头文件 / Header-Datei für Notenfrequenzen einbinden
#define SPEAKER_PIN 8 // 定义扬声器连接引脚 / Definition des Speaker-Pins
// 按钮引脚数组(从低音到高音排列) /
// Button-Pin-Array (von tief nach hoch geordnet)
const uint8_t buttonPins[] = {12, 11, 10, 9, 7, 6, 5, 4};
// 对应按钮的音符频率数组(C大调音阶) /
// Notenfrequenz-Array für entsprechende Buttons (C-Dur-Tonleiter)
const int buttonTones[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, // 中音组C-F / Mitteltöne C-F
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 // 中音组G-B + 高音C / Mitteltöne G-B + Hohes C
};
const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]); // 计算按钮/音符数量 /
// Berechnung der Anzahl von Buttons/Noten
void setup() {
// 初始化所有按钮引脚为输入模式,启用内部上拉电阻 /
// Initialisiert alle Button-Pins als Eingänge mit internen Pull-Up-Widerständen
for (uint8_t i = 0; i < numTones; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
// 初始化扬声器引脚为输出模式 / Initialisiert den Speaker-Pin als Ausgang
pinMode(SPEAKER_PIN, OUTPUT);
}
void loop() {
int currentPitch = 0; // 存储当前应播放的音高 / Speichert die aktuell zu spielende Tonhöhe
// 检测哪个按钮被按下(低电平表示按下) /
// Erkennt, welcher Button gedrückt wird (LOW = gedrückt)
for (uint8_t i = 0; i < numTones; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
currentPitch = buttonTones[i]; // 获取对应音符频率 / Holt die entsprechende Notenfrequenz
break; // 检测到按键后立即退出循环(支持单键演奏) /
// Beendet die Schleife sofort nach Button-Erkennung (Unterstützt Einzelton-Wiedergabe)
}
}
// 根据检测结果播放或停止声音 /
// Spielt den Ton ab oder stoppt die Wiedergabe basierend auf der Erkennung
if (currentPitch) {
tone(SPEAKER_PIN, currentPitch); // 播放指定频率的声音 / Spielt den Ton mit der angegebenen Frequenz ab
} else {
noTone(SPEAKER_PIN); // 停止播放声音 / Stoppt die Tonwiedergabe
}
// 添加短暂延迟减少按键抖动影响(可选) /
// Fügt eine kurze Verzögerung hinzu, um Tastenprellen zu reduzieren (optional)
// delay(50);
}