#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define BUZZER_PIN 9
#define LED_PIN 13
// 按鈕腳位
const int buttonPins[] = {2, 3, 4, 5, 6, 7, 8, 10};
// 按鈕對應的音符頻率,單位為 Hz
const int button_notes[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 對應的音符名稱
const char *note_names[] = {"DO", "RE", "MI", "FA", "SO", "LA", "SI", "DO"};
void setup() {
// 初始化 SSD1306 小螢幕
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000); // 等待螢幕初始化完成
// 初始化數位腳位
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// 設置按鈕腳位為輸入並啟用內部上拉電阻
for (int i = 0; i < 8; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
// 清除螢幕
display.clearDisplay();
// 顯示在 SSD1306 上
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Press a button:");
// 檢查每個按鈕是否被按下
for (int i = 0; i < 8; i++) {
if (digitalRead(buttonPins[i]) == LOW) { // 如果按鈕按下
// 顯示按下的音符名稱
display.setTextSize(2);
display.setCursor(10, 20);
display.println(note_names[i]);
// 點亮對應的 LED 燈
digitalWrite(LED_PIN, HIGH);
// 播放對應的音符
int noteDuration = 500; // 每個音符持續時間 500 毫秒
tone(BUZZER_PIN, button_notes[i], noteDuration);
// 等待按鈕放開
while (digitalRead(buttonPins[i]) == LOW) {
delay(10); // 等待按鈕釋放
}
// 停止播放音符
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, LOW); // 熄滅 LED 燈
}
}
// 顯示在 SSD1306 上
display.display();
// 稍作延遲
delay(50);
}