ESP32 с ультразвуковым датчиком HC-SR04 в Arduino IDE
В этом руководстве показано, как использовать ультразвуковой датчик HC-SR04 с платой ESP32 с использованием ядра Arduino. Ультразвуковой датчик использует сонар для определения расстояния до объекта. Мы покажем вам, как подключить датчик к ESP32, и предоставим несколько примеров скетчей для определения расстояния до объекта с помощью HC-SR04.
В этом руководстве рассматриваются следующие темы:
Распиновка ультразвукового датчика HC-SR04
Подключение ультразвукового датчика HC-SR04 к ESP32
Получение расстояния до объекта с помощью ультразвукового датчика HC-SR04 и ESP32
Отображение расстояния до объекта на дисплее с использованием ESP32 и HC-SR04
Знакомство с ультразвуковым датчиком HC-SR04
Ультразвуковой датчик HC-SR04 использует сонар для определения расстояния до объекта. Этот датчик измеряет расстояние от 2 см до 400 см (от 0,8 дюйма до 157 дюймов) с точностью 0,3 см (0,1 дюйма), что подходит для большинства любительских проектов. Кроме того, этот модуль поставляется с ультразвуковым передатчиком и приемником.
На следующем изображении показан ультразвуковой датчик HC-SR04.
На следующем изображении показана обратная сторона датчика.
Технические характеристики HC-SR04
В следующей таблице приведены основные характеристики и спецификации ультразвукового датчика HC-SR04. Для получения дополнительной информации следует обратиться к даташиту датчика.
Напряжение питания |
5V DC |
Рабочий ток |
15 мА |
Рабочая частота |
40 кГц |
Максимальная дальность |
4 метра |
Минимальная дальность |
2 см |
Угол измерения |
15° |
Разрешение |
0,3 см |
Входной сигнал Trigger |
TTL импульс 10 мкс |
Выходной сигнал Echo |
TTL импульс, пропорциональный дальности |
Размеры |
45 мм x 20 мм x 15 мм |
Распиновка ультразвукового датчика HC-SR04
Вот распиновка ультразвукового датчика HC-SR04.
VCC |
Питание датчика (5V) |
Trig |
Вход триггера (Trigger Input Pin) |
Echo |
Выход эхо-сигнала (Echo Output Pin) |
GND |
Общая земля |
Как работает ультразвуковой датчик HC-SR04?
Ультразвуковой датчик использует сонар для определения расстояния до объекта. Вот как это работает:
Ультразвуковой передатчик (пин trig) излучает высокочастотный звук (40 кГц).
Звук распространяется в воздухе. Если он находит объект, он отражается обратно к модулю.
Ультразвуковой приемник (пин echo) принимает отраженный звук (эхо).
Учитывая скорость звука в воздухе и время прохождения (время, прошедшее с момента передачи и приема сигнала), мы можем вычислить расстояние до объекта. Вот формула:
расстояние до объекта = ((скорость звука в воздухе) * время) / 2
скорость звука в воздухе при 20°C (68°F) = 343 м/с
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Схема подключения – ESP32 с ультразвуковым датчиком HC-SR04
Подключите ультразвуковой датчик HC-SR04 к ESP32, как показано на следующей схеме. Мы подключаем пин Trig к GPIO 5 и пин Echo к GPIO 18, но вы можете использовать любые другие подходящие пины.
Ультразвуковой датчик |
ESP32 |
|---|---|
VCC |
VIN |
Trig |
GPIO 5 |
Echo |
GPIO 18 |
GND |
GND |
Подготовка Arduino IDE
Мы будем программировать плату ESP32 с помощью Arduino IDE. Поэтому убедитесь, что у вас установлено дополнение ESP32. Следуйте следующему руководству:
Если вы хотите использовать VS Code с расширением PlatformIO, следуйте следующему руководству, чтобы узнать, как программировать ESP32:
Код – Получение расстояния до объекта с помощью HC-SR04 и ESP32
Следующий скетч – это простой пример того, как можно получить расстояние между датчиком и объектом, используя плату ESP32 с ядром Arduino.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-hc-sr04-ultrasonic-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
void setup() {
Serial.begin(115200); // Starts the serial communication
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
delay(1000);
}
Загрузите код на вашу плату, и он сразу заработает. Продолжайте чтение, если хотите узнать, как работает код, или перейдите к разделу демонстрации.
Как работает код
Сначала определяем пины триггера и эхо.
const int trigPin = 5;
const int echoPin = 18;
В этом примере мы используем GPIO 5 и GPIO 18. Но вы можете использовать любые другие подходящие GPIO – прочитайте Справочник по распиновке ESP32: Какие GPIO пины следует использовать?
Переменная SOUND_SPEED сохраняет скорость звука в воздухе при 20°C. Мы используем значение в см/мкс.
#define SOUND_SPEED 0.034
Переменная CM_TO_INCH позволяет нам конвертировать расстояние из сантиметров в дюймы.
#define CM_TO_INCH 0.393701
Затем инициализируем следующие переменные.
long duration;
float distanceCm;
float distanceInch;
Переменная duration сохраняет время прохождения ультразвуковых волн (время, прошедшее с момента передачи и приема импульсной волны). Переменные distanceCm и distanceInch, как следует из их названий, сохраняют расстояние до объекта в сантиметрах и дюймах.
setup()
В setup() инициализируем последовательную связь на скорости 115200 бод, чтобы мы могли выводить измерения в Serial Monitor.
Serial.begin(115200); // Starts the serial communication
Определяем пин триггера как OUTPUT – пин триггера излучает ультразвук. И определяем пин эхо как INPUT – пин эхо принимает отраженную волну и отправляет сигнал на ESP32, пропорциональный времени прохождения.
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
loop()
В loop() следующие строки создают импульс HIGH длительностью 10 мкс на пине триггера – это означает, что пин будет излучать ультразвук. Обратите внимание, что перед отправкой импульса мы подаем короткий импульс LOW, чтобы обеспечить чистый импульс HIGH.
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Мы используем функцию pulseIn() для получения времени прохождения звуковой волны:
duration = pulseIn(echoPin, HIGH);
Функция pulseIn() считывает импульс HIGH или LOW на пине. Она принимает в качестве аргументов пин и состояние импульса (HIGH или LOW). Она возвращает длительность импульса в микросекундах. Длительность импульса соответствует времени, которое потребовалось для прохождения до объекта плюс время обратного пути.
Затем мы просто вычисляем расстояние до объекта, учитывая скорость звука.
distanceCm = duration * SOUND_SPEED/2;
Конвертируем расстояние в дюймы:
distanceInch = distanceCm * CM_TO_INCH;
И, наконец, выводим результаты в Serial Monitor.
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
Демонстрация
Загрузите код на вашу плату. Не забудьте выбрать плату, которую вы используете, в Tools > Boards. Также не забудьте выбрать правильный COM-порт в Tools > Port.
После загрузки откройте Serial Monitor на скорости 115200 бод. Нажмите кнопку RST на плате, чтобы перезагрузить её, и она начнет выводить расстояние до ближайшего объекта в Serial Monitor. Результат будет выглядеть примерно так, как показано на изображении ниже.
ESP32 с HC-SR04 и OLED-дисплеем
В этом разделе мы покажем вам простой пример с ESP32, который отображает расстояние на I2C OLED-дисплее.
Для лучшего понимания работы проекта рекомендуем ознакомиться с нашим руководством по ESP32 с I2C OLED-дисплеем.
Необходимые компоненты (OLED)
Вот список компонентов, необходимых для выполнения этого примера:
Схема подключения – ESP32 с HC-SR04 и OLED-дисплеем
Подключите все компоненты, как показано на следующей схеме.
Подробнее об OLED-дисплее с ESP32: ESP32 OLED-дисплей с Arduino IDE
Код – ESP32: отображение расстояния (HC-SR04) на OLED-дисплее
Для использования этого примера убедитесь, что у вас установлены библиотеки Adafruit SSD1306 и Adafruit GFX. Вы можете установить эти библиотеки через Arduino Library Manager.
Перейдите в Sketch > Library > Manage Libraries, найдите «SSD1306» и установите библиотеку SSD1306 от Adafruit.
После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.
После установки библиотек перезапустите Arduino IDE.
Затем просто скопируйте следующий код в Arduino IDE и загрузите его на плату.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-hc-sr04-ultrasonic-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
int distanceCm;
int distanceInch;
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(500);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
display.clearDisplay();
display.setCursor(0, 25);
//Display distance in cm
display.print(distanceCm);
display.print(" cm");
// Display distance in inches
/* display.print(distanceInch);
display.print(" in");*/
display.display();
delay(500);
}
Как работает код (OLED)
Начнем с подключения необходимых библиотек для OLED-дисплея:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Определяем ширину и высоту OLED-дисплея. Мы используем OLED-дисплей 128x64:
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Создаем объект Adafruit_SSD1306 с именем display для управления OLED-дисплеем.
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Определяем пины, к которым подключен датчик HC-SR04.
const int trigPin = 5;
const int echoPin = 18;
Создаем переменные для сохранения расстояния и времени между передачей и приемом звуковых волн.
long duration;
int distanceCm;
int distanceInch;
setup() (OLED)
В setup() инициализируем последовательную связь на скорости 115200 бод, чтобы мы могли выводить результаты в Serial Monitor.
Serial.begin(115200);
Определяем пин триггера как OUTPUT и пин эхо как INPUT.
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Инициализируем OLED-дисплей:
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
Устанавливаем размер шрифта и цвет для дисплея.
display.setTextSize(2);
display.setTextColor(WHITE);
loop() (OLED)
В loop() мы получаем расстояние и отображаем его на OLED.
Получаем расстояние (мы уже объясняли в предыдущем разделе, как вычислить расстояние).
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
Выводим расстояние в Serial Monitor.
// Prints the distance on the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
Очищаем дисплей в каждом цикле loop() для записи новых показаний.
display.clearDisplay();
Устанавливаем курсор дисплея в позицию (0, 25).
display.setCursor(0, 25);
Следующие строки выводят расстояние в сантиметрах на OLED-дисплей.
// Display static text
display.print(distanceCm);
display.print(" cm");
Закомментируйте предыдущие строки и раскомментируйте следующие строки, если хотите отображать показания в дюймах.
/* Display distance in inches
display.print(distanceInch);
display.print(" in");*/
Наконец, вызываем display.display(), чтобы фактически показать показания на OLED.
display.display();
Расстояние обновляется каждые 500 миллисекунд.
delay(500);
Демонстрация (OLED)
Загрузите код на вашу плату ESP32. Перейдите в Tools > Board и выберите плату ESP32, которую вы используете. Перейдите в Tools > Port и выберите порт, к которому подключена ваша плата. Затем нажмите кнопку загрузки.
Откройте Serial Monitor на скорости 115200 бод, нажмите кнопку RST на плате. Показания датчика будут отображаться как в Serial Monitor, так и на OLED-дисплее.
Приближайте объект к датчику и наблюдайте за изменением значений.
Заключение
Ультразвуковой датчик HC-SR04 позволяет определять расстояние до объекта. В этом руководстве вы узнали, как использовать HC-SR04 с ESP32. У нас есть руководства по другим популярным датчикам, которые могут вас заинтересовать:
ESP32 с датчиком температуры и влажности DHT11/DHT22 в Arduino IDE
ESP32 с BME280 в Arduino IDE (давление, температура, влажность)
ESP32 с датчиком окружающей среды BME680 в Arduino IDE (газ, давление, влажность, температура)
ESP32 с датчиком температуры DS18B20 в Arduino IDE (один датчик, несколько, веб-сервер)
ESP32 с барометрическим датчиком BMP180 (температура и давление)
Узнайте больше об ESP32 с нашими ресурсами:
Источник: ESP32 with HC-SR04 Ultrasonic Sensor with Arduino IDE