Zähler per Lichtschranke, Problem mit dem Statusspeichern der Lichtschranke

Hallo Zusammen,

ich lese schon einige Zeit mit und konnte bislang alle meine Probleme durch Googlen lösen. Bei diesem komme ich aber leider nicht weiter und hoffe auf eure Hilfe :slight_smile:

Ich möchte abfragen, ob sich meine Modellbahn auf einem bestimmten Streckenabschnitt, in dem eine Brücke befindet, ist. Nur wenn sich nichts in dem Bereich befindet möchte ich die Brücke bewegen können.

Dafür möchte ich am Beginn und Ende jeweils eine Lichtschranke bauen. Die Lichtschranke am Beginn zählt +, die am Ende Minus. Solange das Ergebnis ungleich 0 ist weiß ich, dass sich noch mindestens ein Waggon auf dem Streckenabschnitt befindet. Die Funktion der Brücke soll nicht ausführbar sein.

Mein Code ist soweit, dass das addieren und Subtrahieren bei einer Unterbrechung klappt und ich die Taster nur bedienen kann wenn der Counter = 0 ist.
Das Problem ist, dass der Counter bei jedem Durchlauf addiert / subtrahiert. Ändert man also die Geschwindigkeit wird der Counter nicht 0 am ende sein.

Ich möchte also die Unterbrechung der Lichtschranke nur einmal Zählen bis sie wieder nicht unterbrochen wird. Mein Versuch war ein merker zu setzten. Das klappt aber leider nicht.

Ich hoffe ihr könnt mir einen ipp geben was ich bei dem merker falsch mache

Mein Scatch sieht bislang so aus:

int photo1= A0; //Das Wort „photo1“ steht jetzt für den Analogenport „A0“ 
int photo2= A1; //Das Wort „photo2“ steht jetzt für den Analogenport „A1“
int photoWert1 = 0; //Variable für den Photodiodenwert 1 mit 0 als Startwert
int photoWert2 = 0; //Variable für den Photodiodenwert 2 mit 0 als Startwert

int merker1;   //Zum merken Status Lichtschranke 1
int merker2;  //Zum merken Status Lichtschranke 2

int counter = 0; //Zug- und Wagenzähler

int LED1 = 7; //Das Wort „LED1“ steht jetzt für den Digitalpin 7
int LED2 = 6; //Das Wort „LED2“ steht jetzt für den Digitalpin 6
int LED3 = 5; //Das Wort „LED3“ steht jetzt für den Digitalpin 5
int LED4 = 4; //Das Wort „LED3“ steht jetzt für den Digitalpin 4
int LED5 = 3; //Das Wort „LED3“ steht jetzt für den Digitalpin 3

int toe = 22; //Taster zum Öffnen auf DiPin 22
int tsch = 23;// Taster zum Schließen auf DiPin 23
int tend=10; // Taster für Endlagenabfrage auf DiPin 10

int tsoe = 0; //Variable für Status tasterÖffnen=0 
int tssch = 0; // Variable für Status tasterSchließen=0
int tsend = 0;  // Variable für Status tasterendlage=0 (für spätere Verwendung) 

void setup()//Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. 
pinMode (LED1, OUTPUT); //Der Pin mit der LED1 ist jetzt ein Ausgang
pinMode (LED2, OUTPUT); //Der Pin mit der LED2 ist jetzt ein Ausgang
pinMode (LED3, OUTPUT); //Der Pin mit der LED3 ist jetzt ein Ausgang
pinMode (LED4, OUTPUT); //Der Pin mit der LED4 ist jetzt ein Ausgang
pinMode (LED5, OUTPUT); //Der Pin mit der LED5 ist jetzt ein Ausgang

//Die analogen Pin muss nicht definiert werden.
}

void loop()
//Lichtschranke mit Abfrage, ob sich Zug auf der Brücke befindet
{
photoWert1 =analogRead(photo1);//Die Spannung an dem Fotowiderstand auslesen und unter der Variable „photoWert1“ abspeichern.
photoWert2 =analogRead(photo2);//Die Spannung an dem Fotowiderstand auslesen und unter der Variable „photoWert2“ abspeichern.
Serial.print("Diff. " ); Serial.println(counter); Serial.print("photo1 " ); Serial.println(photoWert1); Serial.print("photo2 " ); Serial.println(photoWert2);

if (photoWert1 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  { 
  digitalWrite(LED1, HIGH); //…soll die LED1 leuchten…
  if(merker1 != HIGH)   // wenn merker 1 ungleich High
    {
      counter ++;     // addieren +1 den counter 
      merker1 == HIGH;  // und merker 1 High setzten
    }
   else
     {
      merker1==LOW;   / merker 1 low setzten
     }  
     } 

  else //andernfalls…
  {
  digitalWrite(LED1, LOW); //….soll sie nicht leuchten.
  }

if (photoWert2 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  {
  digitalWrite(LED2, HIGH); //…soll die LED2 leuchten…
  if(merker2 != HIGH)   // wenn merker 2 ungleich High
    {
      counter --;       // einen subtrahieren vom counter
      merker2 == HIGH;  // und merker 2 High setzten
    }
   else  //ansonsten
     {
      merker2==LOW;  // merker 2 low setzten
     }  
  
  }
  else //andernfalls…
  {
  digitalWrite(LED2, LOW); //….soll sie nicht leuchten.
  }

if (counter != 0) // wenn der Counter ungleich 0 ist...
  {
  digitalWrite(LED3, HIGH); //...soll LED3 Leuchten (Fehlermeldung)
  }
  else //Ist der Counter 0
  {
  digitalWrite(LED3, LOW); //...soll die LED nicht Leuchten
  }

//Bedienung der Brücke, später durch Motorsteuerung und Endlage Abfrage ersetzt 

tsoe=digitalRead(toe);
tssch=digitalRead(tsch);
tsend=digitalRead(tend);

if(tsoe == HIGH && counter==0 ) // Wenn counter 0 und tasterstatus öffnen gedrückt wird 
  {
  digitalWrite(LED4,HIGH);
  }
  else
  {
  digitalWrite(LED4,LOW);
  }

if(tssch == HIGH && counter==0) // normale Taster Abfrage könnte reichen, da Brücke geöffnet nicht passierbar 
  {
  digitalWrite(LED5,HIGH);
  }
  else
  {
  digitalWrite(LED5,LOW);
  }


delay (10);//Eine kurze Pause, in der die LED an oder aus ist

}

p.s. Ich bekomme gerade nicht hin den Code richtig zu posten, was muss man nochmal davor und dahinter schreiben?

Gruß Nordlicht

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Erledigt, danke für den Hinweis :slight_smile:

Es gibt einen Unterschied zwischen = und ==

Wie Serenifly schon schrieb, macht das:

     merker1 == HIGH;  // und merker 1 High setzten

nicht das was Du möchtest. '==' ist ein Vergleich, und das Ergebnis wird in diesem Fall dann weggeschmissen, da es nicht ausgewertet wird. Letztendlich macht diese Anweisung also gar nichts und wird vom Compiler wegoptimiert.
Wenn Du in den Voreistellungen die Warnungen auf 'Weitere' oder 'Alle' stellst, macht dich der Compiler auf so etwas aufmerksam.
Damit merker1 wirklich geändert wird, brauchst Du ein Zuweisung:

     merker1 = HIGH;  // und merker 1 High setzten

Hallo,
vielen Dank für die Hilfe. Es klappt schonmal besser. Aber leider noch nicht zu 100%.

Jetzt zählt er jeden 2. Loop hoch/ runter. Das kann ich aus dem Scatch auch nachvollziehen.

Loop 1: Der Wert wird kleiner 50 (LED geht an) und der Merker ist ungleich HIGH. Also wird die einer addiert/subtrahiert und der Merker wird HIGH gesetzt.

Loop 2: Der Wert ist kleiner 50 (LED leuchtet) und der Merker ist gleich HIGH. Also wird der merker im else wieder auf LOW gesetzt.

Loop 3: =Loop 1
Loop 4: = Loop 2

Nach 4 Loop sind wir also bei +2 bzw. -2.

if (photoWert1 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  { 
  digitalWrite(LED1, HIGH); //…soll die LED1 leuchten…
  if(merker1 != HIGH)   // wenn merker 2 ungleich High
    {
      counter ++;     // einen addieren
      //counter = counter+1; //...und der Counter einen Hinzufügen....
      merker1 = HIGH;  // und merker 1 High setzten
    }
    
   else
     {
    merker1=LOW;   // merker 1 low setzten

Daraus schließe ich mir, dass das else falsch ist.
Es müsste in etwa eine Solche abfrage kommen:
-if-Abfrage1: Merker = HIGH und photoWert unter 50 ? dann nichts addieren/subtrahieren.
Ist dies der Fall soll nichts addiert werden.
-if-Abfrage 2: merker = High und photoWert über 50? Merker auf LOW, nichts addieren/subtrahieren

Das bekomme ich aber nicht Programmiert. Akut hackt es beider if Abfrage 1: merker ist high und wert unter 50. wie sage ich dem Arduino, dass er "nichts" machen soll sondern weiter im loop laufen ?

so sieht meine Überlegung aus. Hat jemand einen Tipp / Denkanstoß? :slight_smile:

if (photoWert1 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  { 
  digitalWrite(LED1, HIGH); //…soll die LED1 leuchten…
  if(merker1 != HIGH)   // wenn merker 1 ungleich High
    {
      counter ++;     // einen addieren
      merker1 = HIGH;  // und merker 1 High setzten
    }

  if (merker1 =HIGH && photoWert1 <50)     //wenn merker1 = HIGH und photoWert1 kleiner 50
    {
      // nichts machen
    }
  if (merker1=HIGH && photoWert1 >50)    //wenn merker1 = HIGH und photoWert größer 50 (der erste LOOP nachdem die Schranke nicht mehr durchbrochen ist)
    {
      merker1=LOW;    // den merker auf low setzen // damit kann die erste if abfrage wieder hoch zählen
    }
else
   {
    digitalWrite(LED1, LOW); // ist der Photowert unter 50 soll die LED nicht leuchten.
    }

Danke für eure Hilfe

Gruß Nordlicht

Nochmal:

= ist eine Zuweisung
== ist ein Vergleich

Eine Zuweisung gibt den zugewiesenen Wert zurück. Deshalb compiliert das und dafür gibt es auch praktische Anwendungen. Das heißt aber nicht dass es hier richtig ist

Hi

Abhilfe:
Setze den Wert, auf Den Du prüfst, nach vorne.
HIGH==merker1 - klappt
merker1==HIGH - klappt
merker1=HIGH - klappt, aber prüft NICHT
HIGH=merker1 - klappt nicht, der Kompiler meckert (mit Recht)
(wobei ich selber die Variable auch immer vorne habe ... ich bin aber auch schon alt :wink: )

MfG

postmaster-ino:
merker1=HIGH - klappt, aber prüft NICHT
HIGH=merker1 - klappt nicht, der Kompiler meckert (mit Recht)

Das sind aber keine Vergleiche

In JAVA war es sinnvoll, die Konstante vorn zu haben, beim equal-Vergleich, weil es dann keine Null-Pointer-Exception gab.

Gruß Tommy

Ok verdammt, danke! Da muss ich mich sensibilisieren.

Mit der Info habe ich meinen Überlegung dann geändert und in die Beschreibung "Zuweisen" und "Gleich" aufgenommen um es zu verdeutlichen. Ich hoffe jetzt ist es besser und nur noch das "//nichts machen" das Problem...

if (photoWert1 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  { 
  digitalWrite(LED1, HIGH); //…soll die LED1 leuchten…
  if(merker1 != HIGH)   // wenn merker 1 ungleich High
    {
      counter ++;     // einen addieren
      merker1 = HIGH;  // und merker1 den Zustand High zuweisen
    }

  if (merker1 ==HIGH && photoWert1 <50)     //wenn merker1 gleich(==) HIGH und photoWert1 kleiner 50
    {
      // nichts machen
    }
  if (merker1==HIGH && photoWert1 >50)    //wenn merker1 gleich (==) HIGH und photoWert1 größer 50 (der erste LOOP nachdem die Schranke nicht mehr durchbrochen ist)
    {
      merker1=LOW;    // den merker1 den Zustand LOW zuweisen // damit kann die erste if abfrage wieder hoch zählen
    }
else
   {
    digitalWrite(LED1, LOW); // ist der Photowert unter 50 soll die LED nicht leuchten.
    }

Gib doch einfach noch mal nen aktuellen Stand vom Sketch und beschreibe, was Dir am Verhalten nicht gefällt. Das wird übersichtlicher.

Gruß Tommy

Tommy56:
Gib doch einfach noch mal nen aktuellen Stand vom Sketch und beschreibe, was Dir am Verhalten nicht gefällt. Das wird übersichtlicher.

Ok, unten füge ich den Sketch an.
Mein Problem ist das Hochzählen/Herunter zählen der Lichtschranke.

Der Stand ist, dass er momentan bei dem photoWert 1 nicht hoch zählt. (Da habe ich versucht das in den letzten beiden Posts beschriebene umzusetzen.) Der Photowert 2 zählt alle 2 Loops einen runter.

Ich möchte die Lichtschranke 1 für eine beliebig lange Zeit unterbrechen und der Counter soll dann + 1 zählen. (Um einen Geschwindigkeit unterschied der Modellbahn auszugleichen.) und wenn ich Lichtschranke 2 beliebig lange unterbreche möchte ich -1 zählen. Wenn der Counter 0 ist möchte ich die Taster bedienen können, sonst nicht.

int photo1= A0; //Das Wort „photo1“ steht jetzt für den Analogenport „A0“ 
int photo2= A1; //Das Wort „photo2“ steht jetzt für den Analogenport „A1“
int photoWert1 = 0; //Variable für den Photodiodenwert 1 mit 0 als Startwert
int photoWert2 = 0; //Variable für den Photodiodenwert 2 mit 0 als Startwert

int merker1; // Variable zum Merken des Zustandes der Lichtschranke 1
int merker2; // Variable zum Merken des Zustandes der Lichtschranke 2

int counter = 0; //Zug- und Wagenzähler

int LED1 = 7; //Das Wort „LED1“ steht jetzt für den Digitalpin 7
int LED2 = 6; //Das Wort „LED2“ steht jetzt für den Digitalpin 6
int LED3 = 5; //Das Wort „LED3“ steht jetzt für den Digitalpin 5
int LED4 = 4; //Das Wort „LED3“ steht jetzt für den Digitalpin 4
int LED5 = 3; //Das Wort „LED3“ steht jetzt für den Digitalpin 3

int toe = 22; //Taster zum Öffnen auf DiPin 22
int tsch = 23;// Taster zum Schließen auf DiPin 23
int tend=10; // Taster für Endlagenabfrage auf DiPin 10

int tsoe = 0; //Variable für Status tasterÖffnen=0 
int tssch = 0; // Variable für Status tasterSchließen=0
int tsend =0;  // Variable für Status tasterendlage=0

void setup()//Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. 
pinMode (LED1, OUTPUT); //Der Pin mit der LED1 ist jetzt ein Ausgang
pinMode (LED2, OUTPUT); //Der Pin mit der LED2 ist jetzt ein Ausgang
pinMode (LED3, OUTPUT); //Der Pin mit der LED3 ist jetzt ein Ausgang
pinMode (LED4, OUTPUT); //Der Pin mit der LED4 ist jetzt ein Ausgang
pinMode (LED5, OUTPUT); //Der Pin mit der LED5 ist jetzt ein Ausgang

//Die analogen Pin muss nicht definiert werden.
}

void loop()
//Lichtschranke mit Abfrage ob sich Zug auf der Brücke befindet
{
photoWert1 =analogRead(photo1);//Die Spannung an dem Fotowiderstand auslesen und unter der Variable „photoWert1“ abspeichern.
photoWert2 =analogRead(photo2);//Die Spannung an dem Fotowiderstand auslesen und unter der Variable „photoWert2“ abspeichern.
Serial.print("Diff. " ); Serial.println(counter); Serial.print("photo1 " ); Serial.println(photoWert1); Serial.print("photo2 " ); Serial.println(photoWert2);

if (photoWert1 < 50) //Wenn der Sensorwert 1 kleiner 50 ist….
  { 
  digitalWrite(LED1, HIGH); //…soll die LED1 leuchten…
  if(merker1 != HIGH)   // wenn merker 1 ungleich High
    {
      counter ++;     // einen addieren
           merker1 = HIGH;  // und merker 1 High setzten
    }
    if (merker1 ==HIGH && photoWert1 <50)     //wenn merker1 gleich(==) HIGH und photoWert1 kleiner 50
    {
      // nichts machen
    }
    if (merker1==HIGH && photoWert1 >50)    //wenn merker1 gleich (==) HIGH und photoWert1 größer 50 (der erste LOOP nachdem die Schranke nicht mehr durchbrochen ist)
    {
      merker1=LOW;    // den merker1 den Zustand LOW zuweisen // damit kann die erste if abfrage wieder hoch zählen
  }
  }
  else //andernfalls…
  {
  digitalWrite(LED1, LOW); //….soll sie nicht leuchten.
  }




  
if (photoWert2 < 50) //Wenn der Sensorwert 2 kleiner 50 ist….
  {
  digitalWrite(LED2, HIGH); //…soll die LED2 leuchten…
  if(merker2 != HIGH)   // wenn merker 2 ungleich High
    {
      counter --;       // einen subtrahieren
      merker2 = HIGH;  // und merker 2 High setzten
    }
   else  //ansonsten
     {
      merker2=LOW;  // merker 2 low setzten
     }  
  
  }
  else //andernfalls…
  {
  digitalWrite(LED2, LOW); //….soll sie nicht leuchten.
  }

if (counter != 0) // wenn der Counter ungleich 0 ist...
  {
  digitalWrite(LED3, HIGH); //...soll LED3 Leuchten (Fehlermeldung)
  }
  else //Ist der Counter 0
  {
  digitalWrite(LED3, LOW); //...soll die LED nicht Leuchten
  }

//Bedienung der Brücke

tsoe=digitalRead(toe);
tssch=digitalRead(tsch);
tsend=digitalRead(tend);

if(tsoe == HIGH && counter==0 ) // wenn counter = 0 und tasteröffnen gedruckt ist
  {
  digitalWrite(LED4,HIGH); // soll LED 4 leuchten
  }
  else // ansonsten...
  {
  digitalWrite(LED4,LOW);  // nicht leuchten
  }

if(tssch == HIGH && counter==0)
  {
  digitalWrite(LED5,HIGH);
  }
  else
  {
  digitalWrite(LED5,LOW);
  }


delay (500);

}

Danke für die Hilfe

Gruß Nordlicht

Hi

Tommy56:
Das sind aber keine Vergleiche

Deshalb ja das 'Klappt, aber prüft nicht' - die Zeile wird so vom Kompiler gefressen, da Diese korrekt aufgebaut ist.
Woher soll der Kompiler auch wissen, daß Du was ganz Anderes machen willst, als Du schreibst :wink:

MfG

Oder anders ausgedrückt: Der Kompiler (MC) macht, was Du ihm sagst, nicht was Du von ihm willst.

Gruß Tommy

Was Du brauchst, ist eine Flankenerkennung. Ich habe deinen Sketch mal etwas umgestellt. Du kannst bei den Merkern mit logischen Werten arbeiten ( true/false ). Da kannst Du auch einiges an if-Abfragen sparen.

const int photo1 = A0; //Das Wort „photo1" steht jetzt für den Analogenport „A0"
const int photo2 = A1; //Das Wort „photo2" steht jetzt für den Analogenport „A1"
bool LS1Belegt = false; // = true, wenn die Einfahrt Lichtschranke belegt ist
bool LS2Belegt = false; // = true, wenn die Ausfahrt Lichtschranke belegt ist

bool lastLS1 = false; // Variable zum Merken des Zustandes der Lichtschranke 1
bool lastLS2 = false; // Variable zum Merken des Zustandes der Lichtschranke 2

int counter = 0; //Zug- und Wagenzähler

const int LED1 = 7; //Das Wort „LED1" steht jetzt für den Digitalpin 7
const int LED2 = 6; //Das Wort „LED2" steht jetzt für den Digitalpin 6
const int LED3 = 5; //Das Wort „LED3" steht jetzt für den Digitalpin 5
const int LED4 = 4; //Das Wort „LED3" steht jetzt für den Digitalpin 4
const int LED5 = 3; //Das Wort „LED3" steht jetzt für den Digitalpin 3

const int toe = 22; //Taster zum Öffnen auf DiPin 22
const int tsch = 23;// Taster zum Schließen auf DiPin 23
const int tend = 10; // Taster für Endlagenabfrage auf DiPin 10

bool tsoe = false; //Variable für Status tasterÖffnen=0
bool tssch = false; // Variable für Status tasterSchließen=0
bool tsend = false;  // Variable für Status tasterendlage=0

void setup()//Hier beginnt das Setup.
{
  Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet.
  while(!Serial);
  pinMode (LED1, OUTPUT); //Der Pin mit der LED1 ist jetzt ein Ausgang
  pinMode (LED2, OUTPUT); //Der Pin mit der LED2 ist jetzt ein Ausgang
  pinMode (LED3, OUTPUT); //Der Pin mit der LED3 ist jetzt ein Ausgang
  pinMode (LED4, OUTPUT); //Der Pin mit der LED4 ist jetzt ein Ausgang
  pinMode (LED5, OUTPUT); //Der Pin mit der LED5 ist jetzt ein Ausgang

  pinMode( toe, INPUT );
  pinMode( tsch, INPUT );
  pinMode( tsend, INPUT );

  //Die analogen Pin muss nicht definiert werden.
}

void loop()
//Lichtschranke mit Abfrage ob sich Zug auf der Brücke befindet
{
  LS1Belegt = ( analogRead(photo1) < 50 );//Die Spannung an dem Fotowiderstand auslesen und Belegtzustand in der Variable „LS1Belegt" abspeichern.
  LS2Belegt = ( analogRead(photo2) < 50 );//Die Spannung an dem Fotowiderstand auslesen und Belegtzustandunter der Variable „LS2Belegt" abspeichern.

  // LED1 und LED2 entsprechend LS-Zustand schalten
  digitalWrite(LED1, LS1Belegt);
  digitalWrite(LED2, LS2Belegt);

  if (LS1Belegt && !lastLS1) // Lichtschranke 1 wurde unterbrochen ( Flanke )
  {
    counter ++;     // einen addieren
    Serial.print("Diff. " ); Serial.println(counter); Serial.print("LS1Belegt=" ); Serial.println(LS1Belegt); Serial.print("LS2Belegt=" ); Serial.println(LS2Belegt);
  }
  lastLS1 = LS1Belegt;   // aktuellen Zustand der LS merken

  if (LS2Belegt && !lastLS2) // Lichtschranke 2 wurde unterbrochen ( Flanke )
  {
    counter --;     // einen abziehen
    Serial.print("Diff. " ); Serial.println(counter); Serial.print("LS1Belegt=" ); Serial.println(LS1Belegt); Serial.print("LS2Belegt=" ); Serial.println(LS2Belegt);
  }
  lastLS2 = LS2Belegt;   // aktuellen Zustand der LS merken


  digitalWrite(LED3, (counter != 0) ); //LED3 leuchtet,wenn Counter nicht 0 (Fehlermeldung)

  tsoe = digitalRead(toe);
  tssch = digitalRead(tsch);
  tsend = digitalRead(tend);

  //Bedienung der Brücke nur wenn counter auf 0 steht
  if ( counter == 0 ) {
    if (tsoe  ) // wenn tasteröffnen gedruckt ist
    {
      digitalWrite(LED4, HIGH); // soll LED 4 leuchten
    }
    else // ansonsten...
    {
      digitalWrite(LED4, LOW); // nicht leuchten
    }

    if (tssch )
    {
      digitalWrite(LED5, HIGH);
    }
    else
    {
      digitalWrite(LED5, LOW);
    }
  }

  delay (20); // zum entprellen;

}

Wie sind deine Lichtschranken angebracht? Du musst sicherstellen, dass beide Lichtschranken sich identisch verhalten, was die Lücken im Wagenverband angeht. Sonst zählt die eine weniger Wagen als die andere - denn geht es auch schief.

Noch ein Tipp zu deinen Kommentaren. Am Anfang ist es zwar verständlich, dass Du die Syntax kommentierst. Aber das wirst Du schnell lernen, und es ist ja auch immer dasselbe. Dann ist der Kommentar wertlos.
Viel wichtiger ist, dass Du die Semantik kommentierst. Z.B. hier:

if (photoWert2 < 50) //Wenn der Sensorwert 2 kleiner 50 ist….

Der Kommentar ist eine Übersetzung des Codes ins deutsche. Viel wichtiger wäre aber zu kommentieren, was das bedeutet, und wann es eintreten soll:

if (photoWert2 < 50) //Wenn die Lichtschranke am Ende der Strecke belegt ( unterbrochen ) ist….

Viel wichtiger wäre aber zu kommentieren, was das bedeutet, und wann es eintreten soll:

Meine Oma sage schon:

"Was" da passiert, sieht man auch so, muss man nur die Döppen für auf machen..
"Warum" es passiert, das ist eine Erklärung wert.

Hallo,

ich würde für das sichere zählen per Lichtschranke noch eine Schwellwerthysterese einbauen. Sonst zappelt das und zählt bestimmt falsch?

Sicher eine gute Idee. Erhöht auf jeden Fall die Zuverlässigkeit.

Hallo Zusammen,

mit der Änderung von MircoBahner funktioniert die Lichtschranke genau so wie sie soll. Vielen dank für die Hilfe :slight_smile:

Und vielen dank für die zahlreichen weiteren Post mit Hilfestellungen zum programmieren von allen anderen. Ich habe gerade erst angefangen eigene Scatche zu schreiben, da hilft mir das sehr weiter.

Schönen Sonntag allen

Nordlicht