超音波電路製作
超音波+點矩陣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);
}
}