/*
Forum: https://forum.arduino.cc/t/gleicher-code-andere-variablen-keine-funktion/1381736
Wokwi: https://wokwi.com/projects/431030224650716161
Handles several sensors (here four).
The minimum distance of all sensors is used to control the buzzer.
Each sensor has its own frequency.
Buzzer control is non-blocking.
ec2021
2025/05/15
*/
constexpr float microsecond2CM {0.0343};
struct dataS {
byte trigger;
byte echo;
long frequency;
};
// Definition of trigger, echo, frequency for each sensor
constexpr dataS sensorData[] = {
{ 3, 2, 400},
{10, 9, 600},
{ 8, 7, 800},
{ 6, 5, 1000}
};
constexpr int noOfSensors = sizeof(sensorData) / sizeof(sensorData[0]);
constexpr byte beepPin {11};
constexpr long beep_start {100};
constexpr long min_distance {5};
class sensorClass {
private:
byte trigger;
byte echo;
public:
long frequency;
void init(dataS s) {
trigger = s.trigger;
echo = s.echo;
frequency = s.frequency;
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
float getDistance() {
digitalWrite(trigger, LOW);
delayMicroseconds(5);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
long returnTime = pulseIn(echo, HIGH) / 2;
return (returnTime * microsecond2CM);
}
};
sensorClass sensor[noOfSensors];
void setup() {
for (int i = 0; i < noOfSensors; i++) {
sensor[i].init(sensorData[i]);
}
pinMode(beepPin, OUTPUT);
Serial.begin(115200);
}
void loop() {
float space = 9999;
long frequency = 2000;
for (auto s : sensor) {
float sp = s.getDistance();
if (sp < space) {
space = sp;
frequency = s.frequency;
}
}
handleDistance(space, frequency);
}
void handleDistance(float distance, long freq) {
static unsigned long lastChangeTime = 0;
static byte lastMode = 0;
static boolean buzzOff = true;
byte mode = 0;
if (distance < beep_start) {
mode = 1;
if (distance > min_distance) {
mode = 2;
}
}
switch (mode) {
case 0:
if (lastMode == 0) return;
noTone(beepPin);
break;
case 1:
if (lastMode == 1) return;
lastChangeTime = millis();
tone(beepPin, freq);
break;
case 2:
unsigned long interval = distance * 4 + 50;
if (!buzzOff) interval = 40;
if (millis() - lastChangeTime > interval) {
lastChangeTime = millis();
if (buzzOff) {
tone(beepPin, freq);
} else {
noTone(beepPin);
}
buzzOff = !buzzOff;
}
break;
}
lastMode = mode;
}