#116Orta

ESP32 HC-SR04 Ultrasonik Mesafe Ölçer

HC-SR04 ultrasonik sensör, gönderdiği ses dalgasının nesneye çarpıp geri dönme süresini (Time of Flight) ölçerek mesafe hesaplar. Bu projede ESP32 ile TRIG pinine 10 mikrosaniyelik darbe gönderip, ECHO pininden gelen yankı süresini `pulseIn()` ile okuyacağız. Hesaplanan mesafeyi cm cinsinden 16x2 I2C LCD'de göstereceğiz. HC-SR04 5V çalıştığı için ECHO pinine **gerilim bölücü** zorunludur — aksi halde ESP32'nin 3.3V GPIO'su zarar görür.

4.9(28)
44 tamamlandı
ESP32 HC-SR04 Ultrasonik Mesafe Ölçer
Cetvele gerek kalmadan elinin ya da bir kutunun ne kadar uzakta olduğunu ölçen küçük bir alet. Mesafe sensörü kulağının duyamadığı bir ses gönderip yankısını dinler, ESP32 sonucu santimetre olarak küçük ekrana yazar; nesne çok uzaktaysa menzil dışında olduğunu söyler. Yarasaların karanlıkta yolunu nasıl bulduğunu kendi masanda görürsün.

Video

Devre Şeması

ESP32 HC-SR04 Ultrasonik Mesafe Ölçer - Circuit

Kaynak Kodu

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 HC-SR04 Ultrasonik Mesafe Ölçer
4// ─────────────────────────────────────────
5// HC-SR04 sensörü TRIG darbesiyle tetiklenir, ECHO süresinden mesafe (cm)
6// hesaplanır ve 16x2 I2C LCD'ye 0.2 sn'de bir yazılır. Yankı gelmezse
7// ekranda "Menzil dışında" görünür.
8//
9// Pinler:
10//   GPIO 5  -> HC-SR04 TRIG
11//   GPIO 18 -> HC-SR04 ECHO (gerilim bölücü ile)
12//   Bölücü: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13//   GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
14//   HC-SR04 ve LCD VCC -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Pin tanımları
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18;   // 1k + 2k bölücü şart
22
23// LCD adresi 0x27, bazen 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Ses hızı (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Yankı zaman aşımı (~5 m)
28
29void setup() {
30  pinMode(TRIG_PIN, OUTPUT);
31  pinMode(ECHO_PIN, INPUT);
32  digitalWrite(TRIG_PIN, LOW);
33
34  // DevKit V1 varsayılan I2C pinleri: SDA=21, SCL=22
35  Wire.begin(21, 22);
36
37  lcd.init();
38  lcd.backlight();
39
40  // Açılış ekranı 3 sn
41  lcd.setCursor(3, 0);
42  lcd.print("BlueGrays");
43  lcd.setCursor(1, 1);
44  lcd.print("HC-SR04 v1.0");
45  delay(3000);
46
47  // Ana ekran
48  lcd.clear();
49  lcd.setCursor(0, 0);
50  lcd.print("Mesafe:");
51}
52
53// Mesafeyi cm olarak okur, hatada -1
54float readDistanceCm() {
55  // 10 us TRIG darbesi ölçümü başlatır
56  digitalWrite(TRIG_PIN, LOW);
57  delayMicroseconds(2);
58  digitalWrite(TRIG_PIN, HIGH);
59  delayMicroseconds(10);
60  digitalWrite(TRIG_PIN, LOW);
61
62  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63  if (duration == 0) return -1.0f;
64  // Ses gidip dönüyor, yol 2'ye bölünür
65  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69  float distance = readDistanceCm();
70
71  // Alt satırı temizle
72  lcd.setCursor(0, 1);
73  lcd.print("                ");
74  lcd.setCursor(0, 1);
75
76  if (distance < 0) {
77    lcd.print("Menzil disinda");
78  } else {
79    lcd.print(distance, 1);   // 1 ondalık basamak
80    lcd.print(" cm");
81  }
82
83  delay(200);
84}
85

Sıkça Sorulanlar

ECHO hattına neden gerilim bölücü konuluyor?▾

HC-SR04 5 V ile çalışır ve ECHO pini 5 V verir; ESP32 girişleri en fazla 3,3 V kabul eder. 1 kΩ ve 2 kΩ dirençlerle kurulan bölücü 5 V'u yaklaşık 3,3 V'a düşürür ve ESP32'yi korur.

TRIG pinine de bölücü gerekir mi?▾

Hayır. TRIG ESP32'den sensöre giden bir sinyaldir; ESP32'nin 3,3 V'luk HIGH'ı HC-SR04 tarafından çoğunlukla güvenilir şekilde algılanır.

HC-SR04P ile bölücüye gerek kalır mı?▾

HC-SR04P ve RCWL-1601 gibi modeller 3,3 V ile beslenebilir; bu durumda ECHO çıkışı da 3,3 V olur ve bölücü gerekmez.

Mesafe ölçümü nasıl daha doğru olur?▾

Ses hızı sıcaklıkla değişir (20 °C'de yaklaşık 343 m/s). Sıcaklık sensörüyle ses hızını düzeltmek ve birkaç ölçümün ortancasını almak doğruluğu artırır.