Moin zusammen,
ich habe auf meinem Rechner noch ein Sketch gefunden womit man einen Arduino z.B. Nano einen Bahnhübergang sicher lassen kann.
Hier sind die Einzelteile der Nano zwei Servos und zwei Relais zu sehen.
Der BÜ wird mit 4 LEDs ausgerüstet und mit einer Faller Klingel oder Türklingel wenn man einen DDR BÜ nachbauen möchte!
Das zweite Relais ist nach dem Einschalten der Sicherung dauerhaft geschaltet und fällt beim Ausschalten ab!
Die LEDs fehlen hier noch und die zwei Reedkontakte die im Gleis angebracht werden müssen sind auch noch nicht angeschlossen.
Dafür hatte ich bisher keine Zeit, da meiner Modelleisenbahn noch lange nicht soweit ist.
Aus diesem Grund liegt das ganze Projekt noch in der Stapelbox mit einer kleinen Anschlußzeichnung.
Hier ist der Sketch damit das ganze auch bei anderen Anlagen zum Einsatz kommen kann!!
---------------------------------------------------------------------------------------------------------------------------------------------------
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#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;
}
--------------------------------------------------------------------------------------------------------
Vielleicht kann das ja einer von Euch brauchen?
Dann viel Spass bei der BÜ-Sicherung
Gruß
Karsten