Ультразвуковий далекомір HC-SR04 і дільник напруги для ESP32
Вимірюємо відстань до 4 м за часом повернення ультразвукового імпульсу. Розбираємо TRIG/ECHO і pulseIn(), рахуємо швидкість звуку, а головне — ставимо дільник 1 кОм / 2 кОм, бо 5-вольтовий ECHO шкодить виводу ESP32.
Про проєкт
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 В. З нею дільник не знадобиться.
Як іде вимірювання
- ESP32 подає на TRIG імпульс 10 мкс.
- Модуль відправляє 8 періодів ультразвуку і піднімає ECHO в HIGH.
- Коли повертається луна, ECHO падає в LOW.
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 мс: залишкова луна від попереднього виміру дає фантомні значення.
Що далі
Датчик над баком із водою перетворюється на рівнемір (є окрема стаття), а на бампері іграшкової машинки — на парктронік.