RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#51 von stadtbahnzug , 28.08.2020 22:16

Moin Mitreisende,

Danke für diesen sehr erleuchtenden Beitrag, hilft ungemein weiter.

LG Oliver


Viele Grüsse von der Ostsee

Berlin Stadtbahn - altersgerecht [Die Planung] - http://stummiforum.de/viewtopic.php?f=24&t=140111
Berlin Stadtbahn - altersgerecht [Der Aufbau] - folgt noch


 
stadtbahnzug
InterCity (IC)
Beiträge: 808
Registriert am: 02.04.2012
Homepage: Link
Ort: Stockelsdorf bei Lübeck
Spurweite H0
Stromart Digital


RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#52 von e69-fan ( gelöscht ) , 06.08.2021 14:04

Hallo Thomas,

Zitat von ThKaS im Beitrag #42
// Ampelsteuerung
 
// Ampelsteuerung an einer einfachen Kreuzung mit Fussgängerampel, mit Tag/Nachtmodus, mit Wechselblinker
// Die Ampelphasen werden über eine Tabelle definiert
 
#include <MobaTools.h>







könntest Du bitte den Sketch nochmal neu reinstellen, da er nun völlig neu und unbrauchbar formatiert ist. Ist anscheinend mit allen Sketchen passiert die nicht als "spoiler" hinterlegt sind.

Siehe Beitrag 42 - Zeile 7 z.B.

Vielen Dank


e69-fan

RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#53 von Matthias_h0 , 06.08.2021 15:05

Hallo
Du kannst den Sketch in der Arduino IDE neu formatieren.

Dazu im Menü Werkzeuge -> Automatische Formatierung auswählen oder Strg+T drücken.

Viele Grüße,
Matthias


MobaLedLib Wiki


Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#54 von e69-fan ( gelöscht ) , 06.08.2021 16:06

Hallo Matthias,

hast Du es ausprobiert ?

Bei mir funktioniert es nicht. Probiere mal nur folgende Zeile aus : #include <MobaTools.h>

Servus Wolfgang


e69-fan

RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#55 von Matthias_h0 , 06.08.2021 16:35

Hallo

Die automatische Formatierung ändert das tatsächlich nicht, das hatte ich übersehen. Dabei werden nur alle Zeilen wieder passend eingerückt, da bei der Einrückung des Codes auch einiges geändert wurde durch das neue Forum.

Aber mit zwei, drei kleinen Anpassungen läuft das Programm wieder. Ich habe das Programm mal angepasst. Das einzige, was zu ändern war, waren die < bzw. > Zeichen.

Hier ist das Programm jetzt mit richtiger Formatierung:

1
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
 

// Ampelsteuerung
 
// Ampelsteuerung an einer einfachen Kreuzung mit Fussgängerampel, mit Tag/Nachtmodus, mit Wechselblinker
// Die Ampelphasen werden über eine Tabelle definiert
 
#include <MobaTools.h>
//vvvvvvvvvvvvvvvvvvvvvvvvv BEGIN WECHSELBLINKER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Definitionen für den Wechselblinker
// Festlegen der Anschlüsse (Pinnummer) für Ein- und Ausgänge
const byte linksPin = 6; // linke Lampe
const byte rechtsPin = 7; // rechte Lampe
const byte belegtPin = 8; // Eingang 'Zug kommt'
 

// Benötigte MobaTools Objekte:
EggTimer StoppUhr; // Zum Messen von Zeiten
EggTimer StoppUhr2; // Zum Messen von Zeit Nacht
SoftLed LampeLinks;
SoftLed LampeRechts;
SoftLed LampeAmpelGelbNeben;
 
// Zeiten für den Blinkrhythmus ( in ms )
const int STARTZEIT = 400;
const int BLINKZEIT = 500;
const int FADEZEIT = 450;
 

EggTimer EntPrellung; // Zur Tasterentporellung
const int PRELLZEIT = 100;
 
// Variable
boolean bueBelegt; // = TRUE, wenn sich ein Zug im Bereich des Bue befindet
byte wBlinkerZustand; // aktueller Zustand unseres Blinkerautomaten
//^^^^^^^^^^^^^^^^^^^^^^^^ ENDE WECHSELBLINKER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
//vvvvvvvvvvvvvvvvvvvvvvvvv BEGIN AmpelNacht vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Definitionen für Ampelnacht, blinken nur Nebenstrasse
// Festlegen der Anschlüsse (Pinnummer) für Ein- und Ausgänge
const byte belegtPin2 = 9; // Eingang "es ist Nacht"
 
