From 7a4e9df6ceaaffa815871e0f593b634fb1fef809 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 23 Jan 2026 00:56:10 +0300 Subject: [PATCH] add ultrasonic --- src/main.cpp | 2 ++ src/ultrasonic.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/ultrasonic.h | 7 +++++++ src/web_server.cpp | 6 +++++- src/web_ui.cpp | 3 ++- 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/ultrasonic.cpp create mode 100644 src/ultrasonic.h diff --git a/src/main.cpp b/src/main.cpp index 512cf82..3a58dfc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,11 +6,13 @@ #include "robot_state.h" #include "ws_server.h" #include "servo.h" +#include "ultrasonic.h" void setup() { Serial.begin(115200); servoInit(); + ultrasonicInit(); actuatorsInit(); webServerInit(); wsInit(); diff --git a/src/ultrasonic.cpp b/src/ultrasonic.cpp new file mode 100644 index 0000000..3a3c27e --- /dev/null +++ b/src/ultrasonic.cpp @@ -0,0 +1,38 @@ +#include +#include "ultrasonic.h" + +// ===== PIN CONFIG ===== +#define TRIG_PIN 32 +#define ECHO_PIN 33 + +// таймаут эха (30 мс ≈ 5 м) +static const uint32_t ECHO_TIMEOUT_US = 30000; + +void ultrasonicInit() { + pinMode(TRIG_PIN, OUTPUT); + pinMode(ECHO_PIN, INPUT); + + digitalWrite(TRIG_PIN, LOW); +} + +// измерение расстояния +int ultrasonicReadCm() { + // триггер + digitalWrite(TRIG_PIN, LOW); + delayMicroseconds(2); + + digitalWrite(TRIG_PIN, HIGH); + delayMicroseconds(10); + digitalWrite(TRIG_PIN, LOW); + + // читаем эхо + uint32_t duration = pulseIn(ECHO_PIN, HIGH, ECHO_TIMEOUT_US); + + if (duration == 0) { + return -1; // нет эха + } + + // скорость звука ≈ 343 м/с + int distance = duration / 58; + return distance; +} diff --git a/src/ultrasonic.h b/src/ultrasonic.h new file mode 100644 index 0000000..81320ef --- /dev/null +++ b/src/ultrasonic.h @@ -0,0 +1,7 @@ +#pragma once + +void ultrasonicInit(); + +// возвращает расстояние в см +// -1 = нет эхо / ошибка +int ultrasonicReadCm(); diff --git a/src/web_server.cpp b/src/web_server.cpp index 6755229..0873c73 100644 --- a/src/web_server.cpp +++ b/src/web_server.cpp @@ -5,6 +5,7 @@ #include "web_ui.h" #include "controller.h" #include "robot_state.h" +#include "ultrasonic.h" static WebServer server(80); @@ -68,13 +69,16 @@ void handleMode() { } void handleStatus() { + int dist = ultrasonicReadCm(); + String json = "{"; json += "\"mode\":\"" + String(modeToStr(robot.mode)) + "\","; json += "\"speedL\":" + String(robot.speedL) + ","; json += "\"speedR\":" + String(robot.speedR) + ","; json += "\"rssi\":" + String(WiFi.RSSI()) + ","; - json += "\"uptime\":" + String(millis()); + json += "\"uptime\":" + String(millis()) + ","; + json += "\"distance_cm\":" + String(dist); json += "}"; diff --git a/src/web_ui.cpp b/src/web_ui.cpp index 3a194ed..d97fa6c 100644 --- a/src/web_ui.cpp +++ b/src/web_ui.cpp @@ -125,13 +125,14 @@ function wsConnect(){ `MODE=${j.mode} | ` + `L=${j.speedL} R=${j.speedR} | ` + `RSSI=${j.rssi}dBm | ` + + `DIST=${j.distance_cm < 0 ? '---' : j.distance_cm + 'cm'} | ` + `UP=${Math.floor(j.uptime/1000)}s` ); }catch(e){ st('STATUS ERR'); } } - setInterval(updateStatus, 500); + setInterval(updateStatus, 5000); // управление "пока держишь" (heartbeat) function bindHold(btn, onPressCmd){