← До всіх проєктів
Сенсори Початковий

Ультразвуковий далекомір HC-SR04 і дільник напруги для ESP32

Вимірюємо відстань до 4 м за часом повернення ультразвукового імпульсу. Розбираємо TRIG/ECHO і pulseIn(), рахуємо швидкість звуку, а головне — ставимо дільник 1 кОм / 2 кОм, бо 5-вольтовий ECHO шкодить виводу ESP32.

Складність
Початковий
Час
30 min
Категорія
Сенсори
Оновлено

Про проєкт

HC-SR04 працює як кажан: випромінює короткий пакет ультразвуку на 40 кГц і слухає луну. Час між «криком» і відлунням пропорційний відстані. Дальність 2–400 см, точність близько 3 мм, ціна копійчана.

Що знадобиться

  • ESP32 DevKit
  • Модуль HC-SR04
  • Резистори 1 кОм і 2 кОм (або 2.2 кОм) для дільника

Схема

HC-SR04 Підключення
VCC 5V
TRIG GPIO5
ECHO → 1 кОм → GPIO18, а від GPIO18 → 2 кОм → GND
GND GND

Чому дільник обов'язковий. HC-SR04 живиться від 5 В, і його вихід ECHO дає 5 В, а входи ESP32 розраховані на 3.3 В. Надлишок іде через захисні діоди в лінію живлення: вивід деградує або горить. Дільник 1 кОм / 2 кОм дає 5 × 2 / (1 + 2) ≈ 3.3 В.

Вхід TRIG нормально розуміє 3.3 В з ESP32, дільник на ньому не потрібен. Існує версія HC-SR04P / RCWL-1601, що працює від 3.3 В. З нею дільник не знадобиться.

Як іде вимірювання

  1. ESP32 подає на TRIG імпульс 10 мкс.
  2. Модуль відправляє 8 періодів ультразвуку і піднімає ECHO в HIGH.
  3. Коли повертається луна, ECHO падає в LOW.
  4. pulseIn(ECHO, HIGH, 30000) вимірює тривалість HIGH у мікросекундах. 30000 — це тайм-аут (~5 м). Якщо луни немає, функція поверне 0.

Звук проходить шлях туди й назад, тому:

відстань (см) = час (мкс) × 0.0343 / 2, де 0.0343 см/мкс — швидкість звуку за ~20 °C.

Код

// Далекомір HC-SR04: TRIG на GPIO5, ECHO через дільник на GPIO18
const int TRIG = 5;
const int ECHO = 18;

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);   // запускаючий імпульс 10 мкс
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  unsigned long us = pulseIn(ECHO, HIGH, 30000);   // тайм-аут 30 мс ≈ 5 м
  if (us == 0) Serial.println("поза діапазоном");
  else Serial.printf("%.1f см\n", us * 0.0343 / 2);
  delay(300);
}

Корисно знати

  • Температура. Швидкість звуку ≈ 331.3 + 0.606 × T м/с. Між −10 і +35 °C це ±4 % похибки: для точних вимірювань додайте датчик температури.
  • М'які й похилі поверхні (тканина, кут стіни) розсіюють звук, і луна не повертається.
  • Кілька датчиків поруч чують чужу луну. Опитуйте їх по черзі з паузою ~60 мс.
  • Не опитуйте частіше ніж раз на ~60 мс: залишкова луна від попереднього виміру дає фантомні значення.

Що далі

Датчик над баком із водою перетворюється на рівнемір (є окрема стаття), а на бампері іграшкової машинки — на парктронік.