Vielen Dank! Ich werde das bei der Nächsten Möglichkeit testen...
Na dann: Auf guten Erfolg dabei!
zum Thema direkte Schallübertragung über z.B. den Kleber:
Der Sensor spinnt erst Sobald man die Hand über den Sensor hält. Wenn eine direkte Schallverbindung da wär ,würde der Sensor doch dauerspinnen ?
Ja, das sehe ich auch so. So hatte ich Deine Fehlerbeschreibung auch verstanden.
Also liegt entweder ein Echo-Problem vor: Schall wird zwischen Hand und Arduino mehrfach hin und her reflektiert. Und wenn Du den zweiten Sensor unmittelbar nach dem ersten Sensor triggerst, dann empfängt er möglicherweise nicht das Echo von seinem selbst getriggerten Signal, sondern ein späteres Mehrfach-Echo, das noch von der Triggerung des anderen Sensors herrührt.
Oder ein Problem mit der Auswertelogik in Deinem Sketch.
Oder beides zusammen.
Außerdem zeigt der Sensor anfangs sogar den korrekten abstand zur decke an.
Das ist gut! Bekommst Du das mit dem von mir geposteten Sketch auch hin?
Zeigen sich dann damit vernünftige Anzeigewerte?
Wenn ja, kannst Du zum nächsten Schritt übergehen: Eine Auswertung schreiben.
Im Prinzip musst Du für die beabsichtigten Schaltvorgänge die richtigen Muster in den gemessenen Distanzwerten und im zeitlichen Verlauf erkennen. Anbei eine erste ganz einfache Verarbeitung, die darauf basiert, dass der Abstand zur Decke deutlich über 100 cm beträgt und alle Handbewegungen über den Sensoren mit einem Abstand von weniger als 100 cm zu den Sensoren erfolgen.
Von der Logik her wird eine "status" Variable gesetzt, je nach erkannter Aktion:
1. Falls beide Sensoren mehr als 333 ms lang den Deckenabstand erkennen, wird die Auswertung zurückgesetzt
2. Wenn Sensor2 zuerst einen Abstand unter 100cm misst, wird eine Wischbewegung nach links erkannt
3. Wenn Sensor1 zuerst einen Abstand unter 100cm misst, wird eine Wischbewegung nach rechts erkannt
Das bedeutet: Eine komplette Wischbewegung muß innerhalb 333 ms abgeschlossen sein, sonst wird am Ende einer sehr langsam ausgeführten Wischbewegung fälschlicherweise eine Bewegung in Gegenrichtung erkannt. Das könnte man durch eine mehrstufige Mustererkennung verhindern, aber zunächst mal wollte ich die erste Auswertung simpel halten:
/*
Verkabelung von zwei HC-SR04 Ultraschall-Entfernungssensoren
VCC vom Sensor jeweils an Arduino 5v
GND vom Sensor an Arduino GND
beide Trigger Pins vom Sensor an Arduino Pin 7
Echo1 Pin vom Sensor an Arduino Pin 8
Echo2 Pin vom Sensor an Arduino Pin 9
*/
#define TRIGGERPIN 7 // beide Trigger-Pins verbunden
#define ECHOPIN1 8 // Echo Pin Sensor 1
#define ECHOPIN2 9 // Echo Pin Sensor 2
#define LEDPIN 13 // Onboard LED
#define V_SCHALL 34300L // Schallgeschwindigkeit in cm/s
#define MAXRANGE 200 // Maximale Entfernung in cm, über die nicht gemessen werden braucht
enum states {sDEFAULT,sLEFT, sRIGHT};
int state=sDEFAULT; // state enthält den aktuell ausgewerteten Status
int distance1, distance2; // Berechneter Abstand
void setup() {
Serial.begin (57600); // Baudrate des Seriellen Monitors
pinMode(TRIGGERPIN, OUTPUT);
pinMode(ECHOPIN1, INPUT);
pinMode(ECHOPIN2, INPUT);
pinMode(LEDPIN, OUTPUT); // LED, falls verwendet
Serial.println("Programm gestartet...");
}
void Eingabe()
{
unsigned long duration1=0; // Dauer bis zum Eintreffen des Echos auf Null setzen
unsigned long duration2=0; // Dauer bis zum Eintreffen des Echos auf Null setzen
distance1=MAXRANGE; // Annahme, dass wir ausser Reichweite sind
distance2=MAXRANGE; // Annahme, dass wir ausser Reichweite sind
digitalWrite(TRIGGERPIN, LOW); // Beide Sensoren mit demselben Pin triggern
delayMicroseconds(2);
digitalWrite(TRIGGERPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGERPIN, LOW);
unsigned long start=micros();
while ((digitalRead(ECHOPIN1)==LOW || digitalRead(ECHOPIN2)==LOW)&& micros()-start<1000);
if (micros()-start>=1000) // Falls ein Fehler beim Triggern vorkommen kann???
{
distance1=-1;
distance2=-1;
return;
}
do // Messschleife starten
{
if (duration1==0 && digitalRead(ECHOPIN1)==LOW) // Stop Messung Sensor1
{
duration1=micros()-start;
}
else if (duration2==0 && digitalRead(ECHOPIN2)==LOW) // Stop Messung Sensor 2
{
duration2=micros()-start;
}
else if (duration1!=0 && duration2!=0) break; // Beide Messungen beendet
if (micros()-start> 2*MAXRANGE*1000000L/V_SCHALL) break; // Timeout beim Messen
}
while (1);
// Abstand der Sensoren auf Basis der Schallgeschwindigkeit berechnen
if (duration1>0) distance1 = duration1*V_SCHALL/2000000L;
if (duration2>0) distance2 = duration2*V_SCHALL/2000000L;
}
void Verarbeitung()
{
static unsigned long timer;
if (distance1>100 && distance2>100)
{
if (millis()-timer>333) state=sDEFAULT;
}
else if (distance1>100 && distance2<=100)
{
if (state==sDEFAULT)
{
state=sLEFT;
timer=millis();
}
}
else if (distance1<=100 && distance2>100)
{
if (state==sDEFAULT)
{
state=sRIGHT;
timer=millis();
}
}
}
void Ausgabe()
{
Serial.print(distance1);
Serial.print('\t');
Serial.print(distance2);
Serial.print('\t');
switch (state)
{
case sLEFT : Serial.print("Left");break;
case sRIGHT: Serial.print("Right");break;
}
Serial.println();
}
void loop() {
unsigned long loopstart=micros(); // Zeit beim Start der loop merken
Eingabe();
Verarbeitung();
Ausgabe();
while(micros()-loopstart<20000); // mindestens 20 ms bis zur nächsten Messung warten
}
Im Prinzip könnte man diesen Code dann schon leicht so abändern, dass tatsächlicher links/rechts Schaltvorgänge ausgeführt werden.