Das wird nicht gehen.
Der Sensor erkennt nur ob sich etwas tut oder nicht. - PIR => PassivInfraRot
Du kannst aber, wenn der PIR auslöst eine bestimmte Zeit den Piezo auslösen und darauf hoffen, das sich das Objekt während der Auslösezeit weiter bewegt und den Zeitpunkt "retriggert".
Ich hab Dir das mal gebaut.
Wenn der auslöst, macht der 1 Sekunde piep. Bewegt sich in der Zeit was, fängt die Zeit bei der letzten Bewegung von vorn an.
ungetestet.
kompiliert.
Absichtlich nicht kommentiert.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte piezoPin = 4;
const byte pirPin = 2;
const byte LEDrot = 6;
const byte tasterPin = 7;
bool tasterStatus = false;
bool pirStatus = false;
const unsigned long intervall = 1000; // zeit in ms - evtl. anpassen
const unsigned long ledOnTime = 200;
unsigned long pirStart;
unsigned long btnPressTime;
const bool scharf = true;
const bool unscharf = !scharf;
byte status = unscharf;
void setup()
{
lcd.init();
lcd.backlight();
pinMode(LEDrot, OUTPUT);
digitalWrite(LEDrot, LOW);
pinMode(tasterPin, INPUT);
pinMode(piezoPin, OUTPUT);
pinMode(pirPin, INPUT);
displaySensor(status);
}
void loop()
{
switch (status)
{
case unscharf:
if (getTaste())
{
status = scharf;
displaySensor(status);
}
break;
case scharf:
if (digitalRead(pirPin) == HIGH)
{
lcd.setCursor(0, 1);
lcd.print(F("Person entdeckt"));
pirStart = millis();
digitalWrite(LEDrot, HIGH);
digitalWrite(piezoPin, HIGH);
}
if (getTaste())
{
digitalWrite(piezoPin, LOW);
status = unscharf;
displaySensor(status);
}
break;
default:
status = unscharf;
displaySensor(status);
}
if (millis() - pirStart > ledOnTime)
{ digitalWrite(LEDrot, LOW); }
if (millis() - pirStart > intervall)
{ digitalWrite(piezoPin, LOW); }
}
bool getTaste()
{
bool tasteGedrueckt = false;
if (digitalRead(tasterPin) == HIGH)
{
if (tasterStatus == LOW)
{
tasterStatus = HIGH;
tasteGedrueckt = true;
btnPressTime = millis();
}
}
else if (millis() - btnPressTime > 50)
{
tasterStatus = LOW;
}
return tasteGedrueckt;
}
void displaySensor(const bool isActiv)
{
lcd.clear();
lcd.print(F("Sensor "));
if (isActiv == false)
{
lcd.print(F("in"));
}
lcd.print(F("aktiv"));
}