Hallo Ceos,
ja soweit habe ich das auch verstanden. Da ich etwas mehr als nur eine H0 H0e Anlage habe...bei der Selfkantbahn angefangen und immer noch dabei und zum guten Schluß auch noch bei der DB aushelfe im Museum Koblenz!
Die Schrankenanlage die ich als Bausatz mir gekauft habe Auhagen Halbschranken.
Eine einfache Funktion einen dünnen Draht am Servoarm befestigen das andere Ende wird durch die kleine Öse am Schrankenbau gefädelt und fertig ist das ganze.
Auch Faller Bausätze haben solche Ösen am Schranckenbaum wo man einen Draht zum ansteuern einfädeln kann.
Das Wippen der Schrankenbäume an den Endlagen kann man ohne weiteres durch programmieren hin bekommen, nur bei einer Halbschrankenanlage ist das meiner Meinung nach zuviel des guten
- - - Aktualisiert - - -
Hallo und nun der Sketch:
#include <Servo.h> // Variablen-Deklaration und Definition
// das ist für die Servoantriebe und muss überall wo es um die Schranke geht mit hinter die laufzahl geschrieben werden!
int Kreuz1 = 13; // BITTE NICHT IN KREUZ1 UMSCHREIBEN das geht NICHT!!!!
int Kreuz2 = 12;
int Kreuz3 = 11;
int Kreuz4 = 8;
int Kreuz5 = 5;
int Reed1 = 6;
int Reed2 = 7;
int buttonState = 0;
int Schranke1 = 9;
int Schranke2 = 10;
unsigned int TimerSchrankeZu = 0;
Servo Schranke1a; // das a hinter der Zahl ist wichtig und darf nicht vergessen werden!
Servo Schranke2a;
unsigned long aktMillis, vorMillis; // aktuelle Millisekunden und vorherige
byte b = 0;
boolean KreuzAnAus = LOW; // boolean Kreuz1-x an low werden über internenwiederstand angeschlossen auch ein relais an kreuz3 wird zum läutwerk geschaltet
boolean Kreuz2AnAus = LOW;
boolean Kreuz3AnAus = LOW;
boolean Kreuz4AnAus = LOW;
boolean Kreuz5AnAus = LOW; // hier wird das alte spulenläutwerk über ein relais mit optokoppler angesteuert!!!
boolean blink100ms = LOW;
boolean blink500ms = LOW;
boolean blink1000ms = LOW;
//boolean Schranke1u2SollZu = LOW;
// Funktionsdeklaration
void Funktion100ms();
void setup() // put your setup code here, to run once:
{
aktMillis = vorMillis = 0;
pinMode(Kreuz1, OUTPUT);
pinMode(Kreuz2, OUTPUT);
pinMode(Kreuz3, OUTPUT);
pinMode(Kreuz4, OUTPUT);
pinMode(Kreuz5, OUTPUT);
pinMode(Reed1, INPUT);
pinMode(Reed2, INPUT);
digitalWrite(Reed1, HIGH);
digitalWrite(Reed2, HIGH);
Schranke1a.attach(Schranke1);
Schranke2a.attach(Schranke2);
Schranke1a.write(10);
Schranke2a.write(7);
}
void loop() // put your main code here, to run repeatedly:
{
aktMillis = millis();
if( aktMillis < vorMillis ) // Wird Bei Variablenüberlauf zurücgesetzt
aktMillis = vorMillis = 0;
if( aktMillis - vorMillis >= 100)
{
Funktion100ms();
}
buttonState = digitalRead(Reed1);
if(buttonState == LOW)
{ // Schranken ZU
KreuzAnAus = HIGH;
TimerSchrankeZu = 30; // Timer auf Wunschzeit setzen auf 3 Sekunden
}
else
{
buttonState = digitalRead(Reed2);
if(buttonState == LOW)
{ // Schranken AUF
KreuzAnAus = LOW;
Schranke1a.write(10);
Schranke2a.write(7);
TimerSchrankeZu = 0; // Timer Reset nicht zwingend erforderlich
}
}
digitalWrite(Kreuz1, KreuzAnAus && blink500ms);
digitalWrite(Kreuz2, KreuzAnAus && !blink500ms); // ausrufezeichen kehr die funktion um!!!
digitalWrite(Kreuz3, KreuzAnAus && blink500ms);
digitalWrite(Kreuz4, KreuzAnAus && !blink500ms);
digitalWrite(Kreuz5, KreuzAnAus && !blink500ms); //ist der anschlußpin für das läutwerk-relais!!
}
// Die Funktion 100ms wird alle 100 ms aufgerufen
void Funktion100ms()
{
b++;
if(b == 0)
b = 1;
blink100ms = !blink100ms;
if((b % 5) == 0 )
blink500ms ^= 1;
if((b % 10) == 0 )
blink1000ms ^= 1;
if(TimerSchrankeZu > 0) // Ist Timer/Zähler > 0 ?
{//ja
TimerSchrankeZu--;
if((TimerSchrankeZu == 0) && KreuzAnAus)
{
Schranke1a.write(100);
Schranke2a.write(95);
}
}
vorMillis = aktMillis;
}
Lesezeichen