Pages: 1 ... 3 4 [5]   Go Down
Author Topic: Lautstärke steuern per Ultraschall  (Read 2357 times)
0 Members and 1 Guest are viewing this topic.
Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok die Werte sehen realistisch aus....ich probiere es einzubauen

Ich muss mich gerade selbst mal loben, wegen meiner genialen Idee, wie die beiden Sensoren gemeinsam getriggert und getrennt ausgewertet werden können.

OK, dann bekommst Du jetzt fünfzig mal pro Sekunde einwandfreie Entfernungsmesswerte beider Sensoren. Das ist mehr als bisher und auch bereits mehr als die halbe Miete.

Nun müßtest Du im zeitlichen Verlauf der Signale die Muster erkennen, für die von Dir gewünschten Funktionen:
- drüberwischen von links nach rechts ==> Umschalten Rechts
- drüberwischen von rechts nach links ==> Umschalten Links
- drüberhalten und Hand hoch und runter bewegen ==> Lautstärke ändern

Immer dran denken: Du darfst KEIN DELAY verwenden, sonst kannst Du nicht mehr die fünfzig Messungen pro Sekunde ausführen. Du mußt rein aufgrund des Timings und der Messwerte den Status so auswerten, dass Du die gewünschten Informationen herausbekommst und dann damit die Hardware steuern kannst.

Sag Bescheid, wenn es dabei Probleme bei Dir gibt, dann komplettiere ich Dir auch noch die Auswertelogik!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Du darfst KEIN DELAY verwenden, sonst kannst Du nicht mehr die fünfzig Messungen pro Sekunde ausführen. Du mußt rein aufgrund des Timings und der Messwerte den Status so auswerten, dass Du die gewünschten Informationen herausbekommst und dann damit die Hardware steuern kannst.

Heißt das dass ich es mit z.b.
Code:
millis()
machen kann?
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Heißt das dass ich es mit z.b.
Code:
millis()
machen kann?

Ja, mit millis() und Statusvariablen, die sich je nach Messwerten und Timing ändern.
Es kommt aber auf eine einwandfreie Logik bei den Statusübergängen an, und auf ein vernünftiges Timing beim Erkennen von Statusübergängen.

Die Statusübergänge beim Drüberwischen wären:
- beide Sensoren zeigen >100cm
- ein Sensor springt auf Werte <100cm
- beide Sensoren zeigen Werte <100cm
- der Sensor, der zuerst <100cm anzeigte, zeigt wieder >100cm an
- beide Sensoren zeigen >100cm

Die Statusübergänge bei der Lautstärkeregelung wären:
- beide Sensoren zeigen >100cm
- ein Sensor springt auf Werte <100cm
- beide Sensoren zeigen Werte <100cm
- einer der beiden Sensoren zeigt wieder >100cm an
- beide Sensoren zeigen >100cm

Tricky wird das ganze dadurch, dass die drei ersten Zustände identisch sind, egal ob gewischt oder die Lautstärke geändert wird und genau der dritte Zustand "beide Sensoren zeigen Werte <100cm" ist der Knackpunkt.

Hier muß das Timing entscheiden: Wenn beide Sensoren nur sehr kurzfristig Werte <100 cm anzeigen, dann ist von einer Wischbewegung auszugehen. Und wenn beide Sensoren für längere Zeit Werte <100cm anzeigen, dann kann es keine Wischbewegung sein, also muß dann die Lautstärkeregelung anspringen und der gemessene Abstand regelt die Lautstärke.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Diesen teil habe ich ja schon in meinem Alten Code fertig gehabt...dort habe ich einfach gesagt dass die Wischbewegung erst in einer Höhe X auch als diese angenommen wird und darunter als Lautstärke regelung smiley-wink
Code:
 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
 
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
   
   
 
 
    // links nach rechts
  if (sensor2hand == true && wert1 == false ){
      previousmillis2=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert1 = true;

      }
     
  if ( millis() > previousmillis2 + interval + 2 ){
    wert1 = false;
    }
   
  if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis5 = millis();
         voraussetzung1 = true;
         previousmillis4 = millis();
         }
  if ( millis() >  previousmillis4 + interval2 && voraussetzung1 == true){
     voraussetzung1 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == true && sensor2hand == false && voraussetzung1 == true){
           
           voraussetzung2 = true;
           previousmillis3 = millis();
           }
   if ( millis() >  previousmillis3 + interval2 && voraussetzung2 == true){
     voraussetzung2 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && next == false ) {
            next = true;
            voraussetzung2 = false;
            voraussetzung1 = false;
}
 
 
 //rechts nach links
 if (sensor1hand == true && wert2 == false){
      previousmillis6=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert2 = true;

      }
     
  if ( millis() > previousmillis6 + interval + 2 ){
    wert2 = false;
    }
   
  if (millis() < previousmillis6 + interval && sensor2hand == true) {
         previousmillis7 = millis();
         voraussetzung3 = true;
         previousmillis8 = millis();
         }
  if ( millis() >  previousmillis8 + interval2 && voraussetzung3 == true){
     voraussetzung3 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == true && sensor1hand == false && voraussetzung3 == true){
           
           voraussetzung4 = true;
           previousmillis9 = millis();
           }
   if ( millis() >  previousmillis9 + interval2 && voraussetzung4 == true){
     voraussetzung4 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == false && sensor1hand == false && voraussetzung4 == true && next == false ) {
            last = true;
            voraussetzung4 = false;
            voraussetzung3 = false;
}
 }
 
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So....ich habe es nun mal mit dem Rest zusammen gewürfelt smiley-wink
Hier das (hoffentlich) finale Ergebnis
Code:
/*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
          Relais SIG on digital pin 9
          Poti SIG on digital pin 10
        */
