Сегодня мы узнаем, как сделать ультразвуковой дальномер своими руками на основе ESP32 и датчика HC-SR04. К микроконтроллеру ESP32 можно подключить ультразвуковой датчик для измерения расстояний с помощью звуковых волн. ESP32 имеет контакты GPIO, которые можно использовать для взаимодействия с ультразвуковым датчиком. Проект легко реализуем и вполне подходит для новичков.
Если говорить простыми словами, то действие ультразвукового датчика основаны на испускании УЗ-сигнала из одного его канала (Trig) и приеме вернувшегося сигнала другим его каналом (Echo). Затем датчик определяет время возврата сигнала, и на его основе можно вычислить расстояние.

Подключите контакт Trig ультразвукового датчика к контакту GPIO 22 на ESP32, а контакт Echo – к контакту GPIO 23. Затем можно использовать простой код, чтобы измерить время, необходимое звуковой волне, чтобы вернуться, и рассчитать расстояние на основе скорости звука.

Код программы ESP32:
#include <ESPAsyncWebServer.h>
#include <WiFi.h>
#include <Wire.h>
const char *ssid = "Embeddershop";
const char *password = "Embeddershop01";
const int trigPin = 22;
const int echoPin = 23;
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
AsyncWebServer server(80);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
String html = "<html><head>";
html += "<link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&display=swap' rel='stylesheet'>";
html += "<script src='https://cdn.jsdelivr.net/npm/justgage'></script>";
html += "<script src='https://cdn.jsdelivr.net/npm/raphael@2.2.8'></script>";
html += "<style>";
html += "body { font-family: 'Roboto', sans-serif; text-align: center; background-color: #f0f0f0; }";
html += ".container { max-width: 600px; margin: 0 auto; padding: 20px; }";
html += "h1 { color: #333; }";
html += "p { font-size: 24px; color: #555; }";
html += "</style>";
html += "<script type='text/javascript'>";
html += "function updateDistance() {";
html += " var xhr = new XMLHttpRequest();";
html += " xhr.onreadystatechange = function() {";
html += " if (xhr.readyState == 4 && xhr.status == 200) {";
html += " var distanceData = JSON.parse(xhr.responseText);";
html += " document.getElementById('distanceCm').innerHTML = 'Distance (cm): ' + distanceData.cm;";
html += " document.getElementById('distanceInch').innerHTML = 'Distance (inch): ' + distanceData.inch;";
html += " g.refresh(distanceData.cm);";
html += " }";
html += " };";
html += " xhr.open('GET', '/getDistance', true);";
html += " xhr.send();";
html += "}";
html += "setInterval(updateDistance, 1000);";
html += "</script>";
html += "</head><body>";
html += "<div class='container'>";
html += "<h1>Distance Measurement</h1>";
html += "<p id='distanceCm'>Distance (cm): Loading...</p>";
html += "<p id='distanceInch'>Distance (inch): Loading...</p>";
html += "<div id='gauge' style='width:300px; height:250px; margin: 0 auto;'></div>";
html += "</div>";
html += "<script>";
html += "var g = new JustGage({";
html += " id: 'gauge',";
html += " value: 0,";
html += " min: 0,";
html += " max: 200,";
html += " title: 'Distance (cm)',";
html += " label: 'cm',";
html += " levelColors: ['#00FF00', '#FFD700', '#FF0000']";
html += "});";
html += "</script>";
html += "</body></html>";
request->send(200, "text/html", html);
});
server.on("/getDistance", HTTP_GET, [](AsyncWebServerRequest *request) {
String distanceData = "{\"cm\":" + String(distanceCm) + ", \"inch\":" + String(distanceInch) + "}";
request->send(200, "application/json", distanceData);
});
server.begin();
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
distanceInch = distanceCm * CM_TO_INCH;
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
delay(1000);
}
ESP32 по Wi-Fi также передает данные в виде отдельной веб-страницы, доступ к которой можно получить из любого браузера.

ESP-WROOM-32 DevKit
Плата ESP-WROOM-32 DevKit на основе популярного Wi-Fi/Bluetooth модуля ESP32