Add single‑pin Sonar support with periodic reading

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.
This commit is contained in:
2026-06-17 00:03:17 +02:00
parent 23d5003788
commit c053a296a5
3 changed files with 51 additions and 18 deletions
+12 -5
View File
@@ -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;
}
}
}
+29 -6
View File
@@ -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() {
if (_singlePinMode) {
_lastDistance = _measureSinglePin();
} else {
digitalWrite(_trigPin, LOW);
delayMicroseconds(2);
digitalWrite(_trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(_trigPin, LOW);
long duration = pulseIn(_echoPin, HIGH);
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;
}
+4 -1
View File
@@ -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();
};