База знаний · Датчики и модули

HC-SR04: ультразвуковой дальномер

Как модуль меряет расстояние звуком, скетч без библиотек в 20 строк и почему на морозе он завышает.

HC-SR04 меряет расстояние так же, как летучая мышь: пищит и слушает эхо. По команде на входе Trig модуль издаёт восемь неслышимых импульсов на 40 кГц, ловит отражение вторым «глазом» и поднимает уровень на выходе Echo ровно на время полёта звука. Дальше чистая школьная физика: расстояние = время × скорость звука ÷ 2 (звук летит туда и обратно). Диапазон — от 2 см до 4 м.

Подключение

UNO / NANOлюбая классика 5 ВHC-SR04два «глаза» вперёдTR5VVCCпитание — по даташиту 5 В3Trigзапуск: импульс 10 мкс2Echoэхо: длительность = расстояниеGNDGNDобщий провод
Trig и Echo — два разных вывода: по одному плата даёт команду «пискни», по второму слушает ответ. На плате с логикой 3,3 В (ESP32, Pico) сигнал Echo — 5-вольтовый: нужен делитель из двух резисторов 10 кОм или 3,3-вольтовый аналог RCWL-1601.

Питание — по даташиту строго 5 В: от 3,3 В модуль работает нестабильно или молчит. В магазине классический HC-SR04 стоит 160 ₽, есть и наша версия Roborace HC-SR04 за 260 ₽.

Скетч — библиотека не нужна

Весь протокол — два действия: подать импульс 10 мкс на Trig и измерить длительность ответа функцией pulseIn(). Делитель 58 превращает микросекунды в сантиметры — это константа из даташита. На Uno скетч занимает 2 606 байт.

// Дальномер HC-SR04 совсем без библиотеки.
// TRIG — вывод 3, ECHO — вывод 2.
void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(2, INPUT);
}

void loop() {
  digitalWrite(3, LOW);               // короткая пауза перед запуском
  delayMicroseconds(2);
  digitalWrite(3, HIGH);              // импульс запуска: 10 мкс
  delayMicroseconds(10);
  digitalWrite(3, LOW);
  // ждём эхо, но не дольше 30 мс: ~10 м пути звука, ~5 м до предмета;
  // если эха нет, pulseIn вернёт 0
  long us = pulseIn(2, HIGH, 30000);
  long mm = us * 10 / 58;             // 58 мкс на каждый сантиметр
  Serial.print("L = ");
  Serial.print(mm);
  Serial.println(" mm");
  delay(200);
}

Любителям библиотек — NewPing из каталога: код короче, а сборка даже легче самоделки (2 484 байта против 2 606 — мы сравнили):

// HC-SR04 через библиотеку NewPing: короче и даже легче самоделки.
// TRIG — вывод 9, ECHO — вывод 10, максимальная дистанция 400 см.
#include <NewPing.h>

NewPing sonar(9, 10, 400);

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned int cm = sonar.ping_cm();  // 0 означает «эха нет»
  Serial.print("L = ");
  Serial.print(cm);
  Serial.println(" cm");
  delay(200);
}

Что означает ноль

Ноль — это «эхо не вернулось»: pulseIn не дождался ответа за отведённый таймаут — в нашем скетче 30 мс: звук успевает пройти ~10 м, то есть до предмета ~5 м. Так бывает, когда предмет дальше 4 м, повёрнут под углом и отразил звук в сторону, или поверхность мягкая — ткань и поролон ультразвук просто съедают. Даташит честен: надёжное эхо даёт ровная поверхность от 0,5 м². И не запускайте замеры чаще раза в 60 мс — эхо прошлого замера наложится на новый.

Точность и температура

Заявленное разрешение — до 3 мм, но есть подвох, о котором молчат карточки: скорость звука зависит от температуры. При +20 °C это 343 м/с (как в нашем скетче), а при 0 °C — уже 331 м/с: замер завышается примерно на 3,6 см на каждом метре. Для робота в комнате неважно, для уличного «парктроника» зимой — очень заметно. Лечится поправкой по датчику температуры — например, DS18B20 или DHT22.

Платы на 3,3 В

У ESP32, ESP8266 и Pico логика 3,3 В, а Echo отдаёт 5-вольтовый сигнал — напрямую подключать нельзя. Два пути: делитель из двух резисторов 10 кОм на линии Echo (5 В превращаются в безопасные 2,5 В) — или датчик RCWL-1601: он повторяет HC-SR04 по выводам, но питается от 3,3 В. Подробнее про уровни — в обзоре «Датчики для Arduino».

Частые вопросы

Почему HC-SR04 показывает 0?

Ноль возвращает pulseIn, когда эхо не пришло за отведённое время: предмет дальше 4 метров, поверхность мягкая или сильно наклонена и звук ушёл в сторону, либо перепутаны Trig и Echo. Проверьте провода и наведите датчик на ровную стену — она даёт уверенное эхо.

Можно ли подключить HC-SR04 к ESP32 или другой плате на 3,3 В?

Питание модулю по даташиту нужно 5 В, а вот сигнал Echo придёт 5-вольтовый — на вход 3,3-вольтовой платы его подают через делитель из двух резисторов 10 кОм. Второй путь проще: датчик RCWL-1601 совместим с HC-SR04 по выводам, но работает от 3,3 В напрямую.

Какая у HC-SR04 реальная точность?

Даташит обещает разрешение до 3 мм, но это в идеальных условиях. Реальные ограничения: угол луча 15°, предмет от 0,5 м², и зависимость скорости звука от температуры — скетч со «школьными» 343 м/с при 0 °C завышает дистанцию примерно на 3,6 см на каждом метре.

Обновлено: 21 августа 2026