Hallo,
ich habe hier einen Code für ein "Abstandswarnsystem".
#include <Average.h>
#include <Bounce.h>
int pingPin = 13;
int dataPin = 12;
int button = 2;
int zustand_button;
int val_button;
Bounce button_Bouncer = Bounce(button,5 ); // 5 ms Bouncing für "Knopf_A"
int ledPin = 4;
int piezo = 8;
int array[9] = {0,0,0,0,0,0,0,0,0}; // Array zur Speicherung mehrerer Abstandswerte um die Genauigkeit zu erhöhen
int average = 0;
int averageb = 0;
int min = 0;
int max = 0;
byte fall = 2; // Fallunterscheidung
unsigned long duration; // Ermitteln der Variable "Länge der Pingrückmeldung"
unsigned long cm; // Ermitteln der Variable "Abstand in cm"
/**************************************************************************************************************************************************************************************************************************************************************/
void setup(){
pinMode(pingPin, OUTPUT);
pinMode(dataPin, INPUT);
pinMode(button, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin,LOW);
pinMode(piezo, OUTPUT);
Serial.begin(9600);
digitalWrite(pingPin, LOW);
}
/**************************************************************************************************************************************************************************************************************************************************************/
void loop() {
switch (fall) {
case 1:
button_Bouncer.update ( );
val_button = button_Bouncer.read();
if (val_button != zustand_button && val_button == HIGH) {
fall=2;
}
break;
case 2:
do {
for (byte x=0; x<9; x++) {
digitalWrite(pingPin, HIGH); // Ping senden..
delayMicroseconds(10); // ..von 10ms Dauer..
digitalWrite(pingPin, LOW); // ..und den Ausgang wieder schließen
duration = pulseIn(dataPin, HIGH); // Länge des Signals am "dataPin" abfragen
cm = microsecondsToCentimeters(duration); // Abstand über die for-Schleife ins Array eintragen
delay(58);
array[x] = cm;
}
average = mean(array,9);
min = minimum(array,9);
max = maximum(array,9);
} while (min<1 || max>3000 || max>average+1 || min<average-1);
/* Serial.print("average: ");
Serial.println(average);*/
digitalWrite(ledPin,HIGH);
fall=3;
break;
case 3:
averageb=average;
do {
for (byte x=0; x<9; x++) {
digitalWrite(pingPin, HIGH); // Ping senden..
delayMicroseconds(10); // ..von 10ms Dauer..
digitalWrite(pingPin, LOW); // ..und den Ausgang wieder schließen
duration = pulseIn(dataPin, HIGH); // Länge des Signals am "dataPin" abfragen
cm = microsecondsToCentimeters(duration); // Abstand über die for-Schleife ins Array eintragen
delay(40);
if(cm>3400) {
cm=average;
}
array[x] = cm;
}
min = minimum(array,9);
max = maximum(array,9);
averageb = mean(array,9);
} while (averageb< average+2 & averageb> average-2);
digitalWrite(ledPin,LOW);
tone(piezo, 1400, 50);
delay(50);
tone(piezo, 700, 40);
delay(40);
digitalWrite(ledPin,LOW);
tone(piezo, 2800, 30);
/* Serial.println(array[0]);
Serial.println(array[1]);
Serial.println(array[2]);
Serial.println(array[3]);
Serial.println(array[4]);
Serial.println(array[5]);
Serial.println(array[6]);
Serial.println(array[7]);
Serial.println(array[8]);*/
fall=2;
break;
}
}
unsigned long microsecondsToCentimeters(unsigned long microseconds){ // The speed of sound is 340 m/s or 29 microseconds per centimeter. The ping travels out and back, so to find the distance of the object we take half of the distance travelled.
return microseconds / 29 / 2;
}
Ich würde gerne die Abstandsmessung zu jedem Zeitpunkt per Taster ein- und ausschalten können.
Wie macht man das denn?
Versuche mit Interrupts waren sehr unbefriedigend, da die Unterbrechungen dann teilweise nicht bei Tastendruck erfolgen, sondern der Code zunächst mal weiter abgearbeitet wird.
Gruß Chris