Arduino ile LCD Ekranlı Mesafe Ölçer(HC-SR04+LCD)

Bu yazımızda HC-SR04 ultrasonik mesafe sensörü ve 16×2 I2C LCD kullanarak Arduino İle Mesafe Ölçer projesi için program kodlayıp devre kurulumunu yapacağız. HC-SR04  ile ölçtüğümüz mesafe değerini LCD ekranda göstereceğiz.

    *Gerekli Malzemelerden Başlayalım.

Breadboard, Arduino, HC-SR04 , 16×2 I2C LCD konularında yeterince bilgi sahibi değilseniz, öncelikle o konularla ilgili yazılarımızı okumanızı tavsiye ederim.

Arduino ile LCD Ekranlı Mesafe Ölçer Devresi ve Programı

Öncelikle şunu belirtmeliyim. HC-SR04 ultrasonik mesafe sensörü en kolay bulunan ve en ucuz olan mesafe sensörü. Bu sensörün sağlıklı ölçüm aralığı 2 cm ile 200cm arasında ve ölçüm doğruluğu yaklaşık 3 mm civarındadır.

Şimdi öncelikle devremizi kuralım.

HC-SR04‘ün Vcc bacağını Arduino’nun 5V pinine,
HC-SR04‘ün Trig bacağını Arduino’nun 9 no’lu pinine,
HC-SR04‘ün Echo bacağını Arduino’nun 8 no’lu pinine,
HC-SR04‘ün GND bacağını Arduino’nun GND pinine takalım.

Sensördeki Trig(Trigger) ses dalgasını gönderir, Echo ise geri dönen dalgayı algılar.

Ultrasonik sensörün ve LCD’nin nasıl çalıştığını, mesafeyi nasıl ölçtüğünü öğrenmek istiyorsanız Ultrasonik Sensörler, LCD konumuzu mutlaka okuyun.

#include <LiquidCrystal_I2C.h>
#define echoPin 8
#define trigPin 9 
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
   lcd.init();
   lcd.backlight();
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);
}
void loop() {
   long sure, mesafe;
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(trigPin, LOW);
   sure = pulseIn(echoPin, HIGH);
   mesafe = (sure/2) / 29.1;
      if (mesafe >= 200 || mesafe <=2){ 
         lcd.setCursor(0,0);        
         lcd.print("Hata!");
      }
      else {
         lcd.setCursor(0,0);        
         lcd.print("Mesafe:");
         lcd.print(mesafe);
         lcd.print(" cm");
      }
   delay(500);
   lcd.clear();
}

PROGRAM ADIMLARI

ADIM 1:

Bu örnekte Arduino’nun 8. dijital pinini Echo(sesi dalgasını algılama), 9. dijital pinini Trig(ses dalgası gönderme) için seçtim.

Arduino Uno üzerinde SDA ve SCL isimli pinler bulunur. LCD için bu pinleri kullanacağız. İsterseniz SDA için A4 ve SCL için A5 pinini kullanabilirsiniz.

#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C.h kütüphanesi yüklenir.
#define echoPin 8//Echo ucunun bağlı olduğu 8 nolu pin "echoPin" olarak isimlendirildi.
#define trigPin 9 //Trig ucunun bağlı olduğu 9 nolu pin "trigPin" olarak isimlendirildi.
LiquidCrystal_I2C lcd(0x27,16,2);//lcd adında nesne oluşturulur.

#include komutu ile Arduino’ya ilgili kütüphane yüklenir. Yukarıda LiquidCrystal_I2C.h kütüphanesi yüklenmiştir.

#define trigPin 9 Burada yapılan işlem şu; Arduino’da HC-SR04’ün Trig bacağını bağlayacağımız pini trigPin olarak isimlendirmek. Böylece kodumuz daha anlaşılır olacak.
#define echoPin 8 Burada ise 8 numaralı pine echoPin ismini veriyorum. Bu işlemden sonra 9 numaralı pin artık trigPin isminde, 8 numaralı pin ise echoPin isminde kullanılacak.

LiquidCrystal_I2C lcd(0x27,16,2); komutu LCD’yi kontrol eden bir lcd adında nesne oluşturulur. Bu nesne aşağıdaki özelliklere sahip olarak tanımlanmıştır.

0x27 – I2C haberleşme adresi
16 – LCD’mizin karakter sayısı
2 – LCD’mizin satır sayısı
ADIM 2:

void setup() {
   lcd.init(); //lcd'yi çalıştır
   lcd.backlight();//lcd ışıklarını aç
   pinMode(trigPin, OUTPUT);//trigPin isimli pin çıkış sinyali üretecek
   pinMode(echoPin, INPUT);//echoPin isimli pin giriş sinyali alacak
}

void setup() Arduino çalışmaya başladığında ilk olarak bu fonksiyonunu okur ve ön ayarları yapar.

lcd.init(); komutu LCD’yi çalıştırır, LCD Arduino haberleşmesini başlatır.

lcd.backlight(); komutu LCD’nin led ışığını yani arka aydınlatmasını açar.

pinMode(trigPin, OUTPUT); komutu ile trigPin pinini OUTPUT(Sinyal çıkışı) olarak ayarladık. Çünkü trigPin (9 no’lu pin) çıkış sinyali üretecek, ses dalgası gönderecek.

