ESP8266 NodeMCU с ультразвуковым датчиком HC-SR04 в Arduino IDE

В этом руководстве показано, как использовать ультразвуковой датчик HC-SR04 с платой ESP8266 NodeMCU с помощью ядра Arduino. Ультразвуковой датчик использует сонар для определения расстояния до объекта. Мы покажем вам, как подключить датчик к ESP8266, и предоставим несколько примеров скетчей для определения расстояния до объекта с использованием HC-SR04.

ESP8266 NodeMCU с ультразвуковым датчиком HC-SR04 в Arduino IDE

Это руководство охватывает следующие темы:

Знакомство с ультразвуковым датчиком HC-SR04

Ультразвуковой датчик HC-SR04 использует сонар для определения расстояния до объекта. Этот датчик измеряет расстояние от 2 см до 400 см (от 0,8 дюйма до 157 дюймов) с точностью 0,3 см (0,1 дюйма), что хорошо подходит для большинства любительских проектов. Кроме того, этот конкретный модуль поставляется с ультразвуковыми передатчиком и приёмником.

На следующем изображении показан ультразвуковой датчик HC-SR04.

Ультразвуковой датчик HC-SR04, вид спереди

На следующем изображении показана другая сторона датчика.

Ультразвуковой датчик HC-SR04, вид сзади

Где купить ультразвуковой датчик HC-SR04?

Вы можете найти ультразвуковой датчик HC-SR04 на Maker Advisor по лучшей цене:

Технические характеристики ультразвукового датчика HC-SR04

В следующей таблице приведены основные характеристики и спецификации ультразвукового датчика HC-SR04. Для получения дополнительной информации следует обратиться к даташиту датчика.

Напряжение питания

5V DC

Рабочий ток

15 мА

Рабочая частота

40 кГц

Максимальная дальность

4 метра

Минимальная дальность

2 см

Угол измерения

15 градусов

Разрешение

0,3 см

Входной сигнал триггера

TTL-импульс 10 мкс

Выходной сигнал эхо

TTL-импульс, пропорциональный дальности

Размеры

45 мм x 20 мм x 15 мм

Распиновка ультразвукового датчика HC-SR04

Вот распиновка ультразвукового датчика HC-SR04.

VCC

Питание датчика (5V)

Trig

Вход триггера (Trigger Input Pin)

Echo

Выход эхо (Echo Output Pin)

GND

Общая земля (GND)

Как работает ультразвуковой датчик HC-SR04?

Ультразвуковой датчик использует сонар для определения расстояния до объекта. Вот как это работает:

  1. Ультразвуковой передатчик (пин trig) излучает высокочастотный звук (40 кГц).

  2. Звук распространяется в воздухе. Если он находит объект, он отражается обратно к модулю.

  3. Ультразвуковой приёмник (пин echo) принимает отражённый звук (эхо).

Как работает ультразвуковой датчик HC-SR04

Учитывая скорость звука в воздухе и время прохождения (время, прошедшее с момента передачи и приёма сигнала), мы можем рассчитать расстояние до объекта. Вот формула:

расстояние до объекта = ((скорость звука в воздухе) * время) / 2
  • скорость звука в воздухе при 20 градусах C (68 градусов F) = 343 м/с

Необходимые компоненты

ESP8266 NodeMCU и ультразвуковой датчик HC-SR04

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения – ESP8266 NodeMCU с ультразвуковым датчиком HC-SR04

Подключите ультразвуковой датчик HC-SR04 к ESP8266, как показано на следующей схеме. Мы подключаем пин Trig к GPIO 12 и пин Echo к GPIO 14, но вы можете использовать любые другие подходящие пины.

Схема подключения ESP8266 NodeMCU и ультразвукового датчика HC-SR04

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

ESP8266

VCC

VIN

Trig

GPIO 12 (D6)

Echo

GPIO 14 (D5)

GND

GND

Подготовка Arduino IDE

Мы будем программировать плату ESP8266 с помощью Arduino IDE. Поэтому убедитесь, что у вас установлено дополнение ESP8266. Следуйте следующему руководству:

Если вы хотите использовать VS Code с расширением PlatformIO, следуйте следующему руководству, чтобы узнать, как программировать ESP8266:

Код – получение расстояния до объекта с помощью HC-SR04 и ESP8266

