Для электронщиков и радиолюбителей

Делаем ультразвуковой дальномер на основе ESP32 и HC-SR04

Делаем ультразвуковой дальномер на основе ESP32 и HC-SR04

Сегодня мы узнаем, как сделать ультразвуковой дальномер своими руками на основе 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 также передает данные в виде отдельной веб-страницы, доступ к которой можно получить из любого браузера.