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.

Gruß Dieter

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.

Gruß Dieter

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.

Gruß Dieter

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 der Textauswertung Franz54 13 338 15.04.2018 18:17
Letzter Beitrag: Tommy56
  Problem mit RIFD UID ParadoxDev 6 246 27.03.2018 12:04
Letzter Beitrag: ParadoxDev
  Problem mit OLED 0.96" Display torsten_156 5 1.729 07.03.2018 23:27
Letzter Beitrag: Tommy56
  Ucglib Library Problem Bully 26 949 05.03.2018 18:47
Letzter Beitrag: Tommy56
  Problem mit Wire.available() abfrage avoid 1 335 11.01.2018 13:40
Letzter Beitrag: Tommy56
  SerialComInstruments 4 Problem Darstellung Nextero 35 1.484 15.12.2017 18:51
Letzter Beitrag: ElEspanol
  Problem mit Nema17 und A4988 Philthy 6 472 08.12.2017 12:35
Letzter Beitrag: Tommy56
  Arduino -> Controllino [Problem gelöst] Cyrilsneer 17 1.353 27.11.2017 18:49
Letzter Beitrag: Franz54
Question Problem beim seriellen Einlesen von RFID-Reader Bezel 5 618 05.11.2017 22:37
Letzter Beitrag: Tommy56
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 841 22.08.2017 15:17
Letzter Beitrag: Tommy56

Gehe zu:


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