#include <SPI.h>      
#include <Wire.h> // DigitalPoti        
const int ug = 10; // UNTERGRENZE in cm
const int og = 30; // OBERGRENZE in cm
const int ugog = og-ug;
int ss = 10;
unsigned long interval = 1000;
unsigned long interval2 = 1000;
unsigned long intervalvalue = 1000;
unsigned long intervalping = 15;
unsigned long intervalping2 = 15;
unsigned long previousmillis1 = 0;
unsigned long previousmillis2 = 0;
unsigned long previousmillis3 = 0;
unsigned long previousmillis4 = 0;
unsigned long previousmillis5 = 0;
unsigned long previousmillis6 = 0;
unsigned long previousmillis7 = 0;
unsigned long previousmillis8 = 0;
unsigned long previousmillis9 = 0;
unsigned long previousmillis10 = 0;
unsigned long previousmillis11 = 0;
unsigned long previousmillisvalue = 0;
unsigned long previousmillisping1 = 15;
unsigned long previousmillisping2 = 15;
#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 6     // 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
const int relais = 9;
int protzentsensor = 100;
int protzentsensor1 = 100;
int protzentsensor2 = 100;
int schrittepoti = 0;
boolean sensor1hand = false;
boolean sensor2hand = false;
boolean pause = false;
boolean pause2 = false;
boolean play = false;
boolean play2 = false;
boolean next = false;
boolean last = false;
boolean isplaying = false;
boolean isplaying2 = false;
boolean voraussetzung1 = false;
boolean voraussetzung2 = false;
boolean voraussetzung3 = false;
boolean voraussetzung4 = false;
boolean start1 = false;
boolean wert1 = false;
boolean wert2 = false;
int maxhoehe;
int maxhoehe2;
int value ; //DigitalPoti
int value2 ;
int valuezwischen;
int cm, cm2;
void setup() {
 
 Serial.begin (57600);
pinMode(relais,OUTPUT);
pinMode(ss, OUTPUT);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
pinMode(TRIGGERPIN, OUTPUT);
pinMode(ECHOPIN1, INPUT);
pinMode(ECHOPIN2, INPUT);
pinMode(LEDPIN, OUTPUT); // LED, falls verwendet
previousmillisping1 = millis();
previousmillisping2 = millis();
previousmillisvalue = millis();
maxhoehe = 60;
maxhoehe2 = 60;

}

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
  cm=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  cm2=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???
  {
    cm=-1;
    cm2=-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) cm = duration1*V_SCHALL/2000000L;
 if (duration2>0) cm2 = duration2*V_SCHALL/2000000L;
 Serial.println(cm):
  Serial.println(cm2):

}





