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.

Video
Devre Şeması

Kaynak Kodu
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.