pinMode(echoPin, INPUT); komutu ile echoPin pinini INPUT(Sinyal girişi) olarak ayarladık. Çünkü echoPin(8 no’lu pin) giriş sinyali dinleyecek, ses dalgasını algılayacak.

ADIM 3:

 void loop() {// içerisindeki komutları sürekli olarak tekrar eder.
  long sure, mesafe;//long türünde sure ve mesafe olmak üzere 2 değişken tanımla
  digitalWrite(trigPin, LOW);//trigPin pinini LOW(0) yap
  delayMicroseconds(2);// 2 mikrosaniye bekle
  digitalWrite(trigPin, HIGH);//trigPin pinini HIGH(1) yapıyor
  delayMicroseconds(10);// 10 mikrosaniye bekle
  digitalWrite(trigPin, LOW);//trigPin pinini LOW(0) yap
  sure = pulseIn(echoPin, HIGH);//ultrasonik sinyali dinler
  mesafe = (sure/2) / 29.1; //mesafeyi cm olarak hesapla

Loop() fonksiyonu Arduino çalıştığı sürece, içerisindeki komutları sürekli olarak tekrar eder.

long sure, mesafe; komutu ile long(büyük tam sayı) veri türünde sure ve mesafe olmak üzere 2 değişken tanımladık. Ses dalgasının gönderilmesi ve geri dönüşte okunması için geçen süre ile mesafeyi bulacağız. Bu nedenle bu değişkenlere ihtiyacımız olacak.

digitalWrite(trigPin, LOW); komutu trigPin pinini LOW(0) yapıyor, yani kapatıyor.

delayMicroseconds(2); komutu 2 mikrosaniye bekleme yaptırıyor.

digitalWrite(trigPin, HIGH); komutu trigPin pinini HIGH(1) yapıyor, yani ses dalgası ürettiriyor.

delayMicroseconds(10); komutu 10 mikrosaniye bekleme yaptırıyor.

digitalWrite(trigPin, LOW); komutu trigPin pinini tekrar LOW(0) yapıyor, yani kapatıyor.

Burada yapılmak istenen şey şu; trigPin 10 mikrosaniye boyunca ses dalgası üretiyor. Ardından 2 mikrosaniye kapanıyor. Sonra yine aynı işlemi sürekli olarak tekrarlıyor.

sure = pulseIn(echoPin, HIGH); komutu trigPin’in ürettiği ultrasonik sinyali dinler ve sesin gidiş dönüş süresini ölçer.

mesafe = (sure/2) / 29.1; komutu, ses hızı sabit olduğu için “ölçülen süreye göre mesafeyi hesaplar. Bu hesaplamanın nasıl yapıldığını ultrasonik sensörler yazımızdan öğrenebilirsiniz.

ADIM 4:

 if (mesafe >= 200 || mesafe <=2){ //ölçülen mesafe 200 cm'den büyük eşitse veya 2'den küçük
         lcd.setCursor(0,0);  //imlecin konumunu 0,0 noktasına yani ilk karaktere ayarlar  
         lcd.print("Hata!");  //LCD'ye "Hata!" yazısını yazar.
      }
      else {
         lcd.setCursor(0,0); //imlecin konumunu 0,0 noktasına yani ilk karaktere ayarlar       
         lcd.print("Mesafe:");//lcd'ye "Mesafe" yazısını yazar.
         lcd.print(mesafe);//lcd'ye mesafe değişkenindeki değeri yazar.
         lcd.print(" cm");//lcd'ye "cm" yazısını yazar.
      }
   delay(500);//500ms bekle
   lcd.clear();//lcd'yi temizle
}

if (mesafe >= 200 || mesafe <=2){ komutu ölçülen mesafe 200 cm’den büyük eşitse veya 2’den küçük eşitse lcd.setCursor(0,0); ve lcd.print(“Hata!”); komutları çalışacak.

  • lcd.setCursor(0,0); komutu imlecin konumunu ayarlar. Kullandığımız LCD’de 16 karakter ve 2 satır vardı. Yazmak istediğimiz metin, hangi satırda, hangi sıradaki karakterden başlayacak onu belirliyoruz. lcd.setCursor(karakter, satır) şeklinde kullanılır. 0 hem karakter için hem de satır için birinci anlamına gelir.
  • lcd.print(“Hata! “); komutu imlecin belirlendiği yerden itibaren LCD’ye “Hata!” yazısını yazar.

else { komutu if’deki şart sağlanmazsa çalışacaktır. Yani ölçüm HC-SR04’ün düzgün ölçebileceği aralıktaysa;

  • lcd.setCursor(0,0); komutu imlecin konumunu 0,0 noktasına yani ilk karaktere ayarlar.
  • lcd.print(“Mesafe:”); komutu ile LCD’ye “Mesafe:” yazısını yazar.
  • lcd.print(mesafe); komutu ise mesafe adlı değişkenin içindeki değeri LCD’ye yazar.
  • lcd.print(” cm”); komutu ise LCD’de mesafe değerinin sonrasına “cm” yazısını yazar.

ADIM 5:

   delay(500);
   lcd.clear();

delay(500); komutu ile 500ms bekleme yapılacak. Bu sayede her 500ms bir mesafe ölçümü yapılacak ve LCD’ye sonuçları yazdırılacak.

lcd.clear(); komutu LCD’deki tüm yazıları siler. Böylece her ölçümde ekranı temizleyip yeni değeri yazıdırıyoruz.

Reply