Ультразвуковой дальномер HC-SR04 предназначен для измерения расстояния от устройства до объекта. Работа модуля основана на принципе эхолокации. Модуль посылает ультразвуковой сигнал и принимает его отражение от объекта. Измерив время между отправкой и получением импульса, не сложно вычислить расстояние до препятствия. Поскольку в основе работы устройства используется ультразвук, модуль плохо подходит для определения расстояния до звукопоглощающих объектов. Для идеального измерения расстояния поверхность объекта должна быть ровной и гладкой. В этой статье мы подключим ультразвуковой дальномер HC-SR04 к Arduino.
Схема подключения HC-SR04 к Arduino
Подключение ультразвукового датчика расстояния HC-SR04 к Arduino достаточно просто. Схема подключения показана на рисунке.
Контакт земли подключаем к выводу GND на плате Arduino, вывод питания соединяем с 5V. Trig и Echo подсоединяем к цифровым пинам платы.
| Arduino | HC-SR04 |
|---|---|
| VCC | Vcc |
| 13 | Trig |
| 12 | Echo |
| GND | Gnd |
Пример скетча
Ну а теперь после подключения ультразвуковой дальномера HC-SR04 к Arduino разберемся с программной частью. Для начала мы используем простой скетч, который поможет нам определить расстояние до объекта в сантиметрах без использования библиотек.
#define ECHO_PIN 12
#define TRIG_PIN 13
void setup() {
/*
задаем скорость общения с компьютером
*/
Serial.begin (9600);
/*
инициируем как выход TRIG пин
*/
pinMode(TRIG_PIN, OUTPUT);
/*
инициируем как вход ECHO пин
*/
pinMode(ECHO_PIN, INPUT);
}
void loop() {
int duration, cm;
/*
для большей точности установим значение LOW на пине Trig
*/
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
/*
установим высокий уровень на пине Trig
*/
digitalWrite(TRIG_PIN, HIGH);
/*
Подождем 10 μs
*/
delayMicroseconds(10);
/*
установим низкий уровень на пине Trig
*/
digitalWrite(TRIG_PIN, LOW);
/*
Узнаем длительность высокого сигнала на пине Echo
*/
duration = pulseIn(ECHO_PIN, HIGH, 30000);
/*
Рассчитаем расстояние в сантиметрах
*/
cm = duration / 58;
/*
Отправляем полученные данные на компьютер
*/
Serial.print(cm);
Serial.println(" cm");
/*
Ждём четверть секунды и повторяем снова
*/
delay(250);
}
Результат
Установка библиотеки HC-SR04
Количество строк кода можно существенно уменьшить, используя библиотеку HCSR04 для работы с дальномером. Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Добавить .ZIP библиотеку…

- Выбираем .ZIP архив (HCSR04.zip) и кликаем Open/Открыть.

- Библиотека установлена.

Описание методов библиотеки HCSR04.zip
HCSR04(uint8_t, uint8_t, unsigned long)
Конструктор для создания экземпляра класса, первый параметр это номер trig пина, второй — echo, третий — timeout в микросекундах.
HCSR04(uint8_t trigPin, uint8_t echoPin, unsigned long timeout = 1000000);
begin()
Инициализация HC-SR04.
void begin();
getDistanceMm()
Возвращает расстояние в миллиметрах.
unsigned int getDistanceMm();
getDistanceCm()
Возвращает расстояние в сантиметрах.
unsigned int getDistanceCm();
getDistanceInch()
Возвращает расстояние в дюймах.
unsigned int getDistanceInch();
getDistanceMmFloat()
Возвращает расстояние в миллиметрах. Тип возвращаемых данных float.
float getDistanceMmFloat();
getDistanceCmFloat()
Возвращает расстояние в сантиметрах. Тип возвращаемых данных float.
float getDistanceCmFloat();
getDistanceInchFloat()
Возвращает расстояние в дюймах. Тип возвращаемых данных float.
float getDistanceInchFloat();
getDuration()
Это частный метод, который возвращает продолжительность в микросекундах — прошедшее время до объекта/препятствия и обратно.
unsigned long getDuration();
Пример скетча
Проверить работоспособность библиотеки можно следующим примером:
/*
Включяем библиотеку для работы с HC-SR04
*/
#include <hcsr04.h>
#define ECHO_PIN 12
#define TRIG_PIN 13
#define TIMEOUT 30000
/*
Создаём экземпляр класса HCSR04
*/
HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, TIMEOUT);
void setup() {
/*
задаем скорость общения с компьютером
*/
Serial.begin(9600);
/*
HC-SR04как выход TRIG пин
*/
hcsr04.begin();
}
void loop() {
float cm, inch;
int mm;
/*
Получаем расстояние в миллиметрах
*/
mm = hcsr04.getDistanceMm();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(10);
/*
Получаем расстояние в сантиметрах. Тип возвращаемых данных float
*/
cm = hcsr04.getDistanceCmFloat();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(10);
/*
Получаем расстояние в дюймах. Тип возвращаемых данных float
*/
inch = hcsr04.getDistanceInchFloat();
/*
Отправляем полученные данные на компьютер
*/
Serial.print(mm);
Serial.print(" mm ");
Serial.print(cm);
Serial.print(" cm ");
Serial.print(inch);
Serial.print(" inch");
Serial.println();
/*
Ждём четверть секунды и повторяем снова
*/
delay(250);
}
Результат
Подключение HC-SR04 к Arduino и вывод на LCD1602
Чтобы не использовать компьютер для вывода информации, мы будем вывести данные о расстоянии на ЖКИ, в моём случае — это LCD1602 (два ряда по 16 символов). Лучше всего использовать PCF8574 — I2C модуль для LCD на базе HD44780. Подробнее в статье Подключение LCD1602 к Arduino по I2C (HD44780/PCF8574).
Схема подключения LCD1602 и HC-SR04 к Arduino
Подключение HC-SR04 к Arduino:
| Arduino Pro Mini | HC-SR04 |
|---|---|
| VCC | Vcc |
| 13 | Trig |
| 12 | Echo |
| GND | Gnd |
Подключение LCD1602 к Arduino:
| Arduino Pro Mini | LCD I2C модуль |
|---|---|
| GND | GND |
| 5V | VCC |
| A4 | SDA |
| A5 | SCL |
Пример скетча
#include <LiquidCrystal_I2C.h>
/*
Включяем библиотеку для работы с HC-SR04
*/
#include <hcsr04.h>
#define ECHO_PIN 12
#define TRIG_PIN 13
#define TIMEOUT 30000
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
/*
Создаём экземпляр класса HCSR04
*/
HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, TIMEOUT);
void setup() {
hcsr04.begin();
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
}
void loop() {
float cm, inch;
int mm;
/*
Получаем расстояние в миллиметрах
*/
mm = hcsr04.getDistanceMm();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(30);
/*
Получаем расстояние в сантиметрах. Тип возвращаемых данных float
*/
cm = hcsr04.getDistanceCmFloat();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(30);
/*
Получаем расстояние в дюймах. Тип возвращаемых данных float
*/
inch = hcsr04.getDistanceInchFloat();
/*
Отправляем полученные данные на LCD
*/
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(mm);
lcd.print("mm ");
lcd.setCursor(8, 0);
lcd.print(cm);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print(inch);
lcd.print("inch");
delay(500);
}
Результат
Материалы
Подключение LCD1602 к Arduino по I2C (HD44780/PCF8574)
HC-SR04 — ультразвуковой датчик расстояния
datasheets_HCSR04.pdf


