# MOBA Wechsel-/Pendelsteuerung

**URL:** <https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458>\
**Category:** Deutsch\
**Created:** [January 5, 2024, 4:10pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458 "2024-01-05T16:10:10Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 5, 2024, 11:09pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/21 "2024-01-05T23:09:31Z")

</div>

- Ein Problem konnte ich lösen: Nach dem Einschalten können nun die Weichen in die richtige Richtung geschalten werden: nach dem fram.read() mussten noch die Variablen Weiche1\_stellung=1 resp. 0 bis Weiche4\_stellungeingefügt werden.

- Inzwischen hält er nun meistens bei den Bahnhöfen aber nicht immer. Auf dem Hauptgleis/Abstellgeleis hält er nun nicht mehr an (5 Runden Test), trotz Sensor detektieren. Im Code da: im init3time millis() -\> if ((GPIO\_U3\_Led13\_Reed2 == 1 && block[0] = ...... resp. if ((GPIO\_U3\_Led14\_Reed3 == 1 && block[0] =

- Manchmal löscht er auch die Led vom letzten Block nicht. Im Code da: im init3time millis() Konstrukt -\> if (reed\_sensor\_entprellt[0] == 1) { ...

Beschrieb der Wechselsteuerung:

- Schalter auf Automat -\> Run, die Blöcke der Geleise 1-3 wird mit Block[1 bis 3] = 90 wird gesperrt, dass er beim losfahren nicht die Weiche schaltet und nicht davon brescht

- Das Drücken des Run Tasters startet die Fahrspannung auf max Rangierspannung (pwm = 100)

- Das überfahren des Block[0] beschleunigt die Fahrt auf die im Trimmer eingestellte Spannung von ca. 4.2V -\> Anzeige auf LCD als T4.2V

- Die ev. gefahrene Spannung wird auch auf dem LCD angezeigt unter dem Bustaben A4.2V  
(Es gibt eine Anfahr- (0V - Rangierspeed) und eine schneller Funktion (Rangierspannung bis max\_trimmer\_spannung) -\> init6atime  
(Dazu gibt es eine Langsamer- und eine Anhaltefunktion die jeweils das konträre macht) -\> init6btime

- Dann fährt er zum Sensor 6 - Bahnhof 2, hält an für die eingestellte Zeit init8time an und fährt wieder an, löscht die Block[0] Led (Schneller)

- Dann fährt er zum Sensor 5 - Bahnhof 1, hält an für die eingestellte Zeit init7time an und fährt wieder an, löscht die Block[6] Led (Bahnhof 2)

- Dann fährt er zum Sensor 4 - langsamer, verringert die Geschwindigkeit auf Rangierspeed. Löscht die Block[6] Led (Bahnhof 1)

- dann fährt er je nach Weichenstellung aufs Abstellgleis 1 block[2] oder das Hauptgleis block[1], da sollte er nun anhalten, die beiden weichen 1 und 3 sollten sich aufs andere Gleis stellen. Nach einer kurzen Verzögerung fährt dann der Zug auf dem anderen Gleis ab und beschlenigt auf Rangierspannung.

- Das überfahren des Block[0] beschleunigt die Fahrt auf die im Trimmer eingestellte Spannung von ca. 4.2V und löscht die Led's der Blöcke block[0] - block[3]  
-\> Nun wiederholt sich das ganze...  
-\> Weichestellwartezeit mit init91time - init93time,  
-\> Weichestellen (Motor an für die Zeit) mit ini5atime - init5dtime (-\> Im manuellen Betrieb funktioniert das Weichen stellen)

- Stopping geht auch nicht mehr, simple Funktion sollte den Zug ins Depot bringen und anhalten. Im Code da: if (GPIO\_U4\_taster\_stopping\_entprellt == 1) { // -\> Weiter fahren ins Depot

-\>\> Soll ich Videos machen zum veranschalichen? Von:

- Manuellen Betrieb wo alles funktioniert?
- Automatischer Betrieb?  
Oder ist bei diesem Code eine Analyse/Hilfe nicht möglich? 🤔

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [January 6, 2024, 1:37am UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/23 "2024-01-06T01:37:57Z")

</div>

Hallo,

ich mach zufällig Ähnliches.

Verwendest du wirklich Reedsensoren? Also die Glasröhrchen? Die reagieren bei dir innerhalb von paar ms vernünftig? Kann ich nicht so recht glauben. Ich verwende Hallsensoren und habe beim drüberfahren mit 120km/h Modellgeschwindigkeit mit kleinen Neomagneten ein paar ms Zeit für alles.

Wenn du für die ganze Sensorabfrage und Verarbeitung immer noch Spaghetticode schreibst, dann wirst du nicht mehr froh. Das merkst du vermutlich jetzt gerade. Du musst Klassen schreiben und deren Methoden arbeiten lassen. Dann hast du getrennte Daten inkl. Kapselung. Glaube mir, ohne dem wird das nichts. millis() zusammengefasst? Auch hier eine Timer Klasse schreiben. Dann hast du getrennte "Uhren" die sich nicht gegenseitig ins Gehege kommen.

Alle Sensoren werden bei mir je loop Durchlauf einmal eingelesen und danach damit alles weitere verarbeitet. Die loop() liegt locker unter 1ms. Das heißt erstmal wird nur der Signalzustand ständig erfasst. Low oder High. Diese Informationen wird dann in anderen Objekten/Methoden weiter verarbeitet bis hin zur Flanken- und Richtungserkennung. Wegen den Klassen ist alles gekapselte Datenverarbeitung. Damit ist man beim Debuggen fast nur mit seinen eigenen Logikfehlern beschäftigt aber nicht mit das sich vielleicht Daten gegenseitig das Leben schwer machen.

Bis 10.1.24 klingt ehrlich gesagt utopisch. Vielleicht eher 10.1.25.  
Wie lange benötigt deine loop() für einen Durchgang?  
Verwendest du delay()?

Deine Platine. Ich sehe keinen einzigen Kondensator. Komplett ohne?

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 6, 2024, 8:26am UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/24 "2024-01-06T08:26:51Z")

</div>

> [@train\_control](#):
>
> Weil die Led an der Steuerplatine angeht.

Ein Bild des Platinenlayouts hilft herzlich wenig. Wer steuert die Led an? Geht das über den Arduino - also die Arduino-Software hat das Schalten des Reed erkannt?

Solange das alles so im Vagen bleibt, kann man nur allgemeine Hinweise geben, wie @Doc_Arduino das schon getan hat. Ganz wesentlich als Grundlage würde ich erstmal vorschlagen, dass Du das EVA-Prinzip einhältst.  
Reigenfolge im loop():

- **E** - Einlesen aller HW Input-Signale in interne Variable mit Entprellen bei mech. Elementen

- **V** - Verarbeiten der Informationen ( nur mittels der internen Variablen, Eingelesen wird jetzt nichts mehr )

- **A** - Ausgeben des bei der Verarbeitung ermittelten Zustands and die HW.

Die Kapselung der verschiedenen - gegebenenfalls unabhängigen - Logiken ist ebenfalls wichtg. Das kann man mit Klassen machen ( geht aber auch anders). Evtl. kannst Du dir meine [MobaTools](https://github.com/MicroBahner/MobaTools) dazu anschauen. Die enthält z.B. eine Timer Klasse, mit der man sehr einfach mehrere Timerfunktionen getrennt voneinander halten kann. Ausserdem eine Klasse zum ( entprellten) Einlesen von mechanischen Eingabeelementen. Diese Klasse ist besonders darauf optimiert, wenn es viele Eingabeelemente gibt ( bis zu 32 in einer Instanz ). Ausserdem solltest Du dich dringend mit [Zustandsautomaten](https://de.wikipedia.org/wiki/Endlicher_Automat) beschäftigen. Die sind perfekt geeignet, solche Aufgaben wie bei dir zu lösen.  
Den Termin 10.1. halte ich auch für illusorisch. Für eine zuverlässige Steuerung wirst Du deinen Sketch fundamental umbauen müssen.

Wenn Du detailliertere Hinweise wünscht, brauchen wir mehr Informationen.

- Ein Gleisschema mit den zu schaltenden Weichen und den Positionen der Reed Kontakte.
- Eine verbale Beschreibung wie die Züge dort fahren sollen. Also eine Aufgabenbeschreibung - vollkommen unabhängig davon wie das dann im Code realisert wird.
- Wie werden die Weichen geschaltet
- Fahren die Züge digital oder analog
- Bei analog; wo sind die Fahrstromabschnitte getrennt, wie wird der Fahrstrom gesteuert.

Ausserdem wäre ein Blockschaltbild ( wie schon von @noiasca in #15 angeregt ) hilfreich, dass die Verbindung der verschiedenen elektrischen Komponenten zeigt. Deine Schaltbilder sind da wenig hilfreich.

P.S. Zu den Zustandsautomaten und parallelen, unabhängigen Zeitsteuerungen hatte ich im Stummiforum mal einen Thread aufgemacht. @Tommy56 hat das dann in komprimierter Form auf [seiner Website](https://www.wikinger-tommy.de/site/index.php?ziel=arduino) als [PDF gehostet](https://www.wikinger-tommy.de/arduino/Tutorial_millis.pdf). Dazu gabs auch ein paar [Sketche](https://www.wikinger-tommy.de/arduino/Tutorial_millis_Sketches.zip). Vielleicht hilft dir das ja.

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 11:59am UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/25 "2024-01-06T11:59:47Z")

</div>

Moin Zusammen, ja beim Recherchieren habe ich bereits die Mobatools und diese TaskMacro angeschaut, OOP ..... oje. Hat mich eher zu TaskMakro hingezogen weil das da direkt die Funktionen hat, die ich wohl brauche. Die Mobatools sind doch sehr umfangreich. Dies auf die Schnelle bekomme ich bis am 10.1 nicht hin.

- Da es mal funktioniert hat zu Version 0.9, muss der Fehler in den millis() Schlaufen 3 in den IF Würsten sein. Hatte gehofft, jemand mit einem Sperber Auge werde das Logikproblem/Timing Problem sehen. Werde nun in der Not die die millis() schlaufen abspecken oder noch weitere eröffnen und den Inhalt verteilen, Notfallplan eben. Die saubere Lösung mit OOP muss danach in Angriff genommen werden. **Mit einem Arduino Mega sollte doch dieses Miniprojekt mit 2 Weichen und 5 Sensoren möglich sein, auch Timingmässig ohne grosse Aufwände.....**  
PS: Stimmt die Kondensatoren habe ich alle in der Powerplatine 4 verschoben als ich dieses Schema auf 2 Platinen erweitern musste. Die Endwiederstände für den I2C sind jedoch da.  
PS2: In den Schlaufen habe ich das EVA Prinzip verwendet.

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 6, 2024, 12:10pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/26 "2024-01-06T12:10:27Z")

</div>

> [@train\_control](#):
>
> Die Mobatools sind doch sehr umfangreich

Zunächst bräuchtest Du ja nur die MoToButtons und die MoToTimer. das andere könntest Du erstmal ignorieren.

> [@train\_control](#):
>
> Mit einem Arduino Mega sollte doch dieses Miniprojekt mit 2 Weichen und 5 Sensoren möglich sein, auch Timingmässig ohne grosse Aufwände.....

Das hört sich erstmal danach an, dass es dazu noch nichtmal eines Mega bräuchte. Aber Du hast dieses 'Miniprojekt' ja noch nicht einmal vorgestellt ...

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [January 6, 2024, 2:03pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/27 "2024-01-06T14:03:39Z")

</div>

Hallo,

ich presche zwar ungern mit Code vor wenn nichts klar ist, aber vielleicht hilft es dir wenigstens bis 10.1. mit Spaghetticode den Tag Unfallfrei zu überstehen.

Also, wenn es weiterhin erstmal bei Spaghetticode notgedrungen bleibt, dann kannste vielleicht Ministrukturen verwenden, damit deine Zeit-Variablen getrennt bleiben und sich nicht ins Gehege kommen. Das ist fast "unsichtbares" OOP, wenn man so will. Genau genommen ist es deine Erste Klasse. Das am Rande. Musst nur saubere Namen verwenden um weiterhin durchzublicken. Damit hättest du klare Namen inkl. Kapselung ohne Namendurchnummerierungen. Das gleiche Schema kannste mit den MobaTools anwenden.

> **Bsp. Sketch**
>
> ```arduino
> struct Zeit {
> uint32_t lastMillis;
> const uint32_t intervall;
> };
> 
> Zeit sensorLinks {0, 100}; // lastMillis, intervall
> Zeit sensorRechts {0, 200}; 
> 
> uint32_t globaleZeit;
>   
> void setup (void)
> {
>   
> }
> 
> void loop (void)
> {
> globaleZeit = millis();
> 
> if (globaleZeit - sensorLinks.lastMillis >= sensorLinks.intervall)
> {
> sensorLinks.lastMillis = globaleZeit;
> // ... sinnvoller Code
> }
> 
> if (globaleZeit - sensorRechts.lastMillis >= sensorRechts.intervall)
> {
> sensorRechts.lastMillis = globaleZeit;
> // ... sinnvoller Code
> }
> }
> 
> ```

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 6, 2024, 2:18pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/28 "2024-01-06T14:18:10Z")

</div>

> [@train\_control](#):
>
> **Mit einem Arduino Mega sollte doch** dieses Miniprojekt mit 2 Weichen und 5 Sensoren möglich sein,

Hier mal ein ehemaliges 'Mini-Projekt' von mir mit 2 (servogesteuerten)Weichen, 2 Servo-Entkupplern und 6 Sensoren ( Ich hatte Lichtschranken verwendet ). Der Prototyp einer automatischen Umsetzanlage. Alles, was Du auf dem Video siehst, geht automatisch ohne manuellen Eingriff. Ich hatte mich ganz aufs Filmen beschränkt. Und gesteuert wird das alles von **einem Arduino proMicro** ( einschließlich der Fahrspannungsregelung ):

[![](https://europe1.discourse-cdn.com/arduino/original/4X/a/b/2/ab2ee4286c3e862c2da93c709b65b1ad5c9b7b0a.jpeg "Umsetzanlage2") ](https://www.youtube.com/watch?v=W0iD697DrCg)

Fertig eingebaut wurde das allerdings nie, da die gesamte Anlage abgebaut werden musste 🙁

---

<div class="post-metadata">

**Author:** ![Franz54](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/franz54/32/238811_2.png) [@Franz54](https://forum.arduino.cc/u/Franz54)\
**Post date:** [January 6, 2024, 2:36pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/29 "2024-01-06T14:36:12Z")

</div>

Hast du mal die die Zeit in Millis der Loop-Durchläufe über Serial.print() ausgegeben. Also jeder Loop die Millis zu beginn in einen Merker übergeben, das selbe an Ende des Loops in einen zweite Merker, daraus die Millis eines Durchlaufs rechnen und Serial.print() ausgeben. Dass du mal einen Überblick hast, wie lange ein Durchlauf minimal dauert und wie lange maximal. Daraus kannst du ja dann gut erkennen, ob es mit diesen Durchlaufzeiten überhaupt möglich ist, die Sesoren Zeitnah sicher zu erfassen. Also das wäre jedenfalls bei mir die erste Aktion, wenn das erkennen der Sonsorsignale manchmal oder auch oft nicht funktioniert.

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 6:10pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/30 "2024-01-06T18:10:16Z")

</div>

Gute Frage, das werde ich gleich tun

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 6:12pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/31 "2024-01-06T18:12:42Z")

</div>

Habe übrigens heute 2 Reed Sensoren (In den Glasröhrchen) getauscht die gehen offenbar nach kurzer Zeit defekt, trotz Sekundenkleber zum fixieren ;-). Welche Hallsensoren verwendest Du? Habe die Sketche mit den 3 Anschlüssen von eBay (verm auch China)

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 6:14pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/32 "2024-01-06T18:14:10Z")

</div>

Danke für den ersten OOP Sketch, denke ich muss mich nach dem 14.1 damit befassen. Gibts eine gute Literatur wo ich das dann auch verstehe?

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 6:21pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/33 "2024-01-06T18:21:36Z")

</div>

Sieht sehr gut aus, bei mir ist es ein Kreis mit zwei Weichen und einem Abstellgeleis. habe heute den ganzen Tag getestet und auch Code umgeschrieben / Auskommentiert, Sensoren gewechselt. Nun habe ich nur noch ein einziges Problem. Wenn der Zug auf dem Reedsensor zum steht kommt (Hauptgeleise), triggert er immer wieder den Zug den Blöcken: Anhalten, Stoppen, warten, etc. Ich muss den Block wo dier Zug steht abschalten bis der andere Zug (Abstellgeleise) ihn nach der Ausfahrt aktiviert . ich mus smir überlegen, ob ich das via Weichenstellungs Status oder via Abstellgeleise 1 sperre/freigebe.

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 6, 2024, 6:39pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/34 "2024-01-06T18:39:10Z")

</div>

> [@train\_control](#):
>
> bei mir ist es ein Kreis mit zwei Weichen und einem Abstellgeleis.

Dann zeichne das dochmal auf, markiere wo die Reed sind und erkläre wie die Züge fahren sollen.

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [January 6, 2024, 7:38pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/35 "2024-01-06T19:38:17Z")

</div>

Hallo,

für sein aktuelles akutes Problem benötigt er eine Flankenerkennung des Signals, denke ich. Als Vorlage vielleicht sowas.

> **Code - DetectSignalEdge**
>
> ```arduino
> class DetectSignalEdge
> {
> private:
> bool oldRead {false};
>      
> bool rising (const bool read) { 
> bool state = false;
> if (read && !oldRead) { state = true; } 
> oldRead = read;
> return state;
> }  
>     
> bool falling (const bool read) { 
> bool state = false;
> if (!read && oldRead) { state = true; } 
> oldRead = read;
> return state;
> } 
>       
> public:
> DetectSignalEdge() = default;
>     
> void init (const bool pinState) { oldRead = pinState; }
> bool risingEdge (const bool pinState) { return rising(pinState); }
> bool fallingEdge (const bool pinState) { return falling(pinState); }
> };
> 
> ```

Instanz erstellen:  
`DetectSignalEdge sensorLinks;`

Im setup Ruhepegel initialisieren:  
`sensorLinks.init(PIN-STATUS));` // kann auch statisch Low oder High sein

Steigende Flanke erkennen:

```arduino
bool xyz = sensorLinks.risingEdge(PIN-STATUS);

oder

if (sensorLinks.risingEdge(PIN-STATUS))
{
  // ... sinnvoller Code
}

```

Als Sensoren verwende ich je zwei TLE4964-3M. PCB ca. 12x6mm

> **Bilder**
>
> von oben
> 
> ![Sensor PCB drin](https://europe1.discourse-cdn.com/arduino/original/4X/b/d/4/bd4b07239dddef6b938e47f5b4d42b3c79a83750.jpeg)  
> von unten  
> ![Sensor PCB unten](https://europe1.discourse-cdn.com/arduino/original/4X/1/e/5/1e5b4667601399c1cac4643a714330e4a8c3df13.jpeg)

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 6, 2024, 8:17pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/36 "2024-01-06T20:17:46Z")

</div>

> [@Doc\_Arduino](#):
>
> für sein aktuelles akutes Problem benötigt er eine Flankenerkennung des Signals, denke ich.

Würde ich auch so sehen. Ginge aber auch mit den MoToButtons, die können das auch.  
Meiner Meinung nach macht eine statische Auswertung bei den Reed-Schaltern sowieso keine Sinn. Die Auswertung der LS in meinem obigen Video geht auch komplett über die MoToButtons ( obwohl da eher nichts prellt - aber die wahlweise statische oder pos./neg. Flankenauswertung macht vieles einfach ).

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 9:21pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/37 "2024-01-06T21:21:46Z")

</div>

> [@noiasca](#):
>
> ```arduino
> // Haupt Routine State Machine
> void loop() {
> // put your main code here, to run repeatedly:
> // Abfrage aktuelle "Zeit"
> currentTime = millis();
> // ------------------------------------------------------------------------------
> // Abfrage Reed Sensoren
> // ------------------------------------------------------------------------------
> if (currentTime - init1Time >= periode1_Reed) //test whether the period has elapsed
> {
> // softe Entprellong
> // Lesen des Pin Wertes 0 oder 1
> // Mit for Schleife ersetzen:
> for (int i = 0; i < max_reed_sensor_raw; i++) {
> reed_sensor_raw[i] = digitalRead(reed_sensor_Pin[i]);
> if ( reed_sensor_raw[i] == reed_sensor_merker[i]) {
> reed_sensor_entprellt[i] = reed_sensor_merker[i];
> } else {
> reed_sensor_merker[i] = reed_sensor_raw[i];
> }
> }
> init1Time = currentTime;
> 
> ```

Leider kommt da nur 0 oder 1 raus, offenbar kann dies die Serial.println(millis() - initXTimeMessung) Funktion wohl nicht

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [January 6, 2024, 9:31pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/39 "2024-01-06T21:31:56Z")

</div>

Hallo,

ich hatte vergessen das seine Reedkontakte prellen. Naja, ist doch nicht so einfach zu helfen ohne das Problem konkret zu kennen.

@TO:  
Fett und groß bedeutet in Foren zu schreien. Das mag niemand. Du kannst auch normale Antworten schreiben, wer will liest das auch so. egal wie du das darstellst.

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 9:40pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/40 "2024-01-06T21:40:53Z")

</div>

Wie könnte z.B. dieser Code: (Bahnhof 2, anhalten, Pause einlegen, weiter fahren -\> Wie oben beschrieben) in das OOP von Doc\_Arduino eingebettet werden? Ein wenig habe ich das ja schon so gemecht mit den millis()

```arduino
 // ====================================================
      // Reed Sensor 7 - Bahnhof 2 anhalten
      if (GPIO_U4_Led18_Reed7 == 1 && block[6] == 0 && bahnhof2_stop == 0 && GPIO_U1_Bahnhof2 == 1) { // Bahnhof 2 anhalten aber nur wenn Sensor 7 in Betrieb
        // Block 7 resp. 6 sperren
        block[6] = 1;
        bahnhof2_stop = 1;
        Fahrspannung_anhalten(); // Verlangsamen und anhalten
        // Serial.priintln("Bahnhof 2 ein");
        init8Time = currentTime; // Wartezeit Bahnhof 2
        Serial.println("bahnhof 2.1, Anhalten, Warten");
      }

      if (GPIO_U4_Led18_Reed7 == 1 && block[6] == 2 && bahnhof2_stop == 2 && GPIO_U1_Bahnhof2 == 1) { // Bahnhof 2 anfahren aber nur wenn Sensor 7 in Betrieb
        block[6] = 3;
        // Startwert in Warteschlaufe mitgegeben, da Fahrspannung_Anfahren(); übergangen wird
        Fahrspannung_anfahren(); // anfahren
        Serial.println("bahnhof 2.2, anfahren");
      }

      if (GPIO_U4_Led18_Reed7 == 1 && block[6] == 3 && bahnhof2_stop == 2 && (fahrregler_PWM_auto >= 110) && GPIO_U1_Bahnhof2 == 1) { // Bahnhof 2 anfahren aber nur wenn Sensor 7 in Betrieb
        block[6] = 4;
        bahnhof2_stop = 4;
        Fahrspannung_schneller(); // weiter fahren Rangierspannung bis max Trimmer Geschwindigkeit
        // vorherigen Block[0] frei geben
        block[0] = 0;
        Serial.println("bahnhof 2.3, Schneller");
      }

      // -------------------------------------------------------
      // Reed Sensor 6 - Bahnhof 1 anhalten
      if (GPIO_U4_Led17_Reed6 == 1 && block[5] == 0 && bahnhof1_stop == 0) { // Bahnhof 1 anhalten
        // Block 6 resp. [5] sperren
        block[5] = 1;
        bahnhof1_stop = 1;
        Fahrspannung_anhalten(); // Verlangsamen und anhalten
        init7Time = currentTime; // Wartezeit Bahnhof 1
        Serial.println("bahnhof 1.1 Anhalten, warten");

      }

      if (GPIO_U4_Led17_Reed6 == 1 && block[5] == 2 && bahnhof1_stop == 2) { // Bahnhof 1 anfahren
        block[5] = 3;
        bahnhof1_stop = 3;
        // Startwert in Warteschlaufe mitgegeben, da Fahrspannung_Anfahren(); übergangen wird
        Fahrspannung_anfahren(); // Bis Rangierfahrt Geschwindigkeit
        Serial.println("bahnhof 1.2 Anfahren");

      }

      if (GPIO_U4_Led17_Reed6 == 1 && block[5] == 3 && bahnhof1_stop == 3 && fahrregler_PWM_auto >= 100) { // Bahnhof 1 bescheunigen
        block[5] = 4;
        bahnhof1_stop = 4;
        Fahrspannung_schneller(); // weiter fahren Rangierspannung bis max Trimmer Geschwindigkeit
        // vorherigen Block[] frei geben
        block[6] = 0;
        bahnhof2_stop = 0;
        Serial.println("bahnhof 1.3, Schneller");
        if (GPIO_U1_Bahnhof2 == 0) { // Wenn keine Haltestelle an Bahnhof 2, dann vorhereigen Block [0] zurücksetzen
          Serial.println("bahnhof 2.x BFH 2");
          block[0] = 0;
        }
      }

```

Und es wird noch benötigt: die Wartezeit am Bahnhof: ini7Time und die Anhalte- und Anfahrtszeit init6aTime bis init6dTime

```arduino
// ------------------------------------------------------------------------------
  // Fahrmodus Automatisch Zähler vor- / rückwärts Timer Ein / Aus
  // ------------------------------------------------------------------------------
  if ((currentTime - init6aTime >= Fahrregler_Anfahrzeit) && auto_manuell_entprellt == 0) //Anfahren, schneller
  {
    // ---------------------------------------------
    if (fahrregler_PWM_auto > analog_trimmer_Fahrspannung_mapped) {
      fahrregler_PWM_auto = analog_trimmer_Fahrspannung_mapped; // maximal mit der Trimmerspannung fahren
    }
    // ---------------------------------------------
    // beschleunigen der Fahrgeschwindigkeit min/0 auf max_Rangiergeschwindigleit
    if ((fahrregler_auto_Status == 2) && (fahrregler_auto_Modus == 1)) {
      // beschleunigen von minimum bis Rangierfahrts Geschwindigkeit
      if (fahrregler_PWM_auto <= Fahrregler_PWM_Rangiergeschwindigkeit) {
        fahrregler_PWM_auto = fahrregler_PWM_auto + Fahrregler_PWM_Schritte; // Nur hoch zählen, wenn kleiner als Rangiergeschwindigkeit
        // oben -> fahrregler_PWM_auto = Fahrregler_PWM_Anfangs_Anfahrwert; // Aktuelle Fahrspannung im Automodus
        if (fahrregler_PWM_auto > Fahrregler_PWM_Rangiergeschwindigkeit) {
          fahrregler_PWM_auto = Fahrregler_PWM_Rangiergeschwindigkeit; // maximal mit der Rangiergeschwindigkeit fahren
        }
        Fahrspannung_Vorwaerts(fahrregler_PWM_auto);
      }
    }
    // ---------------------------------------------
    // beschleunigen von der Rangierfahrt bis zur max_fahrgeschwindigkeit analog_trimmer_Fahrspannung_mapped
    if ((fahrregler_auto_Status == 2) && (fahrregler_auto_Modus == 2)) {
      // beschleunigen von der Rangierfahrt bis zur max_fahrgeschwindigkeit analog_trimmer_Fahrspannung_mapped
      if (fahrregler_PWM_auto <= analog_trimmer_Fahrspannung_mapped) {
        fahrregler_PWM_auto = fahrregler_PWM_auto + Fahrregler_PWM_Schritte; // Nur hoch zählen, wenn kleiner als max Geschwindigkeit analog_trimmer_Fahrspannung_mapped
        // oben -> fahrregler_PWM_auto = Fahrregler_PWM_Anfangs_Anfahrwert; // Aktuelle Fahrspannung im Automodus
        if (fahrregler_PWM_auto > analog_trimmer_Fahrspannung_mapped) {
          fahrregler_PWM_auto = analog_trimmer_Fahrspannung_mapped; // maximal mit der Trimmer Spannung fahren
        }
        Fahrspannung_Vorwaerts(fahrregler_PWM_auto);
      }
    }

    init6aTime = currentTime;
  }

  if ((currentTime - init6bTime >= Fahrregler_Anhalten) && auto_manuell_entprellt == 0) // langsamer, anhalten, Stop
  {
    // ---------------------------------------------
    if (fahrregler_PWM_auto > analog_trimmer_Fahrspannung_mapped) {
      fahrregler_PWM_auto = analog_trimmer_Fahrspannung_mapped; // maximal mit der Trimmerspannung fahren
    }
    // verlangsamen der Fahrgeschwindigkeit auf max_Rangiergeschwindigleit (Trimmer) analog_trimmer_Fahrspannung_mapped
    if ((fahrregler_auto_Status == 1) && (fahrregler_auto_Modus == 3)) {
      // verlangsamen von max_fahrgeschwindigkeit analog_trimmer_Fahrspannung_mapped bis zur Rangiergeschwindigkeit
      if (fahrregler_PWM_auto >= Fahrregler_PWM_Rangiergeschwindigkeit) {
        fahrregler_PWM_auto = fahrregler_PWM_auto - Fahrregler_PWM_Schritte; // Nur runter zählen, wenn kleiner als max Geschwindigkeit analog_trimmer_Fahrspannung_mapped
        // oben -> fahrregler_PWM_auto = analog_trimmer_Fahrspannung_mapped; // Aktuelle Fahrspannung im Automodus
        Fahrspannung_Vorwaerts(fahrregler_PWM_auto); // Er fährt mit der Rangiergeschwindigkeit
        // Keine Statusänderung
      }
    }
    // ---------------------------------------------
    // verlangsamen von Rangierfahrts Geschwindigkeit auf 0
    if ((fahrregler_auto_Status == 1) && (fahrregler_auto_Modus == 4)) {
      // verlangsamen von Rangierfahrts Geschwindigkeit auf 0
      if (fahrregler_PWM_auto > Fahrregler_PWM_Rangiergeschwindigkeit) {
        fahrregler_PWM_auto = Fahrregler_PWM_Rangiergeschwindigkeit; // maximal mit der Rangiergeschwindigkeit fahren
      }
      if (fahrregler_PWM_auto >= 0) {
        fahrregler_PWM_auto = fahrregler_PWM_auto - Fahrregler_PWM_Schritte; // Nur runter zählen, wenn kleiner als Rangiergeschwindigkeit
        // oben -> fahrregler_PWM_auto = Fahrregler_PWM_Anfangs_Anfahrwert; // Aktuelle Fahrspannung im Automodus
        if (fahrregler_PWM_auto <= 50) { // Anhalten wenn Wert kleiner als 50 ist
          fahrregler_auto_Status = 0; // Anhalten / Stop
          fahrregler_auto_Modus = 0; // Anhalten / Stop
          fahrregler_PWM_auto = 0; // Fahrgeschwindigkeit auf 0
        }
        Fahrspannung_Vorwaerts(fahrregler_PWM_auto);
      }
    }
    // ---------------------------------------------
    // Anhalten, stoppen
    if ((fahrregler_auto_Status == 0) && (fahrregler_auto_Modus == 0)) {
      fahrregler_PWM_auto = 0;
      Fahrregler_Stop();
    }
    init6bTime = currentTime;
  }

  // -------------------------------------------------------------------------------------------------
  // Bahnhof 1 Wartezeit
  if ((currentTime - init7Time >= max_Bahnhof1_Wartezeit) && bahnhof1_stop == 1 && block[5] == 1) //test whether the period has elapsed
  {
    // Wartezeit beenden
    bahnhof1_stop = 2;
    block[5] = 2; // Block für Weiterfahrt freigeben
    // Anfangsfahrgeschwindigkeit
    // fahrregler_PWM_auto = Fahrregler_PWM_Anfangs_Anfahrwert;
    init7Time = currentTime;
  }

  // -------------------------------------------------------------------------------------------------
  // Bahnhof 2 Wartezeit
  if ((currentTime - init8Time >= max_Bahnhof2_Wartezeit) && (bahnhof2_stop == 1)) //test whether the period has elapsed
  {
    // Wartezeit beenden
    bahnhof2_stop = 2;
    block[6] = 2; // Block für Weiterfahrt freigeben
    // Anfangsfahrgeschwindigkeit
    // fahrregler_PWM_auto = Fahrregler_PWM_Anfangs_Anfahrwert;
    init8Time = currentTime;
  }

```

Hier die OOP Code von Doc\_Arduino, dies würde ich im Stress noch gerade verstehen _duck und weg_

```arduino
struct Zeit {
  uint32_t lastMillis;
  const uint32_t intervall;
};

Zeit sensorLinks {0, 100}; // lastMillis, intervall
Zeit sensorRechts {0, 200}; 

uint32_t globaleZeit;
  
void setup (void)
{
  
}

void loop (void)
{
  globaleZeit = millis();

  if (globaleZeit - sensorLinks.lastMillis >= sensorLinks.intervall)
  {
     sensorLinks.lastMillis = globaleZeit;
     // ... sinnvoller Code
  }

  if (globaleZeit - sensorRechts.lastMillis >= sensorRechts.intervall)
  {
     sensorRechts.lastMillis = globaleZeit;
     // ... sinnvoller Code
  }
}

Momentan sehe ich vor lauter Bäume das Land nicht mehr ....
```

---

<div class="post-metadata">

**Author:** ![train\_control](https://avatars.discourse-cdn.com/v4/letter/t/96bed5/32.png) [@train\_control](https://forum.arduino.cc/u/train_control)\
**Post date:** [January 6, 2024, 9:50pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/41 "2024-01-06T21:50:32Z")

</div>

@Doc_Arduino ich habe nichts angefettet, die beiden Sterne sind auch nicht drin. Beim Speichern hat er gemotzt wegen den Codetags wo ich jedoch drin habe. Also nicht ernst nehmen.

Habe eine minimale Entprellung drinnen

Werde nun mal noch eine Skizze der Anlage machen mit den 5 Sensoren wiobei die Problematik klar ist. Sensor erkennt das drüber fahren und führt wegen den verschachtelten millis() die Funktion nicht aus. Hoffe jemand sieht auf Grund des kleinen Beispiles Anhalten am Bahnhof 2 das Problem. (Seperater Post)

Vie Serial.println() die Standorte ausgeben, bleibt plötzlich stehen, mit 57600 oder 115200. Mit 19200 ist es nicht besser, 250000 bps geht gar nicht. Nur die im setup() aufgeführten Ausgaben erscheinen, die im loop() nicht mehr.

Kann es an der IDE 1.8.9 liegen?

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [January 6, 2024, 10:11pm UTC](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458/42 "2024-01-06T22:11:04Z")

</div>

> [@train\_control](#):
>
> `Momentan sehe ich vor lauter Bäume das Land nicht mehr ....`

Das glaube ich dir. Was jetzt nichts bringt ist wildes Probieren. Notfalls kannste nicht zur Ausstellung oder ohne Automatikbetrieb. Das ist nun einmal so.

Falls du ohne Pause Daten auf die Serielle raushaust, dabei kann der serielle Monitor fest gehen. Das Problem habe ich auch, liegt vermutlich an Java. Deswegen triggere ich solche Ausgaben immer, ähnliches Verfahren wie Flankenerkennung. Ist sowieso sinnvoll, weil was will man mit einem zugemüllten Monitor sinnvoll auswerten.

Fürs Loop-Timing messen noch eine andere Version von Whandall.  
Hiermit werden 1s lang die Anzahl der loop Durchläufe gezählt. Dann bekommste ein Gefühl was so los ist.

> **Sketch**
>
> ```arduino
> /* von Whandall */  
> 
> void setup (void)
> {
> Serial.begin(250000);
> }
> 
> void loop (void)
> {
> // dein Code ...
> 
> loopsPerSecond();
> }
> 
> void loopsPerSecond (void)
> {
> static uint32_t lastSecond {0};
> static uint32_t loopsPerSecond {0};
> 
> loopsPerSecond++;
> const uint32_t microSec {micros()};
>   
> if (microSec - lastSecond >= 1000000UL) {
> lastSecond = microSec;
> Serial.print(loopsPerSecond);
> Serial.print(F(" loops/s "));
> const uint32_t nanosPerLoop = 1000000000UL / loopsPerSecond;
> const uint32_t clocks = nanosPerLoop / 62.5;  
> Serial.print(clocks * 62.5 / 1000); 
> Serial.println(F(" us"));
> loopsPerSecond = 0;
> }
> }
> 
> ```

Was ich erkenne ist wohl, das du wie gesagt _GPIO\_U4\_Led18\_Reed7_ entprellen musst und dazu Flankenerkennung. Mehr kann ich dir dazu nicht sagen.

[Previous page](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458.md?page=1)

[Next page](https://forum.arduino.cc/t/moba-wechsel-pendelsteuerung/1207458.md?page=3)
