[演練功能]
利用 HC-SR04R模組測量物體距離,並將量測得知的距離數據顯示於LCD模組中;當超出量測範圍 2cm< 或 >300cm 時,LCD 顯示 Out of Range!! 並亮起警示的紅色 LED。
[模組材料]
• Arduino Uno x 1
• Uno 擴張板 x 1
• HC-SR04R超音波測距模組 x1
• LCD模組1602A x1
• I2C匯流排 x1(簡化LCD模組控制線路)
• 紅色LED x1(作為超過量測範圍警示燈)
• 杜邦連接線 x 10條
超音波測距模組一般都是用HC-SR04,小誌這次使用HC-SR04P。
1.最低工作電壓3V,與3.3V供電的MCU可以直接連接。
2.探測距離5V時:2cm~450cm
3. 探測距離3.3V時:2cm~400cm
4.探測角度:小於15度
5.工作溫度:-20度C~+80度C
HC-SR04R 超音波模組
|
Arduino 腳位對應
|
1
- VCC
|
VCC
|
2
- Trig –
Trigger
|
DPin X S
|
3
- Echo
|
DPin X S
|
4
- GND
|
GND
|
[[LCD模組]]
- 此次實驗的顯示模組採用1602A,此款LCD模組是最基本、常見的字元型LCD,使用的電壓為5V,2行顯示,每行可顯示16個字元。
- 為了簡化顯示模組配線,另配合I2C匯流排來通訊傳輸,因此最終的LCD顯示模組只有四隻接腳,分別為Vcc、GND、SDA、SCL。
- I2C匯流排能夠讓兩個裝置之間以穩定、高速、雙向的方式只使用兩條線來進行通訊,一條時脈線(SCL)和一條數據線(SDA),所以I2C匯流排所使用的通訊協定也被稱之為「雙線」通訊協定。
LCD接腳
|
功能
|
1 (VSS)
|
電源負極
|
2 (VCC)
|
電源正極
|
3 (Vo)
|
調整對比
|
4 (RS)
|
D0~D7放入資料暫存器 (1) 或指令資料暫存器 (0)
|
5 (RW)
|
讀取 (1) 或寫入 (0) LCD
|
6 (E)
|
可寫入 (1) 或不可寫入 (0) LCD
|
7 (D0)
|
資料位元 0
|
8 (D1)
|
資料位元 1
|
9 (D2)
|
資料位元 2
|
10 (D3)
|
資料位元 3
|
11 (D4)
|
資料位元 4
|
12 (D5)
|
資料位元 5
|
13 (D6)
|
資料位元 6
|
14 (D7)
|
資料位元 7
|
15 (A+)
|
背光電源正極
|
16 (-K)
|
背光電源負極
|
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// 設定 LCD I2C 位址
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
long duration;
int intCM;
const byte trigPin=10;
const int echoPin=11;
const int LED=3;
void setup() {
// 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
lcd.begin(16, 2);
//接腳IO定義
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
// 輸出啟動訊息
lcd.setCursor(0, 0); // 設定游標位置在第一行行首
lcd.print("SYSTEM START!!");
delay(3000);
lcd.clear(); //顯示清除
}
//測距計算
void GeneratedReturnCM()
{
//digitalWrite(trigPin, LOW);
//delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(20);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
duration = duration / 59;
if ((duration < 2) || (duration > 300)) {
digitalWrite(LED, LOW); //超出量測範圍亮燈
intCM = 0;
}else {
digitalWrite(LED, HIGH);
intCM = duration; //正常量測範圍熄燈
}
}
void loop() {
//LCD訊息輸出
lcd.clear(); //顯示清除
lcd.setCursor(0, 0); // 設定游標位置在第一行行首
lcd.print("Object Detection");
lcd.setCursor(0, 1); // 設定游標位置在第二行行首
GeneratedReturnCM(); //呼叫測距計算
//輸出超音波量測距離
if (intCM!=0){
lcd.print("Distance:");
lcd.print(intCM);
lcd.print("cm");
}else{
lcd.print("Out of Range!!");
}
//0.5秒後重複量測
delay(500);
}




