Re: Modellbahn - Bahnübergang - Lichtschranke
Verfasst: Sa 22. Mai 2021, 20:01
Danke.
Auch ein schönes Wochenende.
Franz
Auch ein schönes Wochenende.
Franz
Forum zur gegenseitigen Hilfe für Hobby´s, Spass und Technik, im Raum Penzberg, Garmisch, Bad Tölz, Seeshaupt
https://www.franzls-technik-forum.de/
Code: Alles auswählen
#include <MobaTools.h>
// Festlegen der Ports
const int Blinker1P = 6; // Die beiden Led's des
const int Blinker2P = 7; // Wechselblinkers.
// ----------- Lichtschranke aktivieren -------------------------------------------------
const byte LS_Relais01 = 2; // Pin 2 ist für Relais Lichtschranke
const byte Lichtschranke01 = 3; // Pin 3 ist für Lichtschranke01
const byte Lichtschranke02 = 4; // Pin 4 ist für Lichtschranke02
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sekunden (3000)
unsigned long milli_aktuell = 0;
byte LS01_Status01 = 0;
byte LS02_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() {
digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
pinMode(LS_Relais01, OUTPUT);
pinMode(Lichtschranke01, INPUT);
pinMode(Lichtschranke02, 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-------------------
LS01_Status01 = digitalRead(Lichtschranke01);
if (LS01_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------------------------
// ---Millis übergeben----------------------------
milli_aktuell = millis();
// ---Lichtschranke02 Kontrolle-------------------
LS02_Status01 = digitalRead(Lichtschranke02);
if (LS02_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;
}
}
//---Lichtschranke02 Ende------------------------
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
}
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
byte MerkerLS1 = 0;
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sek.
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;
MerkerLS1 = 1;
}
else {
if ((milli_aktuell - LS_Laufzeit01 >= LS_Pausezeit01)&& (MerkerLS1 == 1)) // Überbrückungszeit abgelaufen ?
{
digitalWrite (LS_Relais01, HIGH); // Relais01 auf Pin2 ausschalten
Gleis1 = false;
MerkerLS1 = 0;
}
}
//---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
}
Jetzt bin ich total überrascht, ich will nur Dein Programm mit meinem Blinklicht - alles andere kann raus.Bei dem Lichtschranken Programm, das ich dazu gemacht habe, braucht man nur eine IR-Schranke. Die bleibt an, solange der Zug daran vorbei fährt und man kann dann noch eine Zeit einstellen, in der die Schranke weiterhin zu bleibt.
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.
// ----------- Lichtschranke aktivieren -------------------------------------------------
const byte Lichtschranke01 = 3; // Pin 3 ist für Lichtschranke
const byte Lichtschranke02 = 4; // Pin 4 ist für Lichtschranke
const byte LS_Relais01 = 2; // Pin 2 ist für Relais Lichtschranke
byte MerkerLS1 = 0;
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sek.
unsigned long milli_aktuell = 0;
byte LS_Status01 = 0;
byte LS_Status02 = 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() {
digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
pinMode(LS_Relais01, OUTPUT);
pinMode(Lichtschranke01, INPUT);
pinMode(Lichtschranke02, 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);
LS_Status02 = digitalRead(Lichtschranke02);
if ((LS_Status01 == LOW)|| (LS_Status02 == LOW)) {
digitalWrite (LS_Relais01, LOW); // Relais01 auf Pin2 einschalten
Gleis1 = true;
LS_Laufzeit01 = milli_aktuell;
MerkerLS1 = 1;
}
else {
if ((milli_aktuell - LS_Laufzeit01 >= LS_Pausezeit01)&& (MerkerLS1 == 1)) // Überbrückungszeit abgelaufen ?
{
digitalWrite (LS_Relais01, HIGH); // Relais01 auf Pin2 ausschalten
Gleis1 = false;
MerkerLS1 = 0;
}
}
//---Lichtschranke01 Ende------------------------
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
}