SRF02 Verständnisfrage zum Codeablauf..

Hallo werte Community,

ich benötige ganz dringend Eure Hilfe. Ich bin am verzweifeln. Ich habe das Problem schon in einem anderen Forum geschildert, bekomme dort aber leider keine Antwort. Vielleicht habe ich auch einfach mein Problem schlecht oder falsch erklärt. Daher versuche ich es hier noch einmal, weil ich echt schlaflose Nächte habe und dieses Problem einfach nicht gelöst bekomme.
Ich benutze o.g. Sensor + Leonardo und die SRF02 Library von Grappendorf.net mit folgendem Sketch:

#include "Wire.h"
#include "SRF02.h"

SRF02 Sensor[2] =
{
  SRF02(0x70, SRF02_CENTIMETERS),
  SRF02(0x71, SRF02_CENTIMETERS)
};


unsigned long laufzeit = 0;
int Pause = 750;
int SensorRechts = 0;
int SensorLinks = 0;
int Status = 0;
int LDRWert = 0;

int MindHell = 600;
int DurchgRechts = 40;
int DurchgLinks = 80;
int Brenndauer = 25;

int Kanal_1 = 9;
int Kanal_2 = 10;
int Kanal_3 = 11;
int LDRPin = 0;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  SRF02::setInterval(200);
}

void loop()
{
  SRF02::update();
  SensorRechts=Sensor[0].read();
  SensorLinks=Sensor[1].read();
  LDRWert = analogRead(LDRPin);
  
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  if ( (SensorRechts <= DurchgRechts) && (SensorRechts > 0) && (Status == 0) && (LDRWert < MindHell) )
  {
    laufzeit = millis ();               
    for (int i=0; i<=255; i+=5)
    {
      analogWrite(Kanal_1, i);
      delay(5);
    }   
    Status = 1 ;
  }
  
  if ( (millis() > (laufzeit + Pause)) && (Status == 1) )
  {
    for (int i=0; i<=255; i+=5)       
    {
      analogWrite(Kanal_2, i);
      delay(5);
    }
    Status = 2;
  }
  
  if ( (millis() > (laufzeit + Pause * 2 )) && (Status == 2) )
  {
    for (int i=0; i<=255; i+=5)        
    {
      analogWrite(Kanal_3, i);
      delay(5);
    }
    Status = 3;
  }  
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  if ( (SensorLinks <= DurchgLinks) && (SensorLinks > 0) && (Status == 0) && (LDRWert < MindHell) )
  { 
    laufzeit = millis ();               
    for (int i=0; i<=255; i+=5)
    {
      analogWrite(Kanal_3, i);
      delay(5);
    }   
    Status = 11 ;
  }
  
  if ( (millis() > (laufzeit + Pause)) && (Status == 11) )
  {
    for (int i=0; i<=255; i+=5)          
    {
      analogWrite(Kanal_2, i);
      delay(5);
    }
    Status = 12;
  }
  
  if ( (millis() > (laufzeit + Pause * 2 )) && (Status == 12) )
  {
    for (int i=0; i<=255; i+=5)         
    {
      analogWrite(Kanal_1, i);
      delay(5);
    }
    Status = 13;
  }  
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  if ( (Status == 3) && (SensorLinks>0) && (SensorLinks < DurchgLinks) )
  {
    for (int i=255; i>=0; i-=5)          
    {
      analogWrite(Kanal_1, i);
      analogWrite(Kanal_2, i);
      analogWrite(Kanal_3, i);
      delay(10);
    }
    Status = 0;
    

  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  if ( (Status == 13) && (SensorRechts>0) && (SensorRechts < DurchgRechts) )
  {
    for (int i=255; i>=0; i-=5)          
    {
      analogWrite(Kanal_1, i);
      analogWrite(Kanal_2, i);
      analogWrite(Kanal_3, i);
      delay(10);
    }
    Status = 0;
    
    
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}

Kurze Erklärung:

Wenn einer der beiden Sensoren auslöst, sollen die LED´s angehen. Danach soll nur noch der jeweils andere Sensor ein Ausschalten der LED´s bewirken. (Ich versuche ein Wegleitsystem zu realisieren)
Wird das Ausschalten der LED´s nicht durch den Sensor ausgelöst, schalten die LED´s nach einiger Zeit von selbst aus. Der Timeout funktioniert wunderbar.

Was leider aber nicht richtig funktioniert, ist das Ausschalten durch den jeweils gegenüberliegenden Sensor.
Denn wenn dieser auslöst, werden die LED´s zwar ausgeschaltet, schalten aber gleichzeitig die LED´s wieder an. Der Sonsor fungiert also gleichzeitig als Ausschalter und danach sofort als Einschalter.

Dies ist für mich aber überhaupt nicht nachvollziehbar. Denn in der jeweiligen Einschaltabfrage wird doch abgefragt: SensorRechts <= DurchgRechts, Status==0, SensorRechts>0, LDRWert < MindHell. Ist alles wahr, schalte ein. Und an diesem Punkt muss mein Denk-, bzw. Verständnisfehler sein. Wenn durch auslösen des Sensors ausgeschaltet worden ist, fängt doch das Programm wieder oben bei void loop() an oder nicht? Und da wird der Sensor doch wieder neu eingelesen, so dass die Abfrage: SensorRechts <= DurchgRechts garnicht mehr Wahr sein kann, oder?
Er nimmt scheinbar den beim Ausschalten eingelesenen Sensorwert nach dem Ausschalten mit nach oben an den Anfang und schaltet sofort wieder ein.
Ich habe auch schon versucht nach dem “Ausschalten durch Sensor” den Sensorwert wieder zu löschen mit: SensorRechts = 0; oder auch SensorRechts = ’ ';
Das hat alles nichts geholfen :frowning:

Ich hoffe ich habe das Problem verständlich rübergebracht und hoffe so sehr, das Ihr einen Tip oder einen Lösungsvorschlag für mich habt, das die LED´s nach dem Ausschalten auch aus bleiben.
Ich bin mit meinem Latein echt am Ende =(

Ich bin dankbar für jeden auch noch so kleinen Hinweis!

Tausend Dank,
Viele Grüsse, J.

Bist Du sicher daß der eine Sensor nicht den anderen stört da er das Echo des anderen bakommt? Hast Du versucht eine gewisse Zeit zwischen den beiden Messungen zu warten? Grüße Uwe

Ich würde mal sagen, das Programm läuft genau so wie es programmiert ist und hat keinen Fehler. Der Fehler leigt in Deiner Logik. Die Bedingungen für Ein- und Ausschalten sind ja identisch, der Unterschied liegt nur im Statuswert. Und nachdem Du beim Ausschalten den Status auf 0 setzt, sind damit sofort die Vorgaben zum Einschalten erfüllt. Eine Möglichkeit wäre, den Status erst mal auf einen anderen Wert zu setzen (z.B. 4 bzw. 14). Wenn dieser Statuswert besteht, prüfst Du bis die Bedingung nicht mehr erfüllt ist (also SensorLinks > DurchgLinks bzw. SensorRechts > DurchgRechts) und setzt erst dann den Status wieder auf 0.

uwefed: Bist Du sicher daß der eine Sensor nicht den anderen stört da er das Echo des anderen bakommt? Hast Du versucht eine gewisse Zeit zwischen den beiden Messungen zu warten? Grüße Uwe

Die Sensoren scheinen sich nicht zu stören, sie sind mit einem Gewissen Abstand Rücken an Rücken installiert und ein kleines Testprogramm zeigt mir im Seriellen Monitor, das die Sensoren sauber abwechselnd Ihre Werte empfangen und ausgeben.

MaFu: Ich würde mal sagen, das Programm läuft genau so wie es programmiert ist und hat keinen Fehler. Der Fehler leigt in Deiner Logik. Die Bedingungen für Ein- und Ausschalten sind ja identisch, der Unterschied liegt nur im Statuswert. Und nachdem Du beim Ausschalten den Status auf 0 setzt, sind damit sofort die Vorgaben zum Einschalten erfüllt. Eine Möglichkeit wäre, den Status erst mal auf einen anderen Wert zu setzen (z.B. 4 bzw. 14). Wenn dieser Statuswert besteht, prüfst Du bis die Bedingung nicht mehr erfüllt ist (also SensorLinks > DurchgLinks bzw. SensorRechts > DurchgRechts) und setzt erst dann den Status wieder auf 0.

Hm, das verstehe ich jetzt leider nicht so richtig. Ich glaube ich hab schon Kopfsalat :( Wenn ich nach dem Ausschalten erst auf z.bsp. Status 4 setze und dann eine Prüfung starte die erst den Status wieder auf 0 setzt, wenn SensorLinks > DurchgLinks ist wird diese Bedingung doch dort unten nie erfüllt. Denn ist es nicht so, das die Sensoren sich erst wieder oben im void loop() einen neuen Wert holen? Ich hab das mal getestet. Schaltet ein Sensor aus und ich sofort gebe Energie auf den LDR, bleiben die LED´s aus. Denn in dem Fall ist ja LDRWert>MindHell also Abfrage nicht Wahr. D.h. doch für mich er geht hoch in den void loop(), liest neu ein und prüft die Abfragen. Nur leider weiter mit dem Wert des ausschaltenden Sensors, deswegen gehen die LED´s ja auch fälschlicherweise gleich wieder an.

Oder stehe ich jetzt schon total auf dem Schlauch? Vielleicht kannst Du mir in einem meiner Ausschaltblocks mal kurz reincoden wie genau du das meinst? Das würde mir wirklich sehr helfen.

Ich danke Dir/Euch aber jetzt schon tausend mal das Ihr versucht mir zu helfen.

vielen, vielen Dank!!!!

Natürlich hat der ausschaltende Sensor noch den gleichen Wert. Er schaltet ja aus, weil er ein Objekt detektiert hat. Dieses Objekt ist aber mit größter Wahrscheinlichkeit nach dem Ausschalten immer noch fast an der gleichen Position. Und dadurch liefert der Sensor logischerweise den gleichen Wert, wodurch er (da ja jetzt Status == 0) zum einschaltenden Sensor wird.

Und was ich mit meinem Vorschlag meinte: Nach dem Ausschaltvorgang den Sensor auf 4 bzw. 14 anstelle auf 0 setzen. Und an das Ende von loop() noch die folgenden Zeilen (ungetestet).

  if ( (Status == 4) && (SensorRechts > DurchgRechts) )
    Status = 0;
  if ( (Status == 14) && (SensorLinks > DurchgLinks) )
    Status = 0;

Da wird ja nichts blockiert und die loop() Funktion beginnt sofort wieder von vorne (mit der Abfrage der Sensoren). Durch den Statuswert von 4 bzw. 14 werden jedoch die anderen Abfragen nicht wahr. Sobald das Objekt aus dem Erfassungsbereich raus ist, sorgen die beiden Abfragen dafür dass Status auf 0 gesetzt wird und es kann wieder von vorne beginnen.

hah!! jetzt freu ich mich wie ein kleiner junge :D genau das war es, es klappt!!

tausend dank!! du hast mir sehr geholfen!! jetzt kann ich endlich weiter machen ;))

beste grüsse! j.

Gern geschehen.