Guten Morgen,
Gleich mal vorneweg: Sorry, dass die Nachricht so unfassbar lang ist 
Ich habe nicht gerade sehr viel Erfahrung, was Elektronik und Hardware angeht. Das ist auch mein erstes grösseres Projekt, das ich mit dem Arduino mache. Ich habe ca. 5 Jahre Erfahrung mit Lego Mindstorms (EV3, Home Edition) mit Codeblöcken, sowie etwas Erfahrung mit TigerJython und Grundkenntnisse in HTML. Die Programme habe ich in Tinkercad auch nur über Codeblöcke generiert.
Mir ist übrigens noch eingefallen, dass ich etwas nicht erwähnt habe:
Beim Bahnübergang gibt es noch zwei "Kontrollleuchten", eine rote sowie eine grüne LED. Diese Leuchten kennen jeweils 2 Zustände:
Grün leuchtend: Schranke offen
Rot blinkend: Schranke wird geschlossen
Rot leuchtend. Schranke geschlossen
Grün blinkend: Schranke wird geöffnet
Hier der Code zum Bahnübergang ohne Achszähler:
// C++ code
//
#include <Servo.h>
int Blinkzeit = 0;
int i = 0;
Servo servo_4;
int counter;
int counter2;
int counter3;
int counter4;
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
servo_4.attach(4, 500, 2500);
pinMode(2, INPUT);
pinMode(3, INPUT);
Blinkzeit = 500;
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
servo_4.write(0);
while (!(digitalRead(2) == HIGH)) {
digitalWrite(13, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(13, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
}
void loop()
{
// Befehl: Schranke schliessen
if (digitalRead(2) == HIGH) {
// Blinken rot
digitalWrite(5, LOW);
digitalWrite(13, LOW);
delay((Blinkzeit * 1.5)); // Wait for (Blinkzeit * 1.5) millisecond(s)
for (counter = 0; counter < 5; ++counter) {
digitalWrite(6, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(6, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
digitalWrite(6, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
// Schranke schliesst
servo_4.write(90);
digitalWrite(6, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
for (counter2 = 0; counter2 < 3; ++counter2) {
digitalWrite(6, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(6, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
digitalWrite(6, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
while (!(digitalRead(3) == HIGH)) {
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
}
// Befehl: Schranke öffnen
if (digitalRead(3) == HIGH) {
digitalWrite(6, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(5, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
for (counter3 = 0; counter3 < 5; ++counter3) {
digitalWrite(5, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(5, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
// Schranke schliesst
digitalWrite(5, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay((Blinkzeit / 2)); // Wait for (Blinkzeit / 2) millisecond(s)
servo_4.write(0);
delay((Blinkzeit / 2)); // Wait for (Blinkzeit / 2) millisecond(s)
digitalWrite(5, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
for (counter4 = 0; counter4 < 2; ++counter4) {
digitalWrite(5, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(5, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
digitalWrite(5, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
delay((Blinkzeit * 1.5)); // Wait for (Blinkzeit * 1.5) millisecond(s)
// Blinken weiss
while (!(digitalRead(2) == HIGH)) {
digitalWrite(5, HIGH);
digitalWrite(13, HIGH);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
digitalWrite(13, LOW);
delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
}
}
}
Und hier der Code für den Achszähler:
```cpp
// C++ code
//
int zeit = 0;
int abstand = 0;
int autoopen = 0;
long readUltrasonicDistance(int triggerPin, int echoPin) {
pinMode(triggerPin, OUTPUT); // Clear the trigger
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
// Sets the trigger pin to HIGH state for 10 microseconds
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
// Reads the echo pin, and returns the sound wave travel time in microseconds
return pulseIn(echoPin, HIGH);
}
void setup() {
pinMode(6, OUTPUT);
zeit = 0;
abstand = 50;
autoopen = 1500;
}
void loop() {
while (!(0.01723 * readUltrasonicDistance(8, 8) < abstand)) {
}
digitalWrite(6, LOW);
zeit = 0;
while (!(0.01723 * readUltrasonicDistance(8, 8) > abstand)) {
}
while (!(0.01723 * readUltrasonicDistance(8, 8) < abstand || zeit >= autoopen)) {
zeit += 50;
delay(50); // Wait for 50 millisecond(s)
}
if (zeit >= autoopen) {
digitalWrite(6, HIGH);
zeit = 0;
}
}
Die Codes sollten so zusammengefügt werden, dass sich der Achszähler erst dann aktiviert, wenn die Schranke geschlossen ist. Der Befehl zum Öffnen der Schranke soll ausgeführt werden, wenn der dafür bestimmte Drucktaster betätigt wird oder wenn der Achszähler innerhalb von über 2 Sekunden nicht anschlägt.