Hilfe beim Sketch

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);
    }
    
  }
  
}

Was für einer, was für Sender nutzt du?

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.

Verzögerung klappt nicht so recht , es überwacht eine Dosierung zb . Tabak, der Motor soll nicht sofort ausgehen und wieder angehen .

Dann hast du das nicht richtig gemacht.
Wenn er erst nach 3 Sek. schalten soll, ist das eine Verzögerung. Oder wie würdest du das nennen ?

Und darauf bist du überhaupt nicht eingegangen.

NA Ja wen bei der, jeder Lichtschranke unterbrochen wird passiert dir sowas.

Verhindern geht nicht weil das Tabak verdichtet wird , daher durch das verdichten von Tabak flackert es

Es geht schon :wink: Zwischen 4 und 3 passenden Kondensator 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?

Auch ich kann mir unter diesem Aufbau nichts vorstellen.

Du dedektirst Tabakkrümel.

wo kommen diese vorbei? Wie kommen die an? und warum.
Kannst Du einige Fotos liefern?

Grüße Uwe

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.-

Also daß das Nachfüllen (= Motor ein) erst startet wenn 3 Sekunden kein Signal vom Sensor kommt?

millis() abspeichern solange der Eingang (sensor) aktiv ist.
Dann kontrollieren ob der letzte abgespeicherte millis()-Wert 3 Sekunden alt ist.

Grüße Uwe

Danke für die antworten aber habe nicht soviel Ahnung von Programmieren, wie muss es den aussehen.?

Das kann man direkt in C++ formulieren, z.B. so:

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

Sorry, das habe ich aus

Nimmt man diese Beschreibung:

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.

Kannst du das bitt noch übersetzen, so dass wir das auch verstehen.
Danke...

bm337 Wahrscheinlich BC337, Kondensator = Transistor, Maße = Masse = GND

1 Like