Следующий скетч представляет собой простой пример того, как можно получить расстояние между датчиком и объектом, используя плату ESP8266 с ядром Arduino.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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 = 12;
const int echoPin = 14;

//define sound velocity in cm/uS
#define SOUND_VELOCITY 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_VELOCITY/2;

  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;

  // Prints the distance on the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);

  delay(1000);
}

Просмотреть исходный код на GitHub

Загрузите код на плату, и он сразу заработает. Продолжайте чтение, если хотите узнать, как работает код, или перейдите к разделу демонстрации.

Как работает код

Сначала определите пины триггера и эхо.

const int trigPin = 12;
const int echoPin = 14;

В этом примере мы используем GPIO 12 и GPIO 14. Но вы можете использовать любые другие подходящие GPIO – прочитайте ESP8266 Pinout Reference: Which GPIO pins should you use?

Переменная 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 – пин эхо принимает отражённую волну и отправляет сигнал на ESP8266, который пропорционален времени прохождения.

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.

ESP8266 NodeMCU с ультразвуковым датчиком HC-SR04

После загрузки откройте Serial Monitor на скорости 115200 бод. Нажмите встроенную кнопку RST, чтобы перезагрузить плату, и она начнёт выводить расстояние до ближайшего объекта в Serial Monitor. Как показано на изображении ниже.

Ультразвуковой датчик ESP8266 -- получение расстояния до объекта в Arduino

ESP8266 с HC-SR04 и OLED-дисплеем

ESP8266 NodeMCU, HC-SR04 и OLED-дисплей -- необходимые компоненты

В этом разделе показан простой пример с ESP8266, который отображает расстояние на I2C OLED-дисплее.

Для лучшего понимания работы проекта рекомендуем ознакомиться с нашим руководством по ESP8266 с I2C OLED-дисплеем.

Необходимые компоненты

Вот список компонентов, необходимых для выполнения этого примера:

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения – ESP8266 с HC-SR04 и OLED-дисплеем

Подключите все компоненты, как показано на следующей схеме.

Схема подключения ESP8266 NodeMCU, ультразвукового датчика и I2C OLED-дисплея

Примечание

Узнайте больше об OLED-дисплее с ESP8266: ESP8266 OLED Display with Arduino IDE

Код – ESP8266 с отображением расстояния (HC-SR04) на OLED-дисплее

Для использования этого примера убедитесь, что у вас установлены библиотеки Adafruit SSD1306 и Adafruit GFX. Вы можете установить эти библиотеки через Arduino Library Manager.

Перейдите в Sketch > Library > Manage Libraries, найдите «SSD1306» и установите библиотеку SSD1306 от Adafruit.

Установка библиотеки I2C OLED Display SSD1306 в Arduino IDE

После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.

Установка библиотеки GFX в Arduino IDE

После установки библиотек перезапустите вашу Arduino IDE.

Затем просто скопируйте следующий код в вашу Arduino IDE и загрузите его на плату.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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 = 12;
const int echoPin = 14;

//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);
}

Просмотреть исходный код на GitHub

Как работает код

Начните с подключения необходимых библиотек для 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 = 12;
const int echoPin = 14;

Создайте переменные для сохранения расстояния и длительности между передачей и приёмом звуковых волн.

long duration;
int distanceCm;
int distanceInch;

setup()

В 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()

В 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);

Демонстрация

Перейдите в Tools > Board и выберите используемую вами плату ESP8266. Перейдите в Tools > Port и выберите порт, к которому подключена ваша плата. Затем нажмите кнопку загрузки.

Откройте Serial Monitor на скорости 115200 бод, нажмите встроенную кнопку RST. Показания датчика будут отображаться как в Serial Monitor, так и на OLED-дисплее.

Переместите объект перед датчиком и наблюдайте за изменением значений.

ESP8266 NodeMCU HC-SR04 ультразвуковой датчик с OLED-дисплеем -- демонстрация

Вы можете посмотреть короткое видео-демонстрацию:

Заключение

Ультразвуковой датчик HC-SR04 позволяет определить расстояние до объекта. В этом руководстве вы узнали, как использовать HC-SR04 с ESP8266. У нас есть руководства по другим популярным датчикам, которые могут вам понравиться:

Узнайте больше о ESP8266 с помощью наших ресурсов:

Спасибо за чтение.