void Lautstaerke()
  {
   if ( cm > ug && cm < og ){
     int x1 = cm-ug;
     protzentsensor = 100/ugog*x1;  
    
     
  }
    if ( cm2 > ug && cm2 < og ){
      int x2 = cm2-ug;
      protzentsensor = 100/ugog*x2;   
    
      }
   if ( protzentsensor < 101){
     valuezwischen = 2.55*protzentsensor;
     delay(2);
   if ( millis() > previousmillisvalue + intervalvalue){
    value2 = valuezwischen;
    previousmillisvalue = millis();
    }
   
    if (valuezwischen < value2){
   value = valuezwischen + 1;
  } 
     if (valuezwischen > value2){
   value = valuezwischen - 1;
  } 
     
      digitalWrite(ss, LOW);
  SPI.transfer(0);
  SPI.transfer(value);
  digitalWrite(ss, HIGH);
  delay(10);
      digitalWrite(ss, LOW);
  SPI.transfer(2);
  SPI.transfer(value);
  digitalWrite(ss, HIGH);
  delay(10);
  }

     }
     

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muss es 2 Teilig posten da es zu groß ist...
Code:
   void Handysteuerung()
   {
  if (cm < ug && isplaying == true){
    pause = true;
   }
    if (cm2 < ug && isplaying2 == true){
    pause2 = true;
   }
  if (cm2 > ug && isplaying2 == false){
    play2 = true;
   }
     if (cm > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   delay(100);
   }
    if (play == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   
   }
   if (pause2 == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause2 = false;
   isplaying2 = false;
   delay(100);
   }
    if (play2 == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play2 = false;
   isplaying2 = true;
  

   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(200);
   next = false;
   delay(600);

  }
 
  if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(200);
   last = false;
   delay(600);
   }
    


 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
  
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
    
   
  
  
    // links nach rechts
  if (sensor2hand == true && wert1 == false ){
      previousmillis2=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert1 = true;

      }
      
  if ( millis() > previousmillis2 + interval + 2 ){
    wert1 = false;
    }
    
  if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis5 = millis();
         voraussetzung1 = true;
         previousmillis4 = millis();
         }
  if ( millis() >  previousmillis4 + interval2 && voraussetzung1 == true){
     voraussetzung1 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == true && sensor2hand == false && voraussetzung1 == true){
           
           voraussetzung2 = true;
           previousmillis3 = millis();
           }
   if ( millis() >  previousmillis3 + interval2 && voraussetzung2 == true){
     voraussetzung2 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && next == false ) {
            next = true;
            voraussetzung2 = false;
            voraussetzung1 = false;
}
 
 
 //rechts nach links
 if (sensor1hand == true && wert2 == false){
      previousmillis6=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert2 = true;

      }
      
  if ( millis() > previousmillis6 + interval + 2 ){
    wert2 = false;
    }
    
  if (millis() < previousmillis6 + interval && sensor2hand == true) {
         previousmillis7 = millis();
         voraussetzung3 = true;
         previousmillis8 = millis();
         }
  if ( millis() >  previousmillis8 + interval2 && voraussetzung3 == true){
     voraussetzung3 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == true && sensor1hand == false && voraussetzung3 == true){
           
           voraussetzung4 = true;
           previousmillis9 = millis();
           }
   if ( millis() >  previousmillis9 + interval2 && voraussetzung4 == true){
     voraussetzung4 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == false && sensor1hand == false && voraussetzung4 == true && next == false ) {
            last = true;
            voraussetzung4 = false;
            voraussetzung3 = false;
}
 }
 

void loop()
{
unsigned long loopstart=micros();
Eingabe();
Lautstaerke()  ;
Handysteuerung() ;
while(micros()-loopstart<20000);
}
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muss es 2 Teilig posten da es zu groß ist...

Eigentlich nicht, denn Du kannst längere Dateien immer als "Dateianhang" zu einem Posting posten statt direkt im Text. Um Dateianhänge an ein Posting dranzuhängen, beim Schreiben der Message auf "Additional Options..." klicken.

Meinen Glückwunsch, wenn es nun wunschgemäß funktioniert, mit Vor- und Rückwärtsschalten und Lautstärkeregelung!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Meinen Glückwunsch, wenn es nun wunschgemäß funktioniert, mit Vor- und Rückwärtsschalten und Lautstärkeregelung!

Leider noch nicht ganz... ich probiere weiter
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leider noch nicht ganz... ich probiere weiter

Dann habe ich wohl etwas beim "finalen Ergebnis" falsch verstanden.

Ich habe jetzt heute nochmal meine beiden Ultraschallsensoren angeschlossen und eine Schaltlogik gebastelt.
Code:
/*
 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 6
 Echo2 Pin vom Sensor an Arduino Pin 8
 */

#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 6      // Echo Pin Sensor 1
#define ECHOPIN2 8      // 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, sWIPELEFT, sWIPERIGHT, sLOUD};
int state=sDEFAULT;  // state enthält den aktuell ausgewerteten Status
int distance1, distance2;  // Berechneter Abstand
int loudValueRaw, loudValue; // berechnete Lautstärke

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) // Sensor-2 misst zuerst kleinere Werte
  {
    if (state==sDEFAULT)
    {
      state=sLEFT;
      timer=millis();
    }
  }
  else if (distance2>100 && distance1<=100) // Sensor-1 misst zuerst kleinere Werte
  {
    if (state==sDEFAULT)
    {
      state=sRIGHT;
      timer=millis();
    }
  }
  else if (distance1>100 && distance2>100)
  {
    if (state==sRIGHT) state=sWIPERIGHT;
    else if (state==sLEFT) state=sWIPELEFT;
    else if (millis()-timer>333) state=sDEFAULT;
  }
  else if (distance1<=100 && distance2<=100 && millis()-timer>1000)
  {
     state=sLOUD;
     // Der kleinere gemessene Abstand bestimmt die Lautstärke
     if (distance1<distance2) loudValueRaw=distance1;
     else loudValueRaw=distance2;
     // den Wert aktualisieren mit exponentieller Glättung
     loudValue=(loudValue*7+map(loudValueRaw,10,74,0,32))/8; // Wert von 10...74cm mappen auf 0..32 Lautstärkewert
  }
}