// Zeiten für den Blinkrhythmus Nacht ( in ms )
const int STARTZEIT2 = 400;
const int BLINKZEIT2 = 1200;
const int FADEZEIT2 = 1200;
const byte NebenGelbPin = A4; // Nebenstrasse Ampel Gelb
 
// Variable
boolean bueBelegt2; // = TRUE, wenn D9 geschlossen, dann Nacht
byte wBlinkerZustand2; // aktueller Zustand unseres Blinkerautomaten Nacht
//^^^^^^^^^^^^^^^^^^^^^^^^ ENDE AmpelNacht ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

//vvvvvvvvvvvvvvvvvvvvvvvv BEGIN AMPELSTEUERUNG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 
// Definition der Ausgangspins in Spalte 0 der Ampeltabelle
// Tabelle für die Ampelzustände ( Index 1 ... )
/*
const byte AmpelTabelle [][9] = {
// Ampelphase: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
// Tabellenindex: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
{ A0 ,OFF ,OFF , ON , ON , ON , ON , ON , ON }, // hauptRot
{ A1 ,OFF , ON ,OFF ,OFF ,OFF ,OFF ,OFF , ON }, // hauptGelb
{ A2 , ON ,OFF ,OFF ,OFF ,OFF ,OFF ,OFF ,OFF }, // hauptGruen
{ A3 , ON , ON , ON , ON ,OFF ,OFF , ON , ON }, // nebenRot
{ A4 ,OFF ,OFF ,OFF , ON ,OFF , ON ,OFF ,OFF }, // nebenGelb
{ A5 ,OFF ,OFF ,OFF ,OFF , ON ,OFF ,OFF ,OFF }, // nebenGruen
{ 0 , 5 , 2 , 2 , 2 , 4 , 2 , 2 , 2 } // zeitDauer
};
*/
const byte AmpelTabelle [][12] = {
// Ampelphase: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
// Tabellenindex: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
{ A0 , OFF , OFF , OFF , ON , ON , ON , ON , ON , ON , ON , OFF}, // hauptRot
{ 3 , ON , ON , ON , ON , ON , OFF , ON , ON , ON , ON , OFF}, // hauptRotFRot
{ A1 , OFF , OFF, ON , OFF , OFF , OFF , OFF , OFF , OFF , ON , OFF}, // hauptGelb
{ A2 , ON , ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF}, // hauptGruen
{ 2 , OFF , OFF , OFF , OFF , OFF , ON , OFF , OFF , OFF , OFF , OFF}, // hauptGruenFGruen
{ A3 , ON , ON , ON , ON , ON , OFF , OFF , OFF , ON , ON , OFF}, // nebenRot
{ 5 , OFF , ON , ON , ON , ON , ON , ON , ON , ON , ON , OFF}, // nebenRotFRot
{ A4 , OFF , OFF , OFF , OFF , ON , OFF , OFF , ON , OFF , OFF , OFF}, // nebenGelb
{ A5 , OFF , OFF , OFF , OFF , OFF , ON , ON , OFF , OFF , OFF , OFF}, // nebenGruen
{ 4 , ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF}, // nebenGruenFGruen
{ 0 , 20 , 2 , 2 , 3 , 2 , 10 , 2 , 2 , 3 , 2 , 60} // zeitDauer
};
 
// Die folgenden beiden Zeilen berechnen aus der Tabelle ( Spalten+Zeilenanzahl ) die
// Zahl der Ampelphasen ( Spaltenzahl-1) , und die Zahl der Leds ( Zeilenzahl - 1 )
const byte PhasenAnzahl = sizeof(AmpelTabelle[0]) - 2;
const byte PhasenAnzahl2 = sizeof(AmpelTabelle[0]) - 1;
const byte LedAnzahl = sizeof(AmpelTabelle) / sizeof(AmpelTabelle[0]) - 1;
const byte zeitDauerIx = LedAnzahl; // Index für die Zeit ist direkt hinter den Leds
byte ampelPhase; // läuft von 1 .. PhasenAnzahl (Index 0 ist die Pinnr )
 
