Hallo,
ich habe hier ein sketch, ich möchte wenn ir sensor länger wir 3 sek belegt ist, soll den pin11 auf LOW stellen sonst auf high.
Der Grund ist das der IR sensor flackert, es soll dann nur schalten wenn es konstant für 3 sek. belegt ist
#include <Servo.h>
Servo myServo;
int servoPin = 10;
int ir=4;
int led =11;
void setup()
{
myServo.attach(servoPin);
pinMode(ir,INPUT);
pinMode(led,OUTPUT);
}
void loop()
{
for (int i=20;i<=160;i=i+1)
{
myServo.write(i);
delay(20);
//check if an object is detected
//in my case a 0 means an object is detected.
//You may change this to 1 if necessary
if (digitalRead(ir)==0){
digitalWrite(led,LOW);
}
else{
digitalWrite(led,HIGH);
}
}
for (int i=160;i>=20;i=i-1)
{
myServo.write(i);
delay(20);
if (digitalRead(ir)==0){
digitalWrite(led,LOW);
delay(2000);
}
else{
digitalWrite(led,HIGH);
}
}
}
Tcrt 5000 es schaltet zwar , aber es soll nicht sofort schalten wenn der signal belegt ist , es soll prüfen das es mindestens 3-5 sek belegt sein um den Ausgang 11 auf high schalten.
Zb. Ir 3 Sekunden an dann erst Pin 11 auf low
Dann solltest du besser verhindern, das dieser flackert.
Wie hast du denn den Sensor montiert ?
Eine entsprechende Verzögerung kannst du mittels millis Funktion einbauen.
Ok, dann verstehe ich den Sinn des ganzen nicht.
Aus meiner Sicht wird das dann viel zu ungenau, wenn da noch eine Zeitabhängigkeit mit rein soll.
Liegt wohl daran, dass ich mit Tabak selbst nichts am Hut habe.
Aber nochmal. Mit der Funktion millis() kannst du dein Problem lösen.
Geht sicher auch elektrisch, aber in einem Microcontroller Forum ist Software eigentlich die naheliegendste Antwort.
Da aber kaum jemand Tabak-Krümel vor einem optischen Sensor oder deine spezielle Meßstrecke kennt, wäre ein typischer Signalverlauf und das dabei erwünschte Schaltverhalten interessant.
Gibt es vor oder nach dem "Flackern" Phasen mit konstantem Zustand?
Wann soll das Schaltsignal wieder aus gehen?
Unten ist ein elektrischer Zigarettenstopfer der den Tabak stopf, bei stopfen wird das Tabak hoch runter bewegt das möchte ich verhindern , das es nach signal nicht sofort ausgeht der Motor erst wenn es konstant leuchtet.-
static unsigned long aktivZeit;
if (digitalRead(SENSORPIN) == AKTIV) aktivZeit = millis();
if (millis() - aktivZeit > 3000) {
// hier ist die Verzögerungszeit abgelaufen
}
SENSORPIN und AKTIV musst du an deine Umgebung anpassen.
Außerdem beachten, dass das ganze bisher nicht blockierend ist, und noch fehlt, wann der Servo wieder zurück soll. Bzw. brauchst du wohl noch einen Merker, der sagt, dass überhaupt wieder Tabak da ist, der eine neue Servobewegung auslösen soll ?
Eigentlich habe ich kein servo sondern ein Motor der mit bm337 Kondensator auf Maße zuschaltet, das geht auch wenn der Pin 11 auf high steht. Es soll pin4 überwache wenn es länger wie 3 Sekunden auf hight steh soll Pin 11 auf low
Wenn "belegt" ein digitaler Zustand ist, und "nicht belegt" sofort pin11 auf LOW stellt, ist dies das Einfachste, ohne Verwendung von Libraries mit einer solchen Verzögerungsfunktion:
const byte led=11; // Pin
const byte ir = 3; // Pin IR-Sensor
const bool BELEGT = HIGH;
void setup() {
pinMode(ir,INPUT);
pinMode(led,OUTPUT);
}
void loop() {
static unsigned long aktivZeit;
if (digitalRead(ir) != BELEGT) {
aktivZeit = millis();
digitalWrite(led, LOW);
} else {
// BELEGT
if (millis() - aktivZeit > 3000) {
// hier ist die Verzögerungszeit abgelaufen
digitalWrite(led, HIGH);
}
}
}
Da du nicht beschrieben hast, wie währenddessen gleichzeitig der Servo bewegt werden soll, ist er auch nicht drin.