// 超音波腳位定義
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); // 小延遲避免過度刷新
}
留言
張貼留言