STM32F103 Distance Measuring Device Ultra Sonic HC-SR04
/ 09:49
Introducing
Saat
ini banyak sekali perangkat alat ukur yang menggunakan sistem digital, karena
alat ukur digital ini memiliki kinerja yang lebih presisi dengan tingkat
keakuratan sampai 99%. Maka banyak orang beralih dari alat ukur konvensional ke
alat ukur digital, contoh saja penggunaan alat ukur jarak atau disebut dengan
meteran kini berubah mejadi alat ukur meteran digital yang pengoperasiannya
tentu saja lebih mudah, cukup dengan meletakan alat ukur ke suatu objek, maka
dengan waktu yang singkat kita sudah dapat mengetahui jarak yang diukur, cukup
mudah bukan?
Pada
proyek pengembangan selanjutnya saya mencoba menggunakan sensor ultra sonic
HC-SR04 sebagai alat pendeteksi jarak, cara kerja sensor ini yaitu dengan
mengirimkan sinyal ping pada frekuensi 40 KHz, kemudian sinyal ping ini akan
dipantulkan oleh benda yang menjadi objek ukur dan kembali lagi ke sensor ultra
sonic dengan membaca selisih waktu perbedaan antara sinyal ping yang dikirim
dengan sinyal pantulan (echo) yang diterima, semakin lambat sinyal pantulan yang
diterima maka objek yang diukur semakin jauh.
Sensor
ini memiliki 4 pin yaitu VCC 5 Volt, GND, Trigger, Dan Echo dengan arus yang
cukup rendah, anda dapat membaca spesifikasinya di https://www.electroschematics.com/8902/hc-sr04-datasheet/. Objek apa saja yang
dapat diukur oleh sensor ini? Objeknya sudah pasti benda yang memiliki
permukaan rata agar dapat memantulkan sinyal dengan baik, misalnya tembok,
kardus, kaca, permukaan air, dll.
Untuk
melihat hasil pengukurannya, saya masih menggunakan penampil 4 digit seven
segment yang pernah di posting sebelumnya.
Bill Of Material
Bahan-bahan yang diperlukan
dalam pengembangan proyek ini adalah:
- Board STM32F103C Blue Pill
- 4 Digit Seven Segment HS220561K Common Cathode
- Bread Board 400 dot point
- Ultra Sonic Ranger HC-SR04
- Dan beberapa kabel Jumper Female to Male, dan Male to Male
Wiring
Pin Conection Table
Seven
Segment
|
STM32
|
A
|
PA11
|
B
|
PA12
|
C
|
PB11
|
D
|
PB10
|
E
|
PB1
|
F
|
PB15
|
G
|
PB0
|
DP
|
PA7
|
COM1
|
PB15
|
COM2
|
PB14
|
COM3
|
PB13
|
COM4
|
PB12
|
VCC
|
5V
|
GND
|
G
|
Trigger
|
PA6
|
Echo
|
PA5
|
Program
#define
trigPin PA6
#define
echoPin PA5
#define
dig1 PB15
#define
dig2 PB14
#define
dig3 PB13
#define
dig4 PB12
#define
segA PA11 //SEG A
#define
segB PA12 //SEG B
#define
segC PB11 //SEG C
#define
segD PB10 //SEG D
#define
segE PB1 //SEG E
#define
segF PA15 //SEG F
#define
segG PB0 //SEG G
#define
segP PA7 //SEG DP
int
sevSeg1;
int
sevSeg2;
int
sevSeg3;
int
sevSeg4;
boolean
commonHigh = false;
int
number;
int
dig[16] = {
0b1111110, //0
0b0110000, //1
0b1101101, //2
0b1111001, //3
0b0110011, //4
0b1011011, //5
0b1011111, //6
0b1110000, //7
0b1111111, //8
0b1111011, //9
0b1110111, //a
0b0011111, //b
0b1001110, //c
0b0111101, //d
0b1001111, //e
0b0000000, //f
};
void
setup() {
// put your setup code here, to run once:
pinMode(dig1,OUTPUT);
pinMode(dig2,OUTPUT);
pinMode(dig3,OUTPUT);
pinMode(dig4,OUTPUT);
pinMode(segA,OUTPUT);
pinMode(segB,OUTPUT);
pinMode(segC,OUTPUT);
pinMode(segD,OUTPUT);
pinMode(segE,OUTPUT);
pinMode(segF,OUTPUT);
pinMode(segG,OUTPUT);
pinMode(echoPin,
INPUT);
pinMode(trigPin,
OUTPUT);
}
void
loop() {
int
temp;
int
val = readHC_SR04();
temp
= val;
//
Write data to seven segment
sevSeg4
= temp % 10;
temp/=
10;
sevSeg3
= temp % 10;
temp/=
10;
sevSeg2
= temp % 10;
temp/=
10;
sevSeg1
= temp % 10;
temp/=
10;
//
view display
viewDisp(sevSeg1,sevSeg2,sevSeg3,sevSeg4);
}
void
writeDigitToDisplay(int digit) {
int
currentBit;
int
bitOn;
//-----------------------------------
currentBit = (1<<(6));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn
= !bitOn;
}
digitalWrite(segA, bitOn);
//-----------------------------------
currentBit = (1<<(5));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segB, bitOn);
//-----------------------------------
currentBit = (1<<(4));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segC, bitOn);
//-----------------------------------
currentBit = (1<<(3));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segD, bitOn);
//-----------------------------------
currentBit = (1<<(2));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segE, bitOn);
//-----------------------------------
currentBit = (1<<(1));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segF, bitOn);
currentBit = (1<<(0));
bitOn = (currentBit & dig[digit])!=0;
if(commonHigh) {
bitOn = !bitOn;
}
digitalWrite(segG, bitOn);
}
void
viewDisp(int digit1,int digit2,int digit3,int digit4){
//diplay 1 active
digitalWrite(dig1,LOW);
writeDigitToDisplay(digit1);
delay(3);
digitalWrite(dig1,HIGH);
//diplay 2 active
digitalWrite(dig2,LOW);
writeDigitToDisplay(digit2);
delay(3);
digitalWrite(dig2,HIGH);
//diplay 3 active
digitalWrite(dig3,LOW);
writeDigitToDisplay(digit3);
delay(3);
digitalWrite(dig3,HIGH);
//diplay 4 active
digitalWrite(dig4,LOW);
writeDigitToDisplay(digit4);
delay(3);
digitalWrite(dig4,HIGH);
}
//
function read distance from HC-SR04
int
readHC_SR04(){
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Get echo SRF04
int distance=pulseIn(echoPin, HIGH);
// Distance calibration to centimeter
distance = distance / 58;
return distance;
}
Test & Result
Hasil
pengukuran yang pertama saya meletakan kardus kemasan tinta pada jarak 20cm,
terlihat jelas oleh penggaris yang saya pakai pada titik 20cm. Ini menandakan
bahwa hasil pengukuran sangat akurat menunjukan hasil 20cm karena sesuai antara
jarak yang diukur dengan kalibarsi pada penggaris.
Test
yang kedua, saya menjauhkan jarak ukur sekitar 5cm dari jarak pengukuran yang
pertama, ternyata hasil pengukuran alat menunjukan jarak 25cm, yang sesuai
dengan jarak ukur yang ada pada penggaris.
Comments 0
EmoticonEmoticon