HC-SR04: подключение к ESP32 и Arduino

Ультразвуковой датчик расстояния

Меряет расстояние до препятствия от 2 см до 4 м по времени, за которое ультразвук долетает до цели и возвращается. Два сигнальных провода, никаких библиотек.

Как работает

Датчик по сигналу TRIG (импульс 10 мкс) излучает пачку ультразвука на 40 кГц и выставляет высокий уровень на ECHO, пока эхо не вернётся. Длительность импульса на ECHO пропорциональна расстоянию: звук проходит путь туда и обратно, поэтому расстояние в сантиметрах = длительность в микросекундах / 58.

В скетче это три строки: импульс на TRIG, pulseIn(ECHO, HIGH) и деление.

Выводы

ВыводНазначение
ECHOвыход: длительность высокого уровня — время полёта звука
TRIGвход запуска: импульс 10 мкс начинает измерение
VCCпитание 5 В
GNDобщий провод

Подключение к ESP32

HC-SR04ESP32
ECHOGPIO18
TRIGGPIO5
VCC3V3
GNDGND

Схема из примера «Ультразвук: измерение расстояния».

⚡ В примере «HC-SR04» питается от 3V3 — в симуляторе так проще, и модель это допускает. Настоящий модуль рассчитан на 5 В: подключайте VCC к VIN (5 В от USB) или к отдельному источнику 5 В с общей землёй.

Ультразвук: измерение расстояния

Открыть пример целиком
Код скетча
const int TRIG = 5, ECHO = 18;

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

float measureCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  // Скорость звука 343 м/с = 0.0343 см/мкс, путь туда и обратно.
  unsigned long us = pulseIn(ECHO, HIGH, 30000);
  if (us == 0) return -1;
  return us * 0.0343 / 2.0;
}

void loop() {
  float cm = measureCm();
  if (cm < 0) Serial.println("вне диапазона");
  else Serial.printf("%.1f см\n", cm);
  delay(300);
}

Подключение к Arduino Uno

HC-SR04Arduino Uno
ECHOD7
TRIGD6
VCC5V
GNDGND

Схема из примера «Arduino Uno: дальномер HC-SR04».

Arduino Uno: дальномер HC-SR04

Открыть пример целиком
Код скетча
// Дальномер: импульс туда, время обратно.
//
// Работает он буквально как эхолот. На 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 вход пятивольтовый, делитель не нужен.

Частые ошибки

Другие детали