體感樂器程式碼20251209

 // 超音波腳位定義

const int trigPin = 7;   // 超音波感測器 Trig 腳位

const int echoPin = 6;   // 超音波感測器 Echo 腳位


// 蜂鳴器腳位定義

const int buzzerPin = 13; // 蜂鳴器接腳位


// 定義 8 個音階 (C 大調)

int notes[8] = {

  262, // C4 (Do)

  294, // D4 (Re)

  330, // E4 (Mi)

  349, // F4 (Fa)

  392, // G4 (So)

  440, // A4 (La)

  494, // B4 (Ti)

  523  // C5 (Do)

};


// 取得距離(單位:公分)

long getDistance() {

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);


  long duration = pulseIn(echoPin, HIGH, 30000UL); // 加入逾時避免卡住

  if (duration == 0) return -1; // 逾時視為無效


  long distance = duration * 0.034 / 2; // 聲速換算

  return distance;

}


void setup() {

  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

  pinMode(buzzerPin, OUTPUT);

  Serial.begin(9600); // 顯示距離用

}


void loop() {

  long distance = getDistance();


  Serial.print("Distance: ");

  Serial.print(distance);

  Serial.println(" cm");


  if (distance <= 0 || distance > 80) {

    // 超過範圍或無效值 → 靜音

    noTone(buzzerPin);

  } else {

    // 每 10 公分對應一個音階

    int index = (distance - 1) / 10; // 0~7

    if (index < 0) index = 0;

    if (index > 7) index = 7;


    tone(buzzerPin, notes[index]); // 播放對應音階

  }


  delay(100); // 小延遲避免過度刷新

}

留言