INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit Bewegungsmelder und Helligkeitssensor
18.11.2015, 20:12
Beitrag #1
Problem mit Bewegungsmelder und Helligkeitssensor
Hallo zusammen,

ich komm mal wieder nicht weiter.
Im folgenden Sketch wird ein Bewegungsmelder und ein Helligkeitssensor abgefragt. Wird eine bestimmte Helligkeit unterschritten UND eine Bewegung erfasse, wir eine Aktion ausgeführt.
Das klappt soweit auch wunderbar.
Was jedoch nicht passt ist folgendes, wenn das Licht noch zu hell ist, jedoch eine Bewegung erfasst wird und nach der Bewegung das Licht dunkler wird, wird trotzdem die Aktion durchgeführt.
Irgendwie wird die Bewegung "gemerkt" und dann bei ensprechender Dunkelheit wieder drangedacht und die Aktion trotzdem durchgeführt.

Hm, ich hoffe das hat jetzt jemand verstanden, ist irgenwie schwierig zu erklären.

Was muss ich ändern damit das Problem nicht auftritt?

Code:
//VARS

//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 3;        


int ldr = A0; //Helligkeitssensor
int helligkeit = 700; //Helligkeit ab der das Programm aktiv wird
int sensorWert = 0;



//the time when the sensor outputs a low impulse
long unsigned int lowIn;        

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 7;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;


/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }

////////////////////////////
//LOOP
void loop()
{

  sensorWert = analogRead(ldr);


     if((digitalRead(pirPin) == HIGH) && (sensorWert < helligkeit))
     {
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow)
       {
        
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec");
         delay(50);
         }        
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW)
     {      
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime)
       {
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause,
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause)
       {  
        
          
           //makes sure this block of code is only executed again after
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 22:15
Beitrag #2
RE: Problem mit Bewegungsmelder und Helligkeitssensor
Warum baust du es in der Loop nicht etwa so auf?

Code:
void loop() {

  if(sensorWert < helligkeit) {
    if(digitalRead(pirPin) == HIGH) {
      //Hier deinen Code wenn Bewegung
    }
    else  {
      //Hier deinen Code wenn keine Bewegung
    }
  }
}

Dann wird die Bewegung nur ausgewertet, wenn die Helligkeit den nötigen Wert hat.

Dies ist nur Beispielcode.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 08:07 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2015 08:26 von gronph.)
Beitrag #3
RE: Problem mit Bewegungsmelder und Helligkeitssensor
Hallo,

das hatte ich schon probiert, führt zum selben Verhalten.
Ich bin jetzt aber einen Schritt weiter, ich weiß woher das kommt.

Der Bewegungsmelder geht natürlich auch auf "High" wenn er gar nicht abgefragt wird. In dieser Stellung bleibt er leider für eine gewisse Zeit.

Sollte sich in dieser Zeit das Licht soweit ändern das (sensorWert < helligkeit) ist wird natürlich richtiger weise eine Aktion ausgeführt.

Wie kann ich das umgehen?

Ich habe den Code nochmal angehängt an welcher Stelle ich eine Aktion ausführen möchte (da wird ein Relais geschalten)


Code:
//LOOP
void loop()
{

  sensorWert = analogRead(ldr);


     if((digitalRead(pirPin) == HIGH) && (sensorWert < helligkeit))
     {
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow)
       {
        
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec");
         delay(50);
         }

Hier Aktion ausführen

        
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW)
     {      
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime)
       {
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause,
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause)
       {  
        
          
           //makes sure this block of code is only executed again after
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 10:15 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2015 10:16 von hotsystems.)
Beitrag #4
RE: Problem mit Bewegungsmelder und Helligkeitssensor
Dieses Verhalten kannst du nur am Bewegungsmelder abstellen.
Der sollte nur einen kurzen Impuls rausgeben.
Andernfalls darfst du in deinem Sketch nur auf eine Flanke auswerten.

Was ist das für ein Bewegungsmelder? Bitte mal einen Link senden.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 11:18 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2015 12:37 von gronph.)
Beitrag #5
RE: Problem mit Bewegungsmelder und Helligkeitssensor
Hallo,

danke für deine Antwort.
Leider kann ich am Bewegungsmelder zwar die "High" Zeit einstellen, jedoch geht die nur auf ca 5 Sekunden runter und das ist noch zuviel.

