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:
+12
-5
@@ -3,19 +3,20 @@
|
|||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Display.h"
|
#include "Display.h"
|
||||||
#include "Gear.h"
|
#include "Gear.h"
|
||||||
// #include "Sonar.h"
|
#include "Sonar.h"
|
||||||
#include "RFID.h"
|
#include "RFID.h"
|
||||||
#include "Engine.h"
|
#include "Engine.h"
|
||||||
|
|
||||||
Display display;
|
Display display;
|
||||||
GearSelector gear(GEAR_X_PIN, GEAR_Y_PIN, GEAR_THRESH_LOW, GEAR_THRESH_HIGH);
|
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);
|
RFIDReader rfid(SS_PIN, RST_PIN);
|
||||||
Engine engine(THROTTLE_PIN, CLUTCH_PIN, BRAKE_PIN);
|
Engine engine(THROTTLE_PIN, CLUTCH_PIN, BRAKE_PIN);
|
||||||
|
|
||||||
unsigned long prevUpdate = 0;
|
unsigned long prevUpdate = 0;
|
||||||
|
|
||||||
bool carEnabled = false;
|
bool carEnabled = false;
|
||||||
|
unsigned long prevSonarUpdate = 0;
|
||||||
|
bool seatBelts = false;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
@@ -58,7 +59,13 @@ void loop() {
|
|||||||
display.updateSpeed(engine.getSpeedKmh());
|
display.updateSpeed(engine.getSpeedKmh());
|
||||||
}
|
}
|
||||||
|
|
||||||
// long dist = sonar.measure();
|
if (millis() - prevSonarUpdate >= 100) {
|
||||||
// Serial.println(dist);
|
prevSonarUpdate = millis();
|
||||||
|
long dist = sonar.measure();
|
||||||
|
if (!seatBelts)
|
||||||
|
if (dist < 200)
|
||||||
|
seatBelts = true;
|
||||||
|
else if (dist >= 200) seatBelts = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
#include "Sonar.h"
|
#include "Sonar.h"
|
||||||
|
|
||||||
Sonar::Sonar(int trigPin, int echoPin, long maxDistCm)
|
Sonar::Sonar(int sharedPin, long maxDistCm)
|
||||||
: _trigPin(trigPin), _echoPin(echoPin),
|
: _trigPin(sharedPin),
|
||||||
_maxDistCm(maxDistCm), _lastDistance(0) {
|
_echoPin(sharedPin),
|
||||||
pinMode(_trigPin, OUTPUT);
|
_singlePinMode(true),
|
||||||
pinMode(_echoPin, INPUT);
|
_maxDistCm(maxDistCm),
|
||||||
|
_lastDistance(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
long Sonar::measure() {
|
long Sonar::measure() {
|
||||||
digitalWrite(_trigPin, LOW);
|
if (_singlePinMode) {
|
||||||
delayMicroseconds(2);
|
_lastDistance = _measureSinglePin();
|
||||||
digitalWrite(_trigPin, HIGH);
|
} else {
|
||||||
delayMicroseconds(10);
|
digitalWrite(_trigPin, LOW);
|
||||||
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;
|
_lastDistance = duration / 58;
|
||||||
|
}
|
||||||
|
|
||||||
if (_lastDistance > _maxDistCm) {
|
if (_lastDistance > _maxDistCm) {
|
||||||
_lastDistance = _maxDistCm;
|
_lastDistance = _maxDistCm;
|
||||||
@@ -24,6 +29,24 @@ long Sonar::measure() {
|
|||||||
return _lastDistance;
|
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 {
|
long Sonar::getDistance() const {
|
||||||
return _lastDistance;
|
return _lastDistance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
class Sonar {
|
class Sonar {
|
||||||
public:
|
public:
|
||||||
Sonar(int trigPin, int echoPin, long maxDistCm = 400);
|
Sonar(int sharedPin, long maxDistCm = 400);
|
||||||
|
|
||||||
long measure();
|
long measure();
|
||||||
|
|
||||||
@@ -12,6 +12,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
int _trigPin;
|
int _trigPin;
|
||||||
int _echoPin;
|
int _echoPin;
|
||||||
|
bool _singlePinMode;
|
||||||
long _maxDistCm;
|
long _maxDistCm;
|
||||||
long _lastDistance;
|
long _lastDistance;
|
||||||
|
|
||||||
|
long _measureSinglePin();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user