超音波測距器(身高量測器)
本專題主要利用超音波模組設計一個簡單的距離量測器,您也可以把它當成數位身高量尺,量測最大有效距離為400cm左右,設計最大不同的巧思在小型化及實用性.
功能:
- LCD 8×2顯示幕
- 量測最大有效距離為400cm
- 搭配獨家3D外觀件,使專題具有極佳的實用性
主要軟硬體架構以arduino 控制板為核心,基本原理,還有該下載的庫函數可參考 旗標出版社 趙英傑所著的 超圖解arduino互動設計入門一書 相關單元.
我個人喜歡將專題以手工焊接方式作成完整成品或半成品,有兩個主要想法—1.可以減少電路干擾或誤動作機率(因為插線方式容易有接觸不良問題,若線路太長也容易引起不必要之信號干擾), —2.方便收藏 ,也可以成為求學或求職的加分利器.當然透過實作的過程,也可以累積別人帶不走的經驗值.
超音波感測的應用相當廣泛,相關的學理,我不在這裡探究,本文主要描述專題功能及製作的大致過程.
線路圖
專題大致的零件,因實際功能會有增減.
習慣上先做主要零件空間配置定位
焊接固定
再追加其他零件
大電流(正負電源),小電流(I/O信號….)使用不同粗細方式佈線.
焊接完成
下載Arduino程式至目標板
//———————————-
// 超音波 測距器(身高量尺)(lcd dispaly)
// www.mykit.tw/wordpress/
// jacky 2020/03/14
//———————————-
// 程式庫
#include <LiquidCrystal.h>
const byte speakPin = 13; // buzzer
const byte trigPin = 10; // 超音波模組的觸發腳
const int echoPin = 9; // 超音波模組的接收腳
unsigned long d; // 儲存高脈衝的持續時間
LiquidCrystal lcd(11, 12, 6, 5, 4, 3);
unsigned int BcdValue3,BcdValue2,BcdValue1,BcdValue0;
void setup () {
// Serial.begin(9600); //測量結果將通過此串口輸出至PC上的串口監視器
pinMode(speakPin, OUTPUT); // 觸發腳設定成「輸出」
pinMode(trigPin, OUTPUT); // 觸發腳設定成「輸出」
pinMode(echoPin, INPUT); // 接收腳設定成「輸入」
digitalWrite(speakPin, LOW); // 輸出 低電位
lcd.begin(16, 2); // 初始化 LCD
lcd.clear();
//lcd.backlight();
lcd.setCursor(0, 0); //( 第0行 , 第0字)
lcd.print(“Distance”);
lcd.setCursor(0, 1); //( 第1行 , 第0字)
lcd.print(” Ver1.1 “);
delay(1000); //
lcd.setCursor(0, 1);
lcd.print(“D= cm”);
}
void loop () {
d = ping() / 58; // 把高脈衝時間值換算成公分單位
HexToBcd(d); //16進制轉10進制
lcd.setCursor(3, 1);
lcd.write(BcdValue2+0x30); //百位
lcd.write(BcdValue1+0x30); //十位
lcd.write(BcdValue0+0x30); //個位
//——-serial monitor—————————
// Serial.print(d); // 顯示距離
// Serial.print(“cm”);
// Serial.println();
//————————————————
delay(200); // 等待0.2秒鐘(每隔0.2秒測量一次)
}
//===============================================
// 超音波發射並傳回高脈衝的持續時間
//===============================================
unsigned long ping() {
digitalWrite(trigPin, HIGH); // 觸發腳設定成高電位
delayMicroseconds(5); // 持續 5 微秒
digitalWrite(trigPin, LOW); // 觸發腳設定成低電位
return pulseIn(echoPin, HIGH); // 傳回高脈衝的持續時間
}
//===============================================
// HEX TO BCD
// BCD RANG 0~9999
//===============================================
void HexToBcd(unsigned int hexdata1){
BcdValue3=hexdata1/1000;
BcdValue2=(hexdata1-=BcdValue3*1000)/100;
BcdValue1=(hexdata1-=BcdValue2*100)/10;
BcdValue0=(hexdata1-=BcdValue1*10);
}
若焊接確,LCD幕將如下圖顯示(若無正確顯示,可調整藍色可變電阻看看)