// Einrichten der notwendigen MoBaTools Objekte:
EggTimer AmpelTimer;
SoftLed AmpelLed[LedAnzahl];
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ENDE AMPELSTEUERUNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

void setup() {
 

//vvvvvvvvvvvvvvvvvvvvvvvvv BEGIN WECHSELBLINKER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Initiierungen Wechselblinker
// Pins einrichten
pinMode( belegtPin, INPUT_PULLUP ); // Mit einem Schalter nach GND wird Blinker eingeschaltet
LampeLinks.attach( linksPin ); // Zuordnung der Softleds zu den Ausgangspins
LampeRechts.attach( rechtsPin );
LampeLinks.riseTime( FADEZEIT ); // Überblendzeit einstellen
LampeRechts.riseTime( FADEZEIT );
 
wBlinkerZustand = 1; // Startzustand des Blinkautomaten.
//^^^^^^^^^^^^^^^^^^^^^^^^ ENDE WECHSELBLINKER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
//vvvvvvvvvvvvvvvvvvvvvvvvv BEGIN Nacht vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Initiierungen Wechselblinker
// Pins einrichten
pinMode( belegtPin2, INPUT_PULLUP ); // Mit einem Schalter nach GND wird Blinker eingeschaltet
LampeAmpelGelbNeben.attach( NebenGelbPin ); // Zuordnung der Softleds zu den Ausgangspins
// LampeRechts.attach( rechtsPin );
LampeAmpelGelbNeben.riseTime( FADEZEIT ); // Überblendzeit einstellen
// LampeRechts.riseTime( FADEZEIT );
 
wBlinkerZustand2 = 1; // Startzustand des Blinkautomaten.
//^^^^^^^^^^^^^^^^^^^^^^^^ ENDE WECHSELBLINKER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

//vvvvvvvvvvvvvvvvvvvvvvvv BEGIN AMPELSTEUERUNG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 

// Softled Objekte initiieren
for ( byte ledIx = 0; ledIx < LedAnzahl; ledIx ++ ) {
AmpelLed[ledIx].attach( AmpelTabelle[ledIx][0] );
AmpelLed[ledIx].riseTime( 200 );
}
ampelPhase = 1; // Das System startet mit freier Fahrt auf der Hauptstraße
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ENDE AMPELSTEUERUNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//----------------------------------------------------------------------
 
}
 
