Jetzt habe ich es kapiert. Das geht über die Gleis Start - Ende Kontakte.
Ich habe hier im Code mal eine Lichtschranke für Gleis 1 integriert. Also wenn ein Zug da an der IR Schranke vorbei fährt, geht das Geblinke los.
Das geht ohne Gleis Ende Kontakt. Die Belegt anzeige bleibt 3 Sek. nach Zug Ende. Einstellung über "Pausezeit01".
Code: Alles auswählen
#include <MobaTools.h>
/* Demo: Wechselblinker modifiziert von Bodo
Plus IR Lichtschranke mit Relais
Dieses Demo ist etwas komplexer und zeigt die Realisierung eines
Wechselblinker, der per Schalter ein- und ausgeschaltet wird.
Wie bei Wechselblinkern an einem BÜ üblich, starten die beiden Lampen
gleichzeitig, um dann im Wechseltakt zu blinken
Dieses Demo verwendet auch die 'Eieruhr' um Zeitverzögerungen zu realisieren
Die 'Eieruhr' ist ein Zeitzähler, der aufgezogen werden kann und im loop kann
abgefragt werden, ob er abgelaufen ist.
*/
// Festlegen der Ports
const int Blinker1P = 6; // Die beiden Led's des
const int Blinker2P = 7; // Wechselblinkers.
const int Gleis1onP = 8; // Gleis 1 Start-Kontakt
const int Gleis1offP = 9; // Gleis 1 Ende--Kontakt
const int Gleis2onP = 10; // Gleis 2 Start-Kontakt
const int Gleis2offP = 11; // Gleis 2 Ende--Kontakt
const int Gleis3onP = 4; // Gleis 3 Start-Kontakt
const int Gleis3offP = 5; // Gleis 3 Ende--Kontakt
// ----------- Lichtschranke aktivieren -------------------------------------------------
const byte Lichtschranke01 = 3; // Pin 3 ist für Lichtschranke
const byte LS_Relais01 = 2; // Pin 2 ist für Relais Lichtschranke
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sekunden
unsigned long milli_aktuell = 0;
byte LS_Status01 = 0;
// --------------------------------------------------------------------------------------
boolean SchalterP = false; // Blinkschaltung on/off
boolean Gleis1 = false; // Gleis 1 belegt/frei
boolean Gleis2 = false; // Gleis 2 belegt/frei
boolean Gleis3 = false; // Gleis 3 belegt/frei
// Weitere Konstante
const int wbZykl = 1100; // Zykluszeit des Wechselblinkers
const int wbSoft = 400; // Auf/Abblendzeit der Lampen
// Zustand des Wechselblinker
byte wblZustand = 0; // In dieser Variable wird hinterlegt, in welchem Zustand
// sich der Wechselblinker gerade befindet
#define WBL_AUS 0 // beide Lampen sind aus
#define WBL_START 1 // Startphase: beide Lampen sind an
#define WBL_BLINKT 2 // Die Lampen blinken normal im Wechsel
byte ledState; // HIGH : Blinker1 ist an, LOW Blinker2 ist an
MoToSoftLed Blinker1;
MoToSoftLed Blinker2;
MoToTimer BlinkUhr;
//--------------------------------------------------------------SETUP----------------------
void setup() {
pinMode(Gleis1onP, INPUT_PULLUP);
pinMode(Gleis1offP, INPUT_PULLUP);
pinMode(Gleis2onP, INPUT_PULLUP);
pinMode(Gleis2offP, INPUT_PULLUP);
pinMode(Gleis3onP, INPUT_PULLUP);
pinMode(Gleis3offP, INPUT_PULLUP);
digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
pinMode(LS_Relais01, OUTPUT);
pinMode(Lichtschranke01, INPUT);
Blinker1.attach(Blinker1P); // die Ausgänge werden automatisch auf OUTPUT gesetzt
Blinker1.riseTime( wbSoft ); // Aufblendzeit in ms
Blinker2.attach(Blinker2P);
Blinker2.riseTime( wbSoft ); // Aufblendzeit in ms
}
//--------------------------------------------------------------LOOP-----------------------
void loop() {
// ---Millis übergeben----------------------------
milli_aktuell = millis();
// ---Lichtschranke01 Kontrolle-------------------
LS_Status01 = digitalRead(Lichtschranke01);
if (LS_Status01 == LOW) {
digitalWrite (LS_Relais01, LOW); // Relais01 auf Pin2 einschalten
Gleis1 = true;
LS_Laufzeit01 = milli_aktuell;
}
else {
if (milli_aktuell - LS_Laufzeit01 >= LS_Pausezeit01) // Überbrückungszeit abgelaufen ?
{
digitalWrite (LS_Relais01, HIGH); // Relais01 auf Pin2 ausschalten
Gleis1 = false;
}
}
//---Lichtschranke01 Ende------------------------
if ( digitalRead(Gleis1onP) == LOW ) {
Gleis1 = true;
}
if ( digitalRead(Gleis1offP) == LOW ) {
Gleis1 = false;
}
if ( digitalRead(Gleis2onP) == LOW ) {
Gleis2 = true;
}
if ( digitalRead(Gleis2offP) == LOW ) {
Gleis2 = false;
}
if ( digitalRead(Gleis3onP) == LOW ) {
Gleis3 = true;
}
if ( digitalRead(Gleis3offP) == LOW ) {
Gleis3 = false;
}
SchalterP = Gleis1 || Gleis2 || Gleis3 ; // Blinken, wenn Gleis 1 oder Gleis 2 oder Gleis 3 belegt
// Wechselblinker
switch (wblZustand) {
case WBL_AUS:
// Beide Lampen sind aus, warten auf einschalten
if ( SchalterP == true && BlinkUhr.running() == false ) {
// Beide Leds einschalten, Timer für gemeinsames Startleuchten
Blinker1.on();
Blinker2.on();
BlinkUhr.setTime( wbSoft );
wblZustand = WBL_START;
}
break;
case WBL_START:
// Startphase: Nach Zeitablauf erste Led wieder aus
if ( BlinkUhr.running() == false ) {
// Die Startzeit ist abgelaufen, Übergang zur normalen Blinkphase
ledState = HIGH;
Blinker2.off();
BlinkUhr.setTime(wbZykl / 2); // Zeitverzögerung setzen
wblZustand = WBL_BLINKT;
}
break;
case WBL_BLINKT:
if ( BlinkUhr.running() == false ) {
BlinkUhr.setTime(wbZykl / 2); // Zeitverzögerung setzen
if ( ledState == LOW ) {
Blinker1.on();
Blinker2.off();
ledState = HIGH;
} else {
ledState = LOW;
Blinker2.on();
Blinker1.off();
}
}
if ( SchalterP == false ) {
// Wechselblinker abschalten
Blinker1.off();
Blinker2.off();
wblZustand = WBL_AUS;
BlinkUhr.setTime(wbZykl); // minimale 'Aus' zeit des Blinkers
//( schützt vor Schalterprellen )
}
break;
} // Ende switch Wechselblinker
}