Danke, daß Du meinem Rat gefolgt bist.
Du könntest noch einen Link zu Deiner Projektvorstellung ergänzen.
Das freut mich, aber warum eigentlich? Dein Programm funktioniert doch und warum willst Du Zeit mit Programmieren verschwenden, wo Du doch so tolle Anlagen bauen kannst. Warum will der erfolgreiche Bildhauer plötzlich Maler werden? Was kannst Du mit Deinen bisherigen Fähigkeiten nicht realisieren, was fehlt Dir?
Am Ende kommt dann sowas raus: Anleitung: Weichensteuerung mit Klasse
Willst Du das? Daher meine Fragen.
Deine Westernstadt (Klasse übrigens!) hat ein Andreaskreuz mit einer speziellen Blinkfolge:
//
// Modellbahn-Basteleien
const byte akreuzPin = 13; // Pin für Andreaskreuz
void setup()
{
pinMode(akreuzPin, OUTPUT);
}
void akreuz()
{
digitalWrite(akreuzPin, HIGH);
delay(500);
digitalWrite(akreuzPin, LOW);
delay(200);
digitalWrite(akreuzPin, HIGH);
delay(200);
digitalWrite(akreuzPin, LOW);
delay(200);
}
void loop()
{
akreuz();
}
Also µC gekauft, LED angeschlossen und freuen!
Oder?
Du möchtest das Andreaskreuz in die Weichensteuerung integrieren? Dann muß sie blockadearm programmiert werden:
const byte akreuzPin = 13; // Pin für Andreaskreuz
const uint32_t KURZ = 200, LANG = 500;
uint32_t jetzt = millis(); // aktuelle Zeit in ms nach Reset
void setup()
{
pinMode(akreuzPin, OUTPUT);
}
void akreuz()
{
static uint32_t intervall = 0;
static uint32_t vorhin = 0;
static byte schritt = 0;
if (jetzt - vorhin >= intervall) {
vorhin = jetzt;
switch (schritt++) {
case 0:
digitalWrite(akreuzPin, HIGH);
intervall = LANG;
break;
case 1:
digitalWrite(akreuzPin, LOW);
intervall = KURZ;
break;
case 2:
digitalWrite(akreuzPin, HIGH);
intervall = KURZ;
break;
case 3:
digitalWrite(akreuzPin, LOW);
intervall = KURZ;
schritt = 0;
break;
}
}
}
void loop()
{
jetzt = millis();
akreuz();
}
Dieses Programm arbeitet blockadearm mit millis().
Extra für Modellbahner hat @MicroBahner die MobaTools entwickelt, die auch einen blockadearmen Zeitgeber "Eieruhr" enthalten:
#include <MobaTools.h> // Kann mittels Arduino-IDE installiert werden.
MoToTimer Akreuz;
const byte akreuzPin = 13; // Pin für Andreaskreuz
const uint32_t KURZ = 200, LANG = 500;
void setup()
{
pinMode(akreuzPin, OUTPUT);
}
void akreuz()
{
static byte schritt = 0;
if (!Akreuz.running()) {
switch (schritt++) {
case 0:
digitalWrite(akreuzPin, HIGH);
Akreuz.setTime(LANG); // "Eieruhr" aufziehen
break;
case 1:
digitalWrite(akreuzPin, LOW);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
break;
case 2:
digitalWrite(akreuzPin, HIGH);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
break;
case 3:
digitalWrite(akreuzPin, LOW);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
schritt = 0;
break;
}
}
}
void loop()
{
akreuz();
}
Inzwischen haben die Frauen bemerkt, wie viel sicherer so ein blinkender Übergang ist (auch wenn er derzeit ständig blinkt) und sie wollen mehr Andreaskreuze! Also tun die Männer, was sie immer tun, sie bauen neue. Dazu wird die Funktion in die Methode einer Klasse gepackt und diese Klasse durch mehrere Instanzen genutzt. Da in dieser Gegend wegen der Wiedererkennung blinkende Übergänge unterschiedliche Blinkzeiten haben sollen, können die Instanzen unterschiedliche Zeiten für KURZ oder LANG haben:
#include <MobaTools.h> // Kann mittels Arduino-IDE installiert werden.
class AndreasKreuze {
private: // Die folgenden Objekte sind nur innerhalb der Klasse zugänglich. Am Anfang einer Klasse überflüssig.
const byte akreuzPin;
const uint32_t KURZ, LANG;
MoToTimer Akreuz;
byte schritt = 0;
public:
AndreasKreuze(const byte _akreuzPin, const uint32_t _KURZ, const uint32_t _LANG)
: akreuzPin(_akreuzPin), KURZ(_KURZ), LANG(_LANG)
{}
void init() {
pinMode(akreuzPin, OUTPUT);
}
void blinken() {
if (!Akreuz.running()) {
switch (schritt++) {
case 0:
digitalWrite(akreuzPin, HIGH);
Akreuz.setTime(LANG); // "Eieruhr" aufziehen
break;
case 1:
digitalWrite(akreuzPin, LOW);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
break;
case 2:
digitalWrite(akreuzPin, HIGH);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
break;
case 3:
digitalWrite(akreuzPin, LOW);
Akreuz.setTime(KURZ); // "Eieruhr" aufziehen
schritt = 0;
break;
}
}
}
};
AndreasKreuze andreasKreuze[] {
//akreuzPin, KURZ, LANG;
{13, 200, 500}, // am Bahnhof von Norden
{8, 200, 500}, // am Bahnhof von Süden
{9, 500, 200}, // am Wasserturm
{10, 222, 222} // am Saloon
};
void setup()
{
for (AndreasKreuze &a : andreasKreuze) a.init(); // alle Instanzen durchlaufen die Methode init
}
void loop()
{
for (AndreasKreuze &a : andreasKreuze) a.blinken(); // alle Instanzen durchlaufen die Methode blinken
}
Geht das so in Deine Richtung hinsichtlich Interesse am Programmieren?