Меряет расстояние до препятствия от 2 см до 4 м по времени, за которое ультразвук долетает до цели и возвращается. Два сигнальных провода, никаких библиотек.
Как работает
Датчик по сигналу TRIG (импульс 10 мкс) излучает пачку ультразвука на 40 кГц и выставляет высокий уровень на ECHO, пока эхо не вернётся. Длительность импульса на ECHO пропорциональна расстоянию: звук проходит путь туда и обратно, поэтому расстояние в сантиметрах = длительность в микросекундах / 58.
В скетче это три строки: импульс на TRIG, pulseIn(ECHO, HIGH) и деление.
Выводы
Вывод
Назначение
ECHO
выход: длительность высокого уровня — время полёта звука
⚡ В примере «HC-SR04» питается от 3V3 — в симуляторе так проще, и модель это допускает. Настоящий модуль рассчитан на 5 В: подключайте VCC к VIN (5 В от USB) или к отдельному источнику 5 В с общей землёй.
// Дальномер: импульс туда, время обратно.
//
// Работает он буквально как эхолот. На TRIG подаётся импульс в 10
// микросекунд, датчик пищит ультразвуком, а на ECHO держит высокий
// уровень ровно столько, сколько звук летел туда и обратно.
//
// Дальше — арифметика. Звук идёт примерно 343 метра в секунду, то есть
// 29 микросекунд на сантиметр. Путь двойной, поэтому делим ещё на два:
//
// расстояние = время / 29 / 2
//
// Библиотека здесь не нужна: весь датчик — это два вывода и pulseIn.
// Заодно видно, чем он занят, а не только результат.
//
// Таймаут в pulseIn обязателен. Без него функция ждёт ответа вечно, и
// отвалившийся провод превращается в зависшую плату. 30 миллисекунд —
// это примерно пять метров, дальше датчик всё равно не видит.
//
// Крутите ползунок расстояния на детали.
const int TRIG = 6;
const int ECHO = 7;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, 30000UL);
if (us == 0) {
Serial.println(F("нет ответа: слишком далеко или провод отошёл"));
} else {
float cm = us / 29.0 / 2.0;
Serial.print("cm:");
Serial.println(cm, 1);
}
delay(200);
}
В железе
ECHO выдаёт 5 В. Вход ESP32 рассчитан на 3,3 В — в железе ставят делитель на ECHO (например, 1 кОм и 2 кОм) или берут версию датчика на 3,3 В. У Arduino Uno вход пятивольтовый, делитель не нужен.
Частые ошибки
ECHO напрямую на вход ESP32 — вывод работает на пределе и со временем может выйти из строя. Нужен делитель.
Измерения чаще раза в 60 мс: эхо от прошлого импульса принимается за новое, и расстояние скачет.
pulseIn без тайм-аута: если эха нет (цель дальше 4 м или мягкая), скетч ждёт секунду. Передавайте третий аргумент, например 30000 мкс.
Мягкие и наклонные поверхности — ткань, поролон, стена под углом — рассеивают звук, и датчик их «не видит».