Der Bewegungsmelder im folgenden Link ist das Modell:

http://funduino.de/index.php/3-programmi...ungsmelder

Und hier das Datenblatt:

https://www.mpja.com/download/31227sc.pdf

Was meinst du mit "nur eine Flanke auswertern"? Bzw., wie mache ich das?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 13:43 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2015 14:23 von Binatone.)
Beitrag #6
RE: Problem mit Bewegungsmelder und Helligkeitssensor
(19.11.2015 11:18)gronph schrieb:  Hallo,

danke für deine Antwort.
Leider kann ich am Bewegungsmelder zwar die "High" Zeit einstellen, jedoch geht die nur auf ca 5 Sekunden runter und das ist noch zuviel.

Der Bewegungsmelder im folgenden Link ist das Modell:

http://funduino.de/index.php/3-programmi...ungsmelder

Und hier das Datenblatt:

https://www.mpja.com/download/31227sc.pdf

Was meinst du mit "nur eine Flanke auswertern"? Bzw., wie mache ich das?

Flanke auswerten bedeutet, man fragt nur die Flanke von LOW nach HIGH ab.
Dann wird nur einmal registriert, wenn der Melder einschaltet, mehr nicht.
Dazu nimmt man eine Hilfsvariable und speichert am Programmende den Zustand des Ports in die Hilfsvariable.
Melder_alt: bool;
Sind im Programm Hilfsvariable und der Eingang unterschiedlich, hat der Melder geschaltet.
Ist der Zustand High, wurde eingeschaltet.

Binatone

Edit:
Von LOW nach HIGH nennt man positive Flanke
Von HIGH nach LOW nennt man negative Flanke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 13:55 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2015 15:07 von hotsystems.)
Beitrag #7
RE: Problem mit Bewegungsmelder und Helligkeitssensor
Ein simple Beschreibung wie du Flanken auswertest, findest du hier:
https://books.google.de/books?id=LiGw4Ih...en&f=false

Du kannst es auch Hardwaremäßig lösen, indem du einen Kondensator (100nF) vom Ausgang des Bewegungsmelders zum Eingang des Arduinos legst. Und einen Widerstand 100 kOhm gegen Plus oder GND, je nachdem welche Flanke du abfragst. Ist aber nur als Notlösung zu sehen.

Edit:

Wichtig ist, du musst den Bewegungsmelder auf "Single Trigger" stellen.

Ich habe mir das Datenblatt nochmal angesehen.
Da steht:
Zitat:Trigger L Trigger can not be repeatedt / H repeated Trigger.

Du solltest in deinem Code auf LOW abfragen und wie ich oben schon geschrieben habe, auf "Single Trigger" stellen. dann sollte es funktionieren.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.11.2015, 20:44
Beitrag #8
RE: Problem mit Bewegungsmelder und Helligkeitssensor
(19.11.2015 13:55)hotsystems schrieb:  Du solltest in deinem Code auf LOW abfragen und wie ich oben schon geschrieben habe, auf "Single Trigger" stellen. dann sollte es funktionieren.

Ich brauche aber den repeated Trigger Modus da ich nachtriggern muß Wink

ich denke ich werde mal was mit den Interrupts versuchen:

http://www.ictcool.com/2013/08/08/arduin...ir-sensor/

ich denke das ist was Ihr meint mit den Flanken auswerten, oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Problem mit SD Card Library BennIY 4 186 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 210 22.08.2016 19:42
Letzter Beitrag: Eichner
  4x16 Tastermatrix Problem Michel 16 832 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 453 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 593 13.06.2016 21:14
Letzter Beitrag: torsten_156
  ESP8266_01 flashen - Problem torsten_156 12 1.040 30.05.2016 20:12
Letzter Beitrag: torsten_156
  Hardwareserial/Softserial: Problem mit Superklasse tuxedo0801 10 475 19.05.2016 12:25
Letzter Beitrag: amithlon
  ESP8266 HTML Problem arduino_weatherstation 1 491 25.04.2016 21:52
Letzter Beitrag: rkuehle
  Problem mit OLED 0.96" Display torsten_156 3 534 03.04.2016 15:10
Letzter Beitrag: hotsystems
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 486 01.04.2016 05:49
Letzter Beitrag: MartinK

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste