
Видео
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Измерение расстояния HC-SR04 (вывод в порт)
4// ─────────────────────────────────────────
5// Измеряет расстояние ультразвуковым датчиком HC-SR04 и каждые 0,5 с
6// выводит в монитор порта результаты от 3 до 100 см (в см).
7//
8// Пины:
9// D7 -> HC-SR04 Trig
10// D6 -> HC-SR04 Echo
11// VCC HC-SR04 к 5V, GND к GND
12
13int echoPin = 6; // Вход Echo
14int trigPin = 7; // Выход Trigger
15int maxDistance = 100; // Наибольшее показываемое расстояние (см)
16int minDistance = 3; // Наименьшее показываемое расстояние (см)
17
18void setup() {
19 pinMode(trigPin, OUTPUT);
20 pinMode(echoPin, INPUT);
21 Serial.begin(9600);
22}
23
24void loop() {
25 // Импульс запуска 10 мкс отправляет звуковую посылку
26 digitalWrite(trigPin, HIGH);
27 delayMicroseconds(10);
28 digitalWrite(trigPin, LOW);
29
30 // Время, пока Echo остаётся в HIGH (мкс), — это время туда и обратно. Звук проходит 0.034 см/мкс;
31 // половина пути даёт расстояние
32 unsigned long duration = pulseIn(echoPin, HIGH);
33 double totalPath = (double)duration * 0.034;
34 int distance = totalPath / 2;
35
36 // Выводить только в допустимом диапазоне
37 if (distance > minDistance && distance < maxDistance) {
38 Serial.print("Distance: ");
39 Serial.print(distance);
40 Serial.println("cm");
41 }
42
43 delay(500); // Ждать 0,5 с
44}
45
Частые вопросы
Как HC-SR04 измеряет расстояние?
Датчик излучает звуковую волну 40 kHz и измеряет, за какое время возвращается эхо. Звук идёт по воздуху со скоростью около 343 м/с; расстояние в сантиметрах вычисляется по формуле: расстояние = время × 0.0343 / 2 (деление на 2 учитывает путь туда и обратно).
Какое самое маленькое и самое большое расстояние он измеряет?
На практике он измеряет расстояния примерно от 2 до 400 см. При расстоянии меньше 2 см, на очень больших расстояниях или на поглощающих звук поверхностях (ткань, поролон) измерения могут быть неточными или равными 0.
Иногда показания равны 0 или очень большие. Почему?
Если эхо не пришло, `pulseIn` завершится по таймауту. Направь датчик на ровную твёрдую поверхность, делай паузу не меньше 60 ms между измерениями и отсеивай ошибочные показания в коде.
Можно ли использовать его с ESP32?
HC-SR04 работает от 5 V, и его пин ECHO выдаёт 5 V. ESP32 работает с логикой 3,3 V, поэтому либо добавь на линию ECHO делитель напряжения (например, 1 kΩ + 2 kΩ), либо используй модель HC-SR04P, совместимую с 3,3 V.