void loop() {
 
//vvvvvvvvvvvvvvvvvvvvvvvvv BEGIN WECHSELBLINKER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Wechselblinkerautomat
// Belegtzusatnd abfragen. Das machen wir hier jetzterstmal ganz einfach: Letztendlich
// schalten wir mit dem Eingang einfach den Wechselblinker ein und aus.
// Im realen Praxisfall könnte hier gegebenenfalls auch ein komplexere Logik stehen, um zu
// erkennen, ob ein Zug sich nähert oder den Bü wieder verlassen hat.
//if ( not EntPrellung.running() ) {
// EntPrellung.setTime( PRELLZEIT );
bueBelegt = not digitalRead( belegtPin ); // ein LOW-Level am Eingangspin schaltet den Blinker ein
//}
 
switch ( wBlinkerZustand ) {
// je nach Wert der Variable wBlinkerZustand, wird die entsprechende 'case' Zeile angesprungen
case 1: // Grundzustand, abfragen, ob sich ein Zug nähert ( z.B. über einen Belegtmelder )
if ( bueBelegt ) {
// Der Zug ist in den Belegtabschnitt vor der Schranke eingefahren
// beide Lampen einschalten
LampeLinks.on();
LampeRechts.on();
// Stoppuhr mit der Zeit die beide Lampen an sein sollen vorbelegen
StoppUhr.setTime( STARTZEIT ); // StoppUhr 'aufziehen'
// in den 2. Zustand wechseln
wBlinkerZustand = 2; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 2 ausgeführt
}
break; // Ende der Anweisungen für den 1. Zustand
//-------------------------------------------------------------------------
case 2: // beide Lampen ein, wir fragen ab, ob die Stoppuhr abgelaufen ist.
if ( not StoppUhr.running() ) {
// Die Stoppuhr läuft nicht mehr, die Zeit ist um
LampeRechts.off();
StoppUhr.setTime( BLINKZEIT ); // Stoppuhr 'aufziehen'
// in den 3. Zustand wechseln
wBlinkerZustand = 3; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 3 ausgeführt
}
break; // Ende der Anweisungen für den 2. Zustand
//-------------------------------------------------------------------------
case 3: // linke Lampen ist an, rechte aus: wir fragen ab, ob die Stoppuhr abgelaufen ist.
if ( not StoppUhr.running() ) {
// Die Stoppuhr läuft nicht mehr, die Zeit ist um, Lampen umschalten
LampeLinks.off();
// Im 3. Zustand müssen wir auch noch abfragen, ob der Zug den Belegtabschnitt verlassen hat
if ( not bueBelegt ) {
// Der Zug ist komplett über den Bü gefahren, die Straße ist wieder frei
// Beide Lampen sind aus!
// wieder in den 1. Zustand wechseln. Eine Zeitüberwachung wird nicht gebraucht
wBlinkerZustand = 1; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 1 ausgeführt
} else {
LampeRechts.on();
StoppUhr.setTime( BLINKZEIT ); // Stoppuhr 'aufziehen'
// wieder in den 4. Zustand wechseln
wBlinkerZustand = 4; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 3 ausgeführt
}
}
break; // Ende der Anweisungen für den 3. Zustand
//-------------------------------------------------------------------------
case 4: // linke Lampen ist aus, rechte an: wir fragen ab, ob die Stoppuhr abgelaufen ist.
if ( not StoppUhr.running() ) {
// Die Stoppuhr läuft nicht mehr, die Zeit ist um, Lampen umschalten
LampeRechts.off();
// Im 4. Zustand müssen wir auch noch abfragen, ob der Zug den Belegtabschnitt verlassen hat
if ( not bueBelegt ) {
// Der Zug ist komplett über den Bü gefahren, die Straße ist wieder frei
// Beide Lampen sind aus!
// wieder in den 1. Zustand wechseln. Eine Zeitüberwachung wird nicht gebraucht
wBlinkerZustand = 1; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 1 ausgeführt
} else {
LampeLinks.on();
StoppUhr.setTime( BLINKZEIT ); // Stoppuhr 'aufziehen'
// wieder in den 3. Zustand wechseln
wBlinkerZustand = 3; // Ab dem nächsten loop-Durchlauf werden nur die Anweisungen des case 3 ausgeführt
}
}
break; // Ende der Anweisungen für den 4. Zustand
} // Ende des switch-Blockes
//^^^^^^^^^^^^^^^^^^^^^^^^ ENDE WECHSELBLINKER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
//vvvvvvvvvvvvvvvvvvvvvvvv BEGIN AMPELSTEUERUNG Tag / Nacht vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 
//if ( not EntPrellung.running() ) {
// EntPrellung.setTime( PRELLZEIT );
bueBelegt2 = not digitalRead( belegtPin2 ); // ein LOW-Level am Eingangspin schaltet den Nachtmodus ein
 
switch ( wBlinkerZustand2 ) {
case 1: // NachtModus
if ( bueBelegt2 ) {
ampelPhase = 12; // In Array SPalte alles OFF setzen
for ( byte ledIx = 0; ledIx < LedAnzahl; ledIx ++ ) {
AmpelLed[ledIx].write( AmpelTabelle[ledIx][ampelPhase] ); // Ampel-LEDs ausschalten
}
if ( not StoppUhr2.running() ) {
LampeAmpelGelbNeben.on();
StoppUhr2.setTime( BLINKZEIT2 ); // Stoppuhr 'aufziehen' für GelbLicht Nebenstrasse
LampeAmpelGelbNeben.off();
wBlinkerZustand2 = 1;
}
}
else
wBlinkerZustand2 = 2;
break;
 
case 2: // TagModus
 
// Tabellengesteuerte Ampel
 
if ( not bueBelegt2 ) {
LampeAmpelGelbNeben.off();
if ( !AmpelTimer.running() ) {
// Zeit abgelaufen
// Ampeln schalten
for ( byte ledIx = 0; ledIx < LedAnzahl; ledIx ++ ) {
AmpelLed[ledIx].write( AmpelTabelle[ledIx][ampelPhase] );
}
// Zeit setzen ( da der Timer in ms rechnet, müssen die Tabellenwerte mit 1000
// multipliziert werden )
AmpelTimer.setTime( AmpelTabelle[zeitDauerIx][ampelPhase] * 1000 );
// Merker weiterrückem
if ( ampelPhase <= PhasenAnzahl ) {
// Tabellenende erreicht
ampelPhase = 1;
} else {
ampelPhase++;
}
wBlinkerZustand2 = 2;
}
wBlinkerZustand2 = 1;
}
break;
 
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ENDE AMPELSTEUERUNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
}
 

 



Viele Grüße
Matthias


MobaLedLib Wiki


Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#56 von MicroBahner , 08.08.2021 22:30

Hallo,
das Problem liegt darin, dass bei der Übernahme ins neue Forum bei den Sketchen die Sonderzeichen in HTML-Entities umgewandelt wurden. Damit wurden die Sketche praktisch zerstört.
Ich habe aber eine Webseite gefunden, die das wieder rückgängig machen kann, also die HTML Entities wieder in das UTF8 Format zurückwandelt:
https://onlineutf8tools.com/convert-html-entities-to-utf8
Damit lassen sich die Sketche wieder ins korrekte Format zurückwandeln.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


Matthias_h0, Kriwatsch und Bodo haben sich bedankt!
 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#57 von e69-fan ( gelöscht ) , 09.08.2021 13:54

Hallo Franz-Peter,



vielen Dank für die Lösung. Es wäre echt schade gewesen, wenn die "alten" Sketche unbrauchbar sind.
Das online-tool funktioniert tadellos.

Nochmals vielen Dank und Servus


e69-fan

RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#58 von e69-fan ( gelöscht ) , 23.08.2021 18:04

Hallo Arduinospezialisten,

ich versuche gerade den Sketch um eine 3. Ampel zu erweitern.

Bild entfernt (keine Rechte)


So, nun stehe ich auf dem berühmten Schlauch.

Wie kann ich Relais einbinden welche nur bei "Grün" umschalten ?

1
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
 
[code]
 

/*
* https://www.stummiforum.de/t163493f21-Arduino-Zeitsteuerungen-ohne-Delay-ein-kleines-Tutorial-1.html
* Beitrag: 27
 
*/


// Ampelsteuerung

// Ampelsteuerung an einer einspurigen Strasse mit Bushaltestelle
// Die Ampelphasen werden über eine Tabelle definiert

#include <MobaTools.h>

// Definition der Ausgangspins:
 
const byte hRotPin = A0; // Ampel an der Hauptstrasse, rechts
const byte hGelbPin = A1;
const byte hGruenPin = A2;
 
const byte nRotPin = A3; // Ampel an der Hauptstrasse, links
const byte nGelbPin = A4;
const byte nGruenPin = A5;
 
const byte BusRotPin = 2; // Ampel an der Bushaltestelle
const byte BusGelbPin = 3;
const byte BusGruenPin = 4;

 
// Tabelle für die Ampelzustände
 
// Ampelphase: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
// -------------------------------------------------------------------------------------------------------
// Tabellenindex: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
// -------------------------------------------------------------------------------------------------------
const byte zeitDauer [] = { 30 , 3 , 3 , 3 , 20 , 3 , 3 , 3 , 10 , 3 , 3 , 3 };
// -------------------------------------------------------------------------------------------------------
const bool hauptRot [] = { OFF , OFF , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON };
const bool hauptGelb [] = { OFF , ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , ON };
const bool hauptGruen [] = { ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF };
const bool nebenRot [] = { ON , ON , ON , ON , OFF , OFF , ON , ON , ON , ON , ON , ON };
const bool nebenGelb [] = { OFF , OFF , OFF , ON , OFF , ON , OFF , OFF , OFF , OFF , OFF , OFF };
const bool nebenGruen [] = { OFF , OFF , OFF , OFF , ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF };
 
const bool BusRot [] = { ON , ON , ON , ON , ON , ON , ON , ON , OFF , OFF , ON , ON };
const bool BusGelb [] = { OFF , OFF , OFF , OFF , OFF , OFF , OFF , ON , OFF , ON , OFF , OFF };
const bool BusGruen [] = { OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , ON , OFF , OFF , OFF };

const byte tabMax = sizeof(zeitDauer)-1; // Tabellenindex startet bei 0 ( deshalb die -1 für den höchsten Index )
byte ampelTabIx; // läuft von 0 .. 7

// Einrichten der notwendigen MoBaTools Objekte:
MoToTimer AmpelTimer;
MoToSoftLed hRot;
MoToSoftLed hGelb;
MoToSoftLed hGruen;
MoToSoftLed nRot;
MoToSoftLed nGelb;
MoToSoftLed nGruen;
MoToSoftLed nBusRot;
MoToSoftLed nBusGelb;
MoToSoftLed nBusGruen;

 
void setup() {
// Softled Objekte initiieren

hRot.attach( hRotPin );
hRot.riseTime( 200 );
hGelb.attach( hGelbPin );
hGelb.riseTime( 200 );
hGruen.attach( hGruenPin );
hGruen.riseTime( 200 );
// --------------------------------------------------------------------------
nRot.attach( nRotPin );
nRot.riseTime( 200 );
nGelb.attach( nGelbPin );
nGelb.riseTime( 200 );
nGruen.attach( nGruenPin );
nGruen.riseTime( 200 );
// --------------------------------------------------------------------------
nBusRot.attach( BusRotPin );
nBusRot.riseTime( 200 );
nBusGelb.attach( BusGelbPin );
nBusGelb.riseTime( 200 );
nBusGruen.attach( BusGruenPin );
nBusGruen.riseTime( 200 );
// --------------------------------------------------------------------------

ampelTabIx = 2; // Das System startet mit " alle Ampeln = ROT "

}

void loop() {
// Tabellengesteuerte Ampel

if( !AmpelTimer.running() ) {
// Zeit abgelaufen
// Ampel schalten

hRot.write( hauptRot[ampelTabIx] );
hGelb.write( hauptGelb[ampelTabIx] );
hGruen.write( hauptGruen[ampelTabIx] );
nRot.write( nebenRot[ampelTabIx] );
nGelb.write( nebenGelb[ampelTabIx] );
nGruen.write( nebenGruen[ampelTabIx] );
nBusRot.write( BusRot[ampelTabIx] );
nBusGelb.write( BusGelb[ampelTabIx] );
nBusGruen.write( BusGruen[ampelTabIx] );

// Zeit setzen ( da der Timer in ms rechnet, müssen die Tabellenwerte mit 1000 multipliziert werden )

AmpelTimer.setTime( zeitDauer[ampelTabIx] * 1000 );

// Merker weiterrückem
if( ampelTabIx >= tabMax ) {
// Tabellenende erreicht
ampelTabIx = 0;

} else {

ampelTabIx++;
}
}
}
 

[/code]
 



Vielen Dank - und Servus


e69-fan
zuletzt bearbeitet 26.08.2021 14:00 | Top

RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#59 von MicroBahner , 01.09.2021 09:24

Zitat von e69-fan im Beitrag #58
Wie kann ich Relais einbinden welche nur bei "Grün" umschalten ?


So ganz verstehe ich die Frage nicht. Kannst Du nicht einfach das Relais parallel zur jeweiligen grünen LED ansteuern? Oder funktioniert der ganze Sketch noch nicht so wie Du es möchtest?


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#60 von e69-fan ( gelöscht ) , 01.09.2021 11:02

Hallo Franz-Peter,

ich wollte die Relaisfunktion in die "array-Tabelle" aufnehmen und mit ON / OFF schalten.

Der Sketch funktioniert mit den Ampeln einwandfrei.


e69-fan

RE: Arduino: Zeitsteuerungen ohne Delay - ein kleines Tutorial

#61 von MicroBahner , 01.09.2021 15:57

Zitat von e69-fan im Beitrag #60
ich wollte die Relaisfunktion in die "array-Tabelle" aufnehmen und mit ON / OFF schalten.

Das kannst Du dann doch genauso machen wie deine 3 Leds für die zusätzliche Ampel. Ob da letztendlich ein Relais oder eine LED am Pin hängt ist doch egal. Also einfach noch eine zusätzliche Zeile für das Relais.

Wenn Du als Basis den Sketch aus #39 genommen hättest, wäre es noch einfacher. Da muss man zur Erweiterung nur die Tabelle ändern, der Rest kann unverändert bleiben.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog

zuletzt bearbeitet 01.09.2021 | Top

   

passende Stecker / Buchsen zum Arduino Nano
Märklin Sounddecoder defekt

  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz