超音波電路製作

超音波+點矩陣LED電路製作

這是一份完整的超音波感測應用課程,共分成超音波測距電路、超音波電吉他電路、超音波+點矩陣LED電路三個單元,運用Arduino整合超音波感測器、喇叭、點矩陣LED,就可以製作一系列互動的電路了!

超音波數位量尺

// 超音波數位量尺

const byte trigPin = 7; // 超音波模組的觸發腳

const int echoPin = 6; // 超音波模組的接收腳

const int ledPin= 2; //LED腳位

unsigned long distance; // 儲存高脈衝的持續時間

unsigned long ping() {

digitalWrite(trigPin, HIGH); // 觸發腳設定成高電位

delayMicroseconds(5); // 持續 5 微秒

digitalWrite(trigPin, LOW); // 觸發腳設定成低電位

return pulseIn(echoPin, HIGH); // 傳回高脈衝的持續時間

}

void setup() {

pinMode(trigPin, OUTPUT); // 觸發腳設定成「輸出」

pinMode(echoPin, INPUT); // 接收腳設定成「輸入」

pinMode(ledPin,OUTPUT); // LED腳位設定成「輸出」

Serial.begin(9600); // 初始化序列埠

}

void loop(){

distance = ping() / 58; // 把高脈衝時間值換算成公分單位

Serial.print(distance); // 顯示距離

Serial.print("cm");

Serial.println();

if(distance<80 && distance!=0 ){ // 如果太近就顯示LED 燈

digitalWrite(ledPin, HIGH);

}

else{

digitalWrite(ledPin, LOW);

}

delay(1000); // 等待一秒鐘(每隔一秒測量一次)

}

超音波電吉他

//超音波電吉他

const byte trigPin = 7; // 超音波模組的觸發腳

const int echoPin = 6; // 超音波模組的接收腳

const int ledPin=2; //LED腳位

const int musicPin = 3; // 喇叭腳位

unsigned long distance; // 儲存高脈衝的持續時間

unsigned long ping() {

digitalWrite(trigPin, HIGH); // 觸發腳設定成高電位

delayMicroseconds(5); // 持續 5 微秒

digitalWrite(trigPin, LOW); // 觸發腳設定成低電位

return pulseIn(echoPin, HIGH); // 傳回高脈衝的持續時間

}

void setup() {

pinMode(trigPin, OUTPUT); // 觸發腳設定成「輸出」

pinMode(echoPin, INPUT); // 接收腳設定成「輸入」

pinMode(ledPin,OUTPUT); // LED腳位設定成「輸出」

pinMode(musicPin,OUTPUT); //喇叭腳位設定成「輸出」

Serial.begin(9600); // 初始化序列埠

}

void loop(){

distance = ping() / 58; // 把高脈衝時間值換算成公分單位

Serial.print(distance); // 顯示距離

Serial.print("cm");

Serial.println();

if(distance<80 and distance!=0 ){ // 如果太近就顯示LED 燈

digitalWrite(ledPin, HIGH);

tone(musicPin, map ( distance, 0 , 50 ,523 , 1048 ) ); // 對照距離發音

}

else{

digitalWrite(ledPin, LOW);

noTone(musicPin);

}

delay(1000); // 等待一秒鐘(每隔一秒測量一次)

}

點矩陣LED

//陣列led設定

#include <SPI.h> // 引用 SPI 程式庫

byte bigheart[8] = {

0x1C, 0x3E, 0x7E, 0xFC, 0xFC, 0x7E,

0x3E, 0x1C};

byte smallheart[8] = {

0x00, 0x0C, 0x1C,0x38, 0x38, 0x1C, 0x0C,

0x00};

// 定義 MAX7219 暫存器

const byte NOOP = 0x0; // 不運作

const byte DECODEMODE = 0x9; // 解碼模式

const byte INTENSITY = 0xA; // 顯示強度

const byte SCANLIMIT = 0xB; // 掃描限制

const byte SHUTDOWN = 0xC; // 停機

const byte DISPLAYTEST = 0xF; // 顯示器檢測

// 設定 MAX7219 暫存器資料的自訂函數

void max7219(byte reg, byte data) {

digitalWrite (SS, LOW);

SPI.transfer (reg);

SPI.transfer (data);

digitalWrite (SS, HIGH);

}

// 超音波感測器設定

const byte trigPin = 7; // 超音波模組的觸發腳

const int ledPin=2;

const int echoPin = 6; // 超音波模組的接收腳

unsigned long delayTime;

unsigned long distance; // 儲存高脈衝的持續時間

unsigned long ping() {

digitalWrite(trigPin, HIGH); // 觸發腳設定成高電位

delayMicroseconds(5); // 持續 5 微秒

digitalWrite(trigPin, LOW); // 觸發腳設定成低電位

return pulseIn(echoPin, HIGH); // 傳回高脈衝的持續時間

}

void setup() {

pinMode(SS, OUTPUT); // 將預設的 SS 腳(數位 10)設成「輸出」

digitalWrite(SS, HIGH); // 先在 SS 腳輸出高電位

//(代表「尚不選取周邊」)

SPI.begin (); // 啟動 SPI 連線

max7219 (SCANLIMIT, 7); // 設定掃描 8 行

max7219 (DECODEMODE, 0); // 不使用 BCD 解碼

max7219 (INTENSITY, 8); // 設定成中等亮度

max7219 (DISPLAYTEST, 0);// 關閉顯示器測試

max7219 (SHUTDOWN, 1); // 關閉停機模式(亦即,「開機」)

// 清除顯示畫面(LED 矩陣中的八行都設定成 0)

for (byte i=0; i < 8; i++) {

max7219 (i + 1, 0);

}

pinMode(trigPin, OUTPUT); // 觸發腳設定成「輸出」

pinMode(echoPin, INPUT); // 接收腳設定成「輸入」

pinMode(ledPin,OUTPUT); // LED腳位設成「輸出」

Serial.begin(9600); // 初始化序列埠

}

void loop(){

distance = ping() / 58; // 把高脈衝時間值換算成公分單位

Serial.print(distance); // 顯示距離

Serial.print("cm");

Serial.println();

if(distance>50 || distance==0){ // 無法測距時顯示正常心跳

digitalWrite(ledPin,LOW); // 感測指示LED滅

for (byte i=0; i<8; i++) {

max7219 (i + 1, bigheart[i]); // 大心跳圖形顯示

}

delay(200);

for (byte i=0; i<8; i++) {

max7219 (i + 1, smallheart[i]); //小心跳圖形顯示

}

delay(800);

for (byte i=0; i < 8; i++) {

max7219 (i + 1, 0); //無圖形顯示

}

delay(500);

}

else{

digitalWrite(ledPin,HIGH); // 感測指示LED亮

delayTime= map ( distance, 0 , 40 , 20 , 600);

for (byte i=0; i<8; i++) {

max7219 (i + 1, bigheart[i]); //大心跳圖形顯示

}

delay(delayTime);

for (byte i=0; i<8; i++) {

max7219 (i + 1, smallheart[i]); //小心跳圖形顯示

}

delay(delayTime);

for (byte i=0; i < 8; i++) {

max7219 (i + 1, 0); //無圖形顯示

}

delay(delayTime);

}

}