void Ausgabe()
{
  Serial.print(distance1);
  Serial.print('\t');
  Serial.print(distance2);
  Serial.print('\t');
  switch (state)
  {
    case sLEFT     : Serial.print("Left");break;
    case sWIPELEFT : Serial.print("Wipe LEFT");break;
    case sRIGHT    : Serial.print("Right");break;
    case sWIPERIGHT: Serial.print("Wipe RIGHT");break;
    case sLOUD     : Serial.print("Loud ");Serial.print(loudValue);break;
  }
  Serial.println();
}

void Schalten()
{
  static unsigned int lastState;
  static unsigned int lastLoud;
  if (state==sWIPELEFT && lastState!=sWIPELEFT)
  {
    Serial.println("Wischen LINKS");
  }
  else if (state==sWIPERIGHT && lastState!=sWIPERIGHT)
  {
    Serial.println("Wischen RECHTS");
  }
  else if (state==sLOUD && loudValue!=lastLoud)
  {
    lastLoud=loudValue;
    Serial.print("Einstellung aendern auf Lautstaerke ");
    Serial.println(loudValue);
  }
  lastState=state;
}

void loop() {
  unsigned long loopstart=micros(); // Zeit beim Start der loop merken
  Eingabe();
  Verarbeitung();
//  Ausgabe();
  Schalten();
  while(micros()-loopstart<20000); // mindestens 20 ms bis zur nächsten Messung warten
}

Bedienung:
Bei einer schnellen Bewegung über den Sensoren entscheidet der zuerst einen Wert unter 100 messende Sensor darüber, ob "Wischen links" oder "Wischen rechts" erkannt wird. Die Wischbewegung kann im Prinzip in einer beliebigen Höhe bis maximal 100cm über den Sensoren erfolgen, sie muß jedoch so schnell ausgeführt werden, dass die Wischbewegung spätestens 1 Sekunde danach beendet ist und beide Sensoren wieder einen Abstand von >100cm messen. Um eine Wischbewegung zu erkennen, müssen nicht einmal beide Sensoren die Hand erkennen, es reicht aus, wenn eine Hand im Erfassungsbereich von einem Sensor erkannt und wieder zurückgezogen wird. Natürlich kann man die Hand aber auch komplett über beide Sensoren hinweg führen.

Wenn auf beiden Sensoren mindestens 1 Sekunde lang ein Abstand unter 100cm gemessen wird, springt die Lautstärkeregelung an. Die Lautstärke wird von einem Abstand von 10cm bis 74cm auf eine Lautstärkenskala von 0 bis 32 gemappt, mittels des Codes
map(loudValueRaw,10,74,0,32)
Falls sich die Regelung in einem anderen Abstandsbereich abspielen sollen, die 10 und 74 entsprechend anpassen.
Falls die Lautstärkeskala anders als von 0 bis 32 laufen soll, die 0 und die 32 entsprechend anpassen.

Damit sich bei bei der hohen Messrate die Lautstärke nicht schnell und sprunghaft ändert, sondern eher langsam und gleitend, wird der Wert noch einer exponentiellen Glättung unterworfen.

Bitte nicht wundern, wenn Du die Hand zum Lautstärkeregeln über den Sensor hältst und scheinbar kein Lautstärkewert gesetzt wird: Überfüssige Einstellvorgänge sind wegoptimiert, d.h. nur wenn die Lautstärke sich tatsächlich ändert, wird auch eine Lautstärkeänderung geschaltet.

Die ursprüngliche Funktion mit den vielen Debug-Daten habe ich auskommentiert, wenn Du diese Daten wieder sehen möchtest, dann die Kommentarstriche vor der Zeile "//  Ausgabe();" entfernen

Die eigentlichen Steuer- und Schaltvorgänge müßtest Du in die Funktion "Schalten()" einbauen, dort wo jetzt die Texte ausgegeben werden.

Um die Messrate konstant hoch zu halten, wäre es natürlich sinnvoll, auch beim Steuern und Schalten auf Blockierungen des Programms mit "delay" möglichst zu verzichten.
Logged

Pages: 1 ... 3 4 [5]   Go Up
Jump to: