From c053a296a51cfcad52453a82a4674ccb67ced400 Mon Sep 17 00:00:00 2001 From: GarandPLG Date: Wed, 17 Jun 2026 00:03:17 +0200 Subject: [PATCH] =?UTF-8?q?Add=20single=E2=80=91pin=20Sonar=20support=20wi?= =?UTF-8?q?th=20periodic=20reading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implemented Sonar constructor to use a single shared pin, added mode flag and helper method for single‑pin measurements. Updated measure() to select the appropriate implementation and added timeout to pulseIn. Integrated periodic sonar updates in the main loop, tracking last update time and toggling a seatBelts flag based on distance thresholds. --- Projekt_Arduino.ino | 17 +++++++++++----- Sonar.cpp | 47 +++++++++++++++++++++++++++++++++------------ Sonar.h | 5 ++++- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/Projekt_Arduino.ino b/Projekt_Arduino.ino index cb7d696..7b54db6 100644 --- a/Projekt_Arduino.ino +++ b/Projekt_Arduino.ino @@ -3,19 +3,20 @@ #include "Config.h" #include "Display.h" #include "Gear.h" -// #include "Sonar.h" +#include "Sonar.h" #include "RFID.h" #include "Engine.h" Display display; GearSelector gear(GEAR_X_PIN, GEAR_Y_PIN, GEAR_THRESH_LOW, GEAR_THRESH_HIGH); -// Sonar sonar(TRIG_PIN, ECHO_PIN, SONAR_MAX_DIST_CM); +Sonar sonar(TRIG_AND_ECHO_PIN, SONAR_MAX_DIST_CM); RFIDReader rfid(SS_PIN, RST_PIN); Engine engine(THROTTLE_PIN, CLUTCH_PIN, BRAKE_PIN); unsigned long prevUpdate = 0; - bool carEnabled = false; +unsigned long prevSonarUpdate = 0; +bool seatBelts = false; void setup() { Serial.begin(9600); @@ -58,7 +59,13 @@ void loop() { display.updateSpeed(engine.getSpeedKmh()); } - // long dist = sonar.measure(); - // Serial.println(dist); + if (millis() - prevSonarUpdate >= 100) { + prevSonarUpdate = millis(); + long dist = sonar.measure(); + if (!seatBelts) + if (dist < 200) + seatBelts = true; + else if (dist >= 200) seatBelts = true; + } } } diff --git a/Sonar.cpp b/Sonar.cpp index c0aa458..aaf2cbe 100644 --- a/Sonar.cpp +++ b/Sonar.cpp @@ -1,21 +1,26 @@ #include "Sonar.h" -Sonar::Sonar(int trigPin, int echoPin, long maxDistCm) - : _trigPin(trigPin), _echoPin(echoPin), - _maxDistCm(maxDistCm), _lastDistance(0) { - pinMode(_trigPin, OUTPUT); - pinMode(_echoPin, INPUT); +Sonar::Sonar(int sharedPin, long maxDistCm) + : _trigPin(sharedPin), + _echoPin(sharedPin), + _singlePinMode(true), + _maxDistCm(maxDistCm), + _lastDistance(0) { } long Sonar::measure() { - digitalWrite(_trigPin, LOW); - delayMicroseconds(2); - digitalWrite(_trigPin, HIGH); - delayMicroseconds(10); - digitalWrite(_trigPin, LOW); + if (_singlePinMode) { + _lastDistance = _measureSinglePin(); + } else { + digitalWrite(_trigPin, LOW); + delayMicroseconds(2); + digitalWrite(_trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(_trigPin, LOW); - long duration = pulseIn(_echoPin, HIGH); - _lastDistance = duration / 58; + long duration = pulseIn(_echoPin, HIGH, 30000UL); + _lastDistance = duration / 58; + } if (_lastDistance > _maxDistCm) { _lastDistance = _maxDistCm; @@ -24,6 +29,24 @@ long Sonar::measure() { return _lastDistance; } +long Sonar::_measureSinglePin() { + pinMode(_trigPin, OUTPUT); + digitalWrite(_trigPin, LOW); + delayMicroseconds(4); + + digitalWrite(_trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(_trigPin, LOW); + + pinMode(_echoPin, INPUT); + + delayMicroseconds(15); + + long duration = pulseIn(_echoPin, HIGH, 30000UL); + + return duration / 58; +} + long Sonar::getDistance() const { return _lastDistance; } diff --git a/Sonar.h b/Sonar.h index 751b00f..a8b93d8 100644 --- a/Sonar.h +++ b/Sonar.h @@ -3,7 +3,7 @@ class Sonar { public: - Sonar(int trigPin, int echoPin, long maxDistCm = 400); + Sonar(int sharedPin, long maxDistCm = 400); long measure(); @@ -12,6 +12,9 @@ public: private: int _trigPin; int _echoPin; + bool _singlePinMode; long _maxDistCm; long _lastDistance; + + long _measureSinglePin(); };