Bewegungsmelder ausgangs Signal zu lange

Dann habe ich wohl irgendwas nicht verstanden.

Aber wenn der TO glücklich ist, bin ich es auch :upside_down_face:

Manchmal ist es so, man muss öfters Zwischen den Zeilen lesen. :wink:

nur noch ne kleine Frage bei meinem Arduino opla löst der bewegungsmelder wenn ich ihn an schlisse ständig aus was kann ich da machen

"Arduino Opla" ist ein Kit. Der Arduino darin ist ein MKR WiFi1010.

  • Zeigen, wie es verkabelt ist (Foto)
  • Zeigen wie das Programm aussieht (Sketch in </>)
  • Finger stillhalten - Bewegungsmelder haben die Eigenart auszulösen, wenn sich in der Umgebung was bewegt :wink:

Die Shift-Taste an Deiner Tastatur scheint einen Wackelkontakt zu haben; die Satzzeichen : , ? . sind kaputt. Solltest Du mal überprüfen und ggf. austauschen.

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/1d0c6f29-b06a-4d92-b346-aee2792e364a 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  String message_update;
  bool light_alarm;
  bool light_event;
  bool movement_alarm;
  bool movement_event;
  bool shake_alarm;
  bool shake_event;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"
#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;

int pir = A5;
int pirState = 0;

int light = 0;

String light_alarm_state = "";
String movement_alarm_state = "";
String shake_alarm_state = "";

float Gx, Gy, Gz;

uint32_t redColor = carrier.leds.Color( 0, 255, 0);
uint32_t noColor = carrier.leds.Color( 0, 0, 0);

void setup() {
  // Initialize serial and wait for port to open:  Serial.begin(9600);
    Serial.begin(9600);
 // while (!Serial);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  
 //Wait to get cloud connection to init the carrier
  while (ArduinoCloud.connected() != 1) {
    ArduinoCloud.update();
    delay(500);
  }

  delay(500);
  CARRIER_CASE = false;
  carrier.begin();
  carrier.display.setRotation(0);
  delay(1500);
  pinMode(A5, INPUT);

}

void loop() {
  ArduinoCloud.update();
  // Your code here 
   pirState = digitalRead(pir);

  while (!carrier.Light.colorAvailable()) {
    delay(5);
  }
  int none; //not gonna be used
  carrier.Light.readColor(none, none, none, light);

  // read the IMU values
  carrier.IMUmodule.readGyroscope(Gx, Gy, Gz);

  //Uncomment this code to see values in Serial Monitor
  /*
    Serial.print("Gyroscope: ");
    Serial.print("\tX: ");
    Serial.print(Gx);
    Serial.print("\tY: ");
    Serial.print(Gy);
    Serial.print("\tZ: ");
    Serial.println(Gz);

    Serial.print("Light: ");
    Serial.println(light);

    Serial.print("PIR State: ");
    Serial.println(pirState);

    delay(200);
  */

  //light alarm, can be activated from cloud
  if (light_alarm == true) {

    if (light > 200) {
      light_event = true;
    }


    if (light_event == true) {
      message_update = "Light alarm breached!";
      alarm();
    }
  }

  //movement alarm, can be activated from cloud
  if (movement_alarm == true) {
    if (pirState == LOW) {
      movement_event = true;
    }

    if (movement_event == true) {
      message_update = "Movement alarm breached!";
      alarm();
    }
  }

  //shake alarm, can be activated from cloud
  if (shake_alarm == true) {
    if (Gy > 100 || Gy < -100) {
      shake_event = true;
    }

    if (shake_event == true) {
      message_update = "Shake alarm breached!";
      alarm();
    }
  }
  delay(100);

}

// the alarm() function blinks the RGB LEDs and turns the buzzer on and off

void alarm() {
  carrier.leds.fill(redColor, 0, 5);
  carrier.leds.show();
  carrier.Buzzer.sound(500);
  delay(500);

  carrier.leds.fill(noColor, 0, 5);
  carrier.leds.show();
  carrier.Buzzer.noSound();
  delay(500);
}

// the updateScreen() function updates the screen whenever an alarm has been activated from the cloud

void updateScreen() {
  carrier.display.fillScreen(ST77XX_BLACK);
  carrier.display.setTextColor(ST77XX_WHITE);
  carrier.display.setTextSize(2);

  carrier.display.setCursor(25, 60);
  carrier.display.print(light_alarm_state);
  carrier.display.setCursor(10, 100);
  carrier.display.print(movement_alarm_state);
  carrier.display.setCursor(30, 140);
  carrier.display.print(shake_alarm_state);
}

void onLightAlarmChange() {
  // Do something
  if (light_alarm == true) {
    light_alarm_state = "LIGHT ALARM: ON";
  } else {
    light_alarm_state = "LIGHT ALARM: OFF";
  }

  updateScreen();
}

void onShakeAlarmChange() {
  // Do something
  if (shake_alarm == true) {
    shake_alarm_state = "SHAKE ALARM: ON";
  } else {
    shake_alarm_state = "SHAKE ALARM: OFF";
  }

  updateScreen();
}

void onMovementAlarmChange() {
  // Do something
  if (movement_alarm == true) {
    movement_alarm_state = "MOVEMENT ALARM: ON";
  } else {
    movement_alarm_state = "MOVEMENT ALARM: OFF";
  }

  updateScreen();
}

void onMessageUpdateChange() {
  // Do something
}

void onLightEventChange() {
  // Do something
}

void onMovementEventChange() {
  // Do something
}


void onShakeEventChange() {
  // Do something
}




Okay, danke.
Bei der Hardware kann man tatsächlich fast nix falsch machen außer den Servostecker verkehrt herum aufzustecken; das sieht aber bei Dir okay aus.

Die Software ist etwas unübersichtlich wegen der Cloud-Anbindung.
Wenn Du sicher bist, dass die Empfindlichkeit niedrig genug eingestellt ist, die Haltezeit (Impulslänge) kürzer ist als die delay()s in der alarm()-Funktion (eine Sekunde) und sich nichts bewegt sollte er nur einmal auslösen.

Allerdings würde ich mal in Zeile 72 das INPUT ändern:

 pinMode(A5, INPUT_PULLUP);

Der Sensor ist low aktiv - wenn kein externer Pullup-Widerstand vorhanden ist, hast Du niemanden, der nach der Aktivierung die Leitung wieder auf HIGH (inaktiv) zieht. Das führt dazu, dass in jedem Durchlauf von loop() wieder low erkannt und Alarm ausgelöst wird.

auf was würdest du es ändern?

wno158 meint sicher so, wie er es im Post geschrieben hat.

Yep.
Aus INPUT soll INPUT_PULLUP werden.

@TO:
Empfindlichkeit kann ich nix zu sagen, hängt von der Umgebung und dem gewünschten Ansprechverhalten ab.

Haltezeit: Da wegen der Alarmfunktion der Sensor alle Sekunde abgefragt wird, muss die Haltezeit unter einer Sekunde sein
O D E R
Es müssen Zustandsübergänge berücksichtigt werden (Alarm frühestens dann wieder auslösen nachdem inaktiv erkannt wurde).

Ansonsten kommt es zu Mehrfachauslösungen. Letzteres wäre im Übrigen sowieso zu empfehlen, dann bleibt der Alarm auch aus wenn der Hamster eine halbe Stunde vor dem Sensor rumturnt.

Das Problem ist leider immer noch da. Das mit dem INPUT_PULLUP habe ich probiert. Aber es hat nicht funktioniert. Wenn ich den Bewegungsmelder an den Opla anschließe dann passiert gar nichts. Außer ich stelle die Dauer des Ausgangssiegnal am Bewegungsmelder ganz auf 1. Dann löst er sofort aus.

Was genau soll das sein ?
Wenn du einen zuverlässigen Bewegungsmelder suchst, dann empfehle ich dir Diesen hier.

#26

Du hast 3 Anschlüsse oder? wurden die anderen ausprobiert ?

Mit dem ganzen großen Sketch wird das nix. Da ich keinen MKR oder gar ein Opla-Kit habe, kann ich es auch nicht ausprobieren.
Probier mal bitte diesen Sketch - und gib uns die Ausgabe vom seriellen Monitor (markieren und mit STRG-C / STRG-V in Code-Tags </> einfügen). Ich würde gerne erfahren, was Dein Bewegungssensor wirklich macht.

/*
  https://forum.arduino.cc/t/bewegungsmelder-ausgangs-signal-zu-lange/986928
*/

const byte pir = A5;
byte pirState = HIGH;
byte lastPirState = HIGH;
unsigned long startZeit;

void setup()
{
  // Initialize serial and wait for port to open:  Serial.begin(9600);
  Serial.begin(9600);
  // while (!Serial);

  pinMode(A5, INPUT_PULLUP);
  Serial.println("Los geht's!");
  startZeit = millis();
}

void loop()
{
  // Your code here
  pirState = digitalRead(pir);

  if (pirState != lastPirState)
  {
    lastPirState = pirState;
    Serial.print(millis() - startZeit);
    startZeit = millis();
    
    if (pirState == LOW)
    {
      Serial.println(" aktiv");
    }
    else
    {
      Serial.println(" inaktiv");
    }
  }
}

Ne hab ich noch nicht

17:51:03.574 -> 5155 inaktiv
17:51:06.432 -> 2844 aktiv
17:51:13.884 -> 7448 inaktiv
17:51:16.699 -> 2842 aktiv
17:51:24.048 -> 7320 inaktiv
17:51:26.860 -> 2842 aktiv
17:51:32.323 -> 5469 inaktiv
17:51:35.174 -> 2841 aktiv
17:51:41.067 -> 5864 inaktiv
17:51:43.896 -> 2840 aktiv
17:51:52.174 -> 8297 inaktiv
17:51:55.043 -> 2840 aktiv
17:52:01.161 -> 6157 inaktiv
17:52:04.022 -> 2839 aktiv

Okay, danke.

Du bist siehst vor aktiv immer Zeiten von etwa 2.84s stehen - konstant. Das wird ausgegeben, wenn der Status am Pin von HIGH auf LOW wechselt.

Die Zeiten vor inaktiv (Wechsel nach HIGH) sind variabel, also vermutlich dann durch Bewegung verursacht.

Meine Schlußfolgerungen:

  • Das Ding ist normalerweise LOW (ich habe mich also in #30 geirrt)
  • Wenn sich was bewegt, zieht es für 2.8s an.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.