delay Alternative gesucht

Hallo,

ich möchte mir eine kleine Alarmanlage bauen. Um zu vermeiden, dass der Alarm ausgelöst wird, wenn eine Spinne über den Bewegungssensor läuft verwende ich zwei Bewegungssensoren.

Für den Fall, dass ein Bewegungsmelder etwas später auslöst will ich das eine Variable 2 Sekunden lang auf 1 gesetzt wird, wenn der Bewegungsmelder etwas sieht und dann wieder auf 0.

Für sowas kenne ich nur die delay Funktion, die mir aber nichts nützt, da sie alles stoppt und so der andere Bewegungsmelder nicht mehr abgefragt wird.

Ich bin noch ein ziemlicher Anfänger, ich würde mich über Hilfe freuen!

Hier ist der Code

int sensor1=2;
int sensor2=3;
int movement1=0;
int movement2=0;

void setup()
{
Serial.begin(9600); 
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
}

void loop()
{
if (digitalRead(sensor1) == HIGH)
{
  movement1=1;
  delay(5000);
  movement1=0;    
}


if (digitalRead(sensor2) == HIGH)
{
  movement2=1;
  delay(5000);
  movement2=0;
}
  

if ((movement1 == 1) && (movement2 == 1))
{
Serial.print("Alarm");
}

}

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

https://forum.arduino.cc/index.php? topic=328241.0

Ich weiß zwar nicht wie groß die Spinnen bei dir so sind, aber wenn du die beiden Sensoren mit 4-5cm Abstand übereinander hängst sollten keine Insekten es schaffen beide gleichzeitig auszulösen.

Dann sieh dir mal BlinkWithoutDelays an.

Das findest du hier: BlinkWithoutDelays

Das haut irgendwie nicht hin... Sobald ein Bewegungssensor ausgelöst wurde schreibt er unendlich lang Alarm.

int sensor1=2;
int sensor2=3;
int movement1=0;
int movement2=0;

unsigned long previousMillis = 0;  
const long interval = 2000;  

void setup()
{
Serial.begin(9600); 
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
}

void loop()
{


  
if (digitalRead(sensor1) == HIGH)
{
  unsigned long currentMillis = millis();
  movement1=1;
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    movement1=0;
  }
}


if (digitalRead(sensor2) == HIGH)
{
  unsigned long currentMillis2 = millis();
  movement2=1;
  if (currentMillis2 - previousMillis >= interval) {
    movement2=0;
    previousMillis = currentMillis2;
  }
}
  

if ((movement1 == 1) && (movement2 == 1))
{
Serial.print("Alarm");
Serial.print("\n");
}

}

Ich habe mir mal erlaubt, Deinen Code optisch zu pimpen. So passt er zumindest bei mir komplett auf den Schirm.

Gruß

Gregor

int sensor1=2;
int sensor2=3;
int movement1=0;
int movement2=0;

unsigned long previousMillis = 0;  
const long interval = 2000;  

void setup()
{
  Serial.begin(9600); 
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
}

void loop()
{
  if (digitalRead(sensor1) == HIGH)
  {
    unsigned long currentMillis = millis();
    movement1=1;
    if (currentMillis - previousMillis >= interval)
    {
      previousMillis = currentMillis;
      movement1=0;
    }
  }


  if (digitalRead(sensor2) == HIGH)
  {
    unsigned long currentMillis2 = millis();
    movement2=1;
    if (currentMillis2 - previousMillis >= interval)
    {
      movement2=0;
      previousMillis = currentMillis2;
    }
  }
  

  if ((movement1 == 1) && (movement2 == 1))
  {
    Serial.print("Alarm");
    Serial.print("\n");
  }
}

Anstatt

 Serial.print("Alarm");
    Serial.print("\n");

kannst du auch einfach schreiben

 Serial.println("Alarm");
  if (digitalRead(sensor1) == HIGH)
  {
    unsigned long currentMillis = millis();
    movement1=1;
    }
 if (movement1==1&&(currentMillis - previousMillis >= interval))
    {
      previousMillis = currentMillis;
      movement1=0;
    }

Du musst die zweite If-Verschachtelung außerhalb der ersten packen, sonst kommt er nicht in die zweite If weil der Sensor1 dann 0 ist und der durch die erste if diesen Part dann "überspringt"

Gruß DerDani

Vielen Dank!

Es funktioniert jetzt!

int sensor1=2;
int sensor2=3;
int movement1=0;
int movement2=0;

unsigned long previousMillis = 0;  
const long interval = 2000;  

void setup()
{
  Serial.begin(9600); 
  pinMode(sensor1, INPUT); 
  pinMode(sensor2, INPUT);
}

void loop()
{
  
  if (digitalRead(sensor1) == HIGH)
  {  
    movement1=1;
  }  
  
  unsigned long currentMillis = millis();
  if (movement1==1&&(currentMillis - previousMillis >= interval))
  {
      previousMillis = currentMillis;
      movement1=0;
  }


  if (digitalRead(sensor2) == HIGH)
  {
      movement2=1;
  } 
  unsigned long currentMillis2 = millis();
  if (movement2==1&&(currentMillis2 - previousMillis >= interval))
  {
      movement2=0;
      previousMillis = currentMillis2;
  }

  
 if ((movement1 == 1) && (movement2 == 1))
 {
     Serial.println("Alarm");
 }
}

Grüße