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 ![]()
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