RE: NodeMCU - Messwagen WLAN

#1 von Bubikopf , 09.06.2018 15:20

Hallo zusammen,
mich hat die Idee eines einfachen Messwagens mit Arduino (siehe Moppes Messwagen) nicht losgelassen. Ich habe mir folgende Gedanken gemacht:

Mit Hilfe eines NodeMCU-Boards ("Arduino mit WLAN") kann der "Messwagen 2.0" die gemessenen Werte auf einen integrierten WebServer schreiben, der dann per Browser von einem beliebigen Endgerät angezeigt wird. Zusätzlich (quasi als Kontrolle) bekommt der Messwagen ein kleines I2C-Display. Übertragen (gemessen bzw. gerechnet) werden Drehzahl der Achse, zurückgelegte Strecke in cm/ km und Geschwindigkeit in m/s bzw. km/h. Die ersten Werte sind im Modellmassstab, die zweiten Werten jeweils im Original-Massstab. Die Drehzahl wird am Wagen per Hal-Sensor und NeoDym-Magnet erfasst.

Die ersten Schritte habe ich bereits umgesetzt:
- Sketch für einen Arduino Nano für einen einfachen Impulszähler
- Darstellung des Zählers auf dem Display
- NodeMCU-Board (eBay)bestellt
- Hall-Sensor (eBay)bestellt

Hier der ersten Testaufbau mit der einfachen Zählerschaltung und einem Arduino Nano. Wird der Taster gedrückt (später kommt der Impuls vom Hallensor je Radumdrehung), erhöht sich der Zähler um "1".





vG Uwe


„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“
Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947


_MoBaFlo_ hat sich bedankt!
 
Bubikopf
InterCityExpress (ICE)
Beiträge: 2.064
Registriert am: 27.04.2005
Gleise C-Gleis
Spurweite H0
Steuerung MS II
Stromart AC, Digital


RE: NodeMCU - Messwagen WLAN

#2 von 4fangnix , 05.10.2018 07:52

Hallo Uwe,

ist etwas aus dem NodeMCU-Messwagen geworden?
Einige NodeMCU habe ich hier auch herumfliegen, mich bislang aber noch nicht damit beschäftigt.
Einen Messwagen auf dieser Basis finde ich sehr interessant.

Schöne Grüße
Armin


Rocrail; 1x OpenDCC GBMboost, 1x BiDiB RF-Basis (OpenCar), 5x GBM16T, 2x LightControl, 2x OneControl, 5x Mobalist, DMX-RGB-Dimmer;
MobaLedLib (kann > 48.000 LED via WS2811 oder > 16.000 WS2812-RGB-LED steuern und/oder Servos, Sounds, Stepper, DMX und Displays);
Intellibox; Märklin C- und K-Gleis, Bahn im Aufbau.


4fangnix  
4fangnix
InterRegioExpress (IRE)
Beiträge: 270
Registriert am: 18.10.2015
Ort: Weiterstadt
Gleise K-Gleis, C-Gleis
Spurweite H0
Stromart Digital


RE: NodeMCU - Messwagen WLAN

#3 von Bubikopf , 05.10.2018 08:10

Hallo Armin,
ich habe jetzt erst mal den Messwagen mit dem Arduino nano fertig gestellt. Siehe viewtopic.php?f=21&t=161968.

Jetzt werde ich mich um den "WLAN" Messwagen kümmern...

vG Uwe


„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“
Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947


 
Bubikopf
InterCityExpress (ICE)
Beiträge: 2.064
Registriert am: 27.04.2005
Gleise C-Gleis
Spurweite H0
Steuerung MS II
Stromart AC, Digital


RE: NodeMCU - Messwagen WLAN

#4 von 4fangnix , 05.10.2018 12:49

Hallo Uwe,

dann bin ich mal gespannt. Das ist ja ein Hobby im Hobby was Du da betreibst.
Finde ich klasse.

Viel Grüße aus Hessen
Armin


Rocrail; 1x OpenDCC GBMboost, 1x BiDiB RF-Basis (OpenCar), 5x GBM16T, 2x LightControl, 2x OneControl, 5x Mobalist, DMX-RGB-Dimmer;
MobaLedLib (kann > 48.000 LED via WS2811 oder > 16.000 WS2812-RGB-LED steuern und/oder Servos, Sounds, Stepper, DMX und Displays);
Intellibox; Märklin C- und K-Gleis, Bahn im Aufbau.


4fangnix  
4fangnix
InterRegioExpress (IRE)
Beiträge: 270
Registriert am: 18.10.2015
Ort: Weiterstadt
Gleise K-Gleis, C-Gleis
Spurweite H0
Stromart Digital


RE: NodeMCU - Messwagen WLAN

#5 von wulf43 , 18.03.2019 17:55

Hallo,
Die Idee, einen NodeMCU Board für einen Messwagen einzusetzen, fand ich interessant und habe sie aufgegriffen und umgesetzt.
Hier ein paar Anmerkungen zur Ausführung:
- Das Messergebnis wird per WLAN im Heimnetz eine auf Web-Seite übertragen.
- Von der Web-Seite aus erfolgt die Bedienung durch Button. Der Messvorgang kann so gezielt ein- und ausgeschaltet werden.
- Als Modi existieren BEREIT, MESSUNG und ERGEBNIS
- Die Messung kann gezielt gestartet und gestoppt werden. Der entsprechend Button wechselt Beschriftung und Funktion.
- Button RESET löscht Messergebnis und stellt erneut die Bereitschaft wieder her.
- Messgeber ist eine Scheibe mit vier Schlitzen, der von einer Lichtschranke abgetastet wird. Pro Radumdrehung entstehen also vier Impulse. Ein Weginkrement ist so ca. 8,2 mm groß. Jedem Impuls wird die jeweilige Zeit zugeordnet. Aus diesen Werten lassen sich Weg und Geschwindigkeit bestimmen.
- Auf eine Anzeige per Display im Wagon wurde verzichtet, da eine Beobachtung während des Einsatzes auf der Anlage nur stark eingeschränkt möglich ist.
- Ein 2-poliger Schiebeschalter mit drei Positionen dient für die Funktionseinstellungen.
Stellung 0: Aus 1: Stromversorgung NodeMCU 2: Ladezustand
Über eine Steckleiste kann die Verbindung zur externen Ladeplatine hergestellt werden. Der Akku ist ebenfalls per Stecker angeschlossen. Kann also leicht abgeklemmt werden, wenn er für andere Zwecke gebraucht wird. (Natürlich kann er auch direkt an die Ladeplatine angeschlossen werden. Extern also. Ist quasi „doppelt gemoppelt“. Aber den Schiebeschalter hatte ich rumliegen).

Nun aber ein paar Bilder.


Messwagen


Schlitzscheibe und Lichtschranke


Handydsiplay : Bereit, Messung Ergebnis

Gruß Wulf


Meine Anlage: Modellbahnprojekt "unendliche Geschichte"
http://stummiforum.de/viewtopic.php?f=64...513940#p1509012


_MoBaFlo_ hat sich bedankt!
wulf43  
wulf43
InterRegio (IR)
Beiträge: 186
Registriert am: 28.02.2013
Gleise K-GLEIS
Spurweite H0
Steuerung Eigenentwicklung Software
Stromart AC, Digital


RE: NodeMCU - Messwagen WLAN

#6 von 4fangnix , 19.03.2019 10:37

Hallo Wulf,

sensationell.
Sobald ich meinen Schattenbahnhof fertig getestet habe, werde ich mich ebenfalls mit den NodeMCU beschäftigen.

Schöne Grüße aus Weiterstadt
Armin


Rocrail; 1x OpenDCC GBMboost, 1x BiDiB RF-Basis (OpenCar), 5x GBM16T, 2x LightControl, 2x OneControl, 5x Mobalist, DMX-RGB-Dimmer;
MobaLedLib (kann > 48.000 LED via WS2811 oder > 16.000 WS2812-RGB-LED steuern und/oder Servos, Sounds, Stepper, DMX und Displays);
Intellibox; Märklin C- und K-Gleis, Bahn im Aufbau.


4fangnix  
4fangnix
InterRegioExpress (IRE)
Beiträge: 270
Registriert am: 18.10.2015
Ort: Weiterstadt
Gleise K-Gleis, C-Gleis
Spurweite H0
Stromart Digital


RE: NodeMCU - Messwagen WLAN

#7 von wulf43 , 19.03.2019 12:35

Hallo Armin,
vielen Dank und viel Erfolg Beim Aufbau des Schattenbahnhofs und der Weiterentwicklung Deiner Anlage.
Gruß Wulf


Meine Anlage: Modellbahnprojekt "unendliche Geschichte"
http://stummiforum.de/viewtopic.php?f=64...513940#p1509012


wulf43  
wulf43
InterRegio (IR)
Beiträge: 186
Registriert am: 28.02.2013
Gleise K-GLEIS
Spurweite H0
Steuerung Eigenentwicklung Software
Stromart AC, Digital


RE: NodeMCU - Messwagen WLAN

#8 von andreasheckt , 05.07.2020 23:01

Hallo Wulf,

gefällt mir sehr gut. Magst du uns auch deinen Sketch zeigen? Würde mich sehr freuen!

Viele Grüße
Andreas


andreasheckt private_
Dort blogge ich. Über Dinge, die mich bewegen. Modellbahn und so.

https://www.andreasheckt.de/


 
andreasheckt
Beiträge: 3
Registriert am: 02.07.2016
Homepage: Link
Spurweite H0
Stromart DC, Digital


RE: NodeMCU - Messwagen WLAN

#9 von wulf43 , 06.07.2020 11:27

Hallo Andreas ,
hier das entwickelte Programm:

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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
 
/*Messwagen wulf43
NodeMCU 8266
Lichtschranke TCST 2103
Schmitt Trigger 74HC14 (Signalglättung)
Programm-Basis für Server/Client:
Rui Santos - https://randomnerdtutorials.com/esp8266-web-server/
Einbinden in Heimnetz mit fester Adresse
*/
#include <ESP8266WiFi.h>
 
//#define SMDEBUG 1 // Freischalten für Testphase, Ausgaben über seriellen Monitor
 
// WLAN (SSID) und Passwort
// const char* ssid = "ssid";
// const char* password = "password";
// const char* ssid = "... "; // Hier Daten Heimnetz
// const char* password = "... "; // Heimnetz
 
// statische IP konfigurieren, zweckmäßig, da im Betrieb serieller Monitor nicht verfügbar
// ggf. 192,168,2, ans eigene Netz anpassen
IPAddress ip(...,); // 150 gewählt
IPAddress gateway(...,); // gateway für das eigene Netzwerk
IPAddress subnet...,); // subnet
 
// Webserver auf Port 80
WiFiServer server(80);
 
// Eine Variable um den HTTP Anforderung zu speichern
String header;
 
//****NodeMCU****
uint8_t BoardPin = D0; // interne LED
uint8_t Lichtschranke = D2; // StatusLS = LOW, wenn Lichtschranke frei
 
volatile unsigned int sensorImpZahl = 0; // Von LS empfangene Impulse, werden kontinuierlich hochgezählt
unsigned int sensorImpZahlAlt = 0;
 
// Zeiten
unsigned long startZeit; // millis() bei erstem Impuls
unsigned long gesZeit; // = millis()- startZeit
volatile long ZeitImpuls; // Zeit bei der Erfassung des Impulses
unsigned long ZeitImpulsAlt; // Zwischenspeicher
float ergZeit; // Hilfvariable/Rechengenauigkeit!
 
// Weg
const float wegKonst = 10.44 * 3.14159 / 4; // (Radumfang der Lauffläche)/4 in mm, d = 10.44 mm
// 4 Impulse pro Radumdrehung
// genauer Durchmesser durch Kalibrierung ermittelt
float Weg; // zurückgelegter Weg
 
//Geschwindigkeiten
float Vmit = 0; // Durchnittsgeschw.
long Vmit87 = 0; // Vorbild Durchnittsgeschw.
float Vmax = 0; // maximale Geschw.
long Vmax87 = 0; // Vorbild maximale Geschw.
float Vmom = 0; // momentane Geschw.
long Vmom87 = 0; // Vorbild momentane Geschw.
const float V87konst = (87 * 3.6) / 1000; // Umrechnung auf Vorbild
 
typedef enum { // Modus
BEREIT,
MESSUNG,
ERGEBNIS
}
modus;
modus aktiv_M = BEREIT;
 
int serIn; //Eingabe vom seriellen Monitor (Testphase)
 
void setup() {
pinMode (BoardPin, OUTPUT);
pinMode (Lichtschranke, INPUT_PULLUP);
attachInterrupt( digitalPinToInterrupt(Lichtschranke), IntImpuls, RISING);
Serial.begin (115200);
digitalWrite(BoardPin, LOW); // Anzeige Betriebszustand Ein
 
//---- Per WLAN mit dem Netzwerk verbinden -------------------------
#ifdef SMDEBUG
Serial.print("Verbindung zu ");
Serial.println(ssid);
#endif
 
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
 
while (WiFi.status() != WL_CONNECTED) {
delay(500);
#ifdef SMDEBUG
Serial.print(".");
#endif
}
 
// Die IP vom Webserver auf dem seriellen Monitor ausgeben
#ifdef SMDEBUG
Serial.println("");
Serial.println("WLAN verbunden.");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
#endif
server.begin();
//--------------------------------------------------------------------
}
 
void loop() {
 
WiFiClient client = server.available();
if (client) {
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
header += c;
if (c == 'n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
 
// Ausführung der Schaltbefehle
// button 1: Start/Stop
if (header.indexOf("GET /1/on") >= 0) {
aktiv_M = MESSUNG;
//anzMessung = 1;
Serial.println("MESSUNG");
 
} else if (header.indexOf("GET /1/off") >= 0) {
aktiv_M = ERGEBNIS;
//anzMessung = 0;
Serial.println("ERGEBNIS");
 
// button : Reset
} else if (header.indexOf("GET /2/on") >= 0) {
aktiv_M = BEREIT;
//anzMessung = 0;
Serial.println ("BEREIT");
}
 
// Aufbau der HTML Seite
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name="viewport" content="width=device-width, initial-scale=1">");
client.println("<link rel="icon" href="data:,">"); // für Icon, Favicon, nicht notwendig
client.println("<style>html { font-family: arial; display: inline-block; margin: 0px auto; text-align: center;}");
client.println("ul {font-family: monospace; width: 220px; padding-right: 20px; padding-top: 1px; padding-left: 20px; }");
client.println("ul {border: 1px solid blue; margin: 0 auto;text-align: left; color: blue;}");
client.println("b {color: red;}");
client.println(".button { background-color: #009900; border: none; color: white; padding: 16px 46px;");
client.println("text-decoration: none; font-size: 20px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #CC00CC;}");
client.println("</style> </head> <body>");
client.println("<h1>Messwagen</h1>");
 
// ABFRAGE! notwendig für Status-Anzeige
switch (aktiv_M) {
case BEREIT:
client.println("<p><b>Status: BEREIT </b> </p>");
client.println("<p><a href="/1/on"><button class="button">START</button></a></p></ul>");
client.println("<p><a href="/2/off"><button class="button button2">RESET</button></a></p></ul>");
break;
 
case MESSUNG:
client.println("<p><b>Status: MESSUNG </b> </p>");
client.println("<p><a href="/1/off"><button class="button">STOP</button></a></p>");
client.println("<p><a href="/2/off"><button class="button button2">RESET</button></a></p></ul>");
break;
 
case ERGEBNIS:
client.println("<p><b>Status: ERGEBNIS </b> </p>");
client.println("<p><a href="/2/on"><button class="button button2">RESET</button></a></p></ul>");
break;
}
 
// Messwerte
client.println("<ul><h3>");
 
client.print("<li>Zeit s &nbsp &nbsp &nbsp &nbsp: ");
client.println(gesZeit / 1000);
client.println("</li>");
 
client.print("<li>Weg&nbsp mm &nbsp &nbsp &nbsp : ");
client.println(int(Weg));
client.println("</li>");
 
client.print("<li>Vmit mm/s &nbsp &nbsp : ");
client.println(int(Vmit));
client.println("</li>");
 
client.print("<li>Vmit km/h(87) : ");
client.println(Vmit87);
client.println("</li>");
 
client.print("<li>Vmax mm/s &nbsp &nbsp : ");
client.println(int(Vmax));
client.println("</li>");
 
client.print("<li>Vmax km/h(87) : ");
client.println(Vmax87);
client.println("</li>");
 
client.println("</ul></h3></body></html>");
 
client.println("</body></html>");
 
client.println();
 
break;
} else {
currentLine = "";
}
} else if (c != 'r') {
currentLine += c;
}
}
}
// Löschen Header-Variable
header = "";
 
// Verbindung schließen
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
// }
}
 
//------------------------------------------------------------
// ***** für Testphase Eingabe Modus über Serial Monitor *****
#ifdef SMDEBUG
if (Serial.available() > 0) {
serIn = Serial.read ();
Serial.print("I received: ");
Serial.println(serIn, DEC);
}
if (serIn == 48) {
aktiv_M = BEREIT;
Serial.println("BEREIT");
delay(1000);
}
if (serIn == 49) {
aktiv_M = MESSUNG;
Serial.println("MESSUNG");
delay(1000);
}
if (serIn == 50) {
aktiv_M = ERGEBNIS;
Serial.println("ERGEBNIS");
}
#endif
//--------------------------------------------------------------
 
switch (aktiv_M) {
case BEREIT:
sensorImpZahl = 0;
gesZeit = 0;
Weg = 0;
Vmom = 0;
Vmit = 0;
Vmax = 0;
Vmom87 = 0;
Vmit87 = 0;
Vmax87 = 0;
 
digitalWrite(BoardPin, LOW); //Anzeige der Messbereitschaft
break;
 
case MESSUNG:
if (sensorImpZahl == 1) { //Initialisierung mit erstem Impuls
startZeit = millis();
digitalWrite(BoardPin, HIGH); //Ausschalten der LED
}
 
if (sensorImpZahlAlt != sensorImpZahl) {
ZeitImpuls = millis();
sensorImpZahlAlt = sensorImpZahl;
gesZeit = millis() - startZeit;
Weg = (sensorImpZahl) * wegKonst;
ergZeit = gesZeit / 1000;
Vmit = Weg / ergZeit;
Vmit87 = Vmit * V87konst; //km/h
Vmom = wegKonst * 1000 / (ZeitImpuls - ZeitImpulsAlt);
Vmom87 = Vmom * V87konst; //km/h
ZeitImpulsAlt = ZeitImpuls;
 
#ifdef SMDEBUG
Serial.print(sensorImpZahl);
Serial.print (" ");
Serial.print ( ZeitImpuls);
Serial.print (" ");
Serial.println (Weg);
#endif
}
else {
Vmom = 0;
Vmom87 = 0;
}
 
if (Vmom > Vmax) {
Vmax = Vmom;
Vmax87 = Vmax * V87konst;
}
 
break;
 
case ERGEBNIS:
#ifdef SMDEBUG
Serial.print ("Zeit: ");
Serial.print (gesZeit / 1000);
Serial.println(" sec");
Serial.print ("Weg: ");
Serial.print (Weg);
Serial.println(" mm");
 
Serial.print ("Vmom: ");
Serial.print (Vmom);
Serial.print (" mm/sec Vmom87: ");
Serial.print (Vmom87);
Serial.println(" km/h");
 
Serial.print ("Vmit: ");
Serial.print (Vmit);
Serial.print (" mm/sec Vmit87: ");
Serial.print (Vmit87);
Serial.println(" km/h");
 
Serial.print ("Vmax: ");
Serial.print (Vmax);
Serial.print (" mm/sec Vmax87: ");
Serial.print (Vmax87);
Serial.println(" km/h");
 
delay(1000);
aktiv_M = BEREIT;
#endif
 
break;
}
}
 
void IntImpuls() {
if (digitalRead(Lichtschranke) == HIGH) {
sensorImpZahl++;
}
} ;
 



Die erwähnte Kalibrierung habe ich wie folgt durchgeführt: mehrfache Zeiterfassung für das Durchfahren einer bekannten Messtrecke, rechnerische Anpassung des Raddurchmessers.
Die Darstellung des Messergebnisses auf dem Handy erfolgt über HTML. Lediglich für die Entwicklung des Programms habe ich mich ein wenig damit beschäftigt und primär Informationen aus dem Netz genutzt. Falls konkrete Fragen dazu bestehen kann ich leider nicht darauf eingehen. Vielleicht gibt es dann Spezialisten, die ggf. Stellung beziehen können. Ich weise darauf hin, dass die Nutzung des Programms auf eigenes Risiko hin erfolgt.
Verwendet habe ich die skizzierte Schaltung zur Erfassung des Impulses der Lichtschranke. Der Schmitt-Trigger dient zum Entprellen des Messsignals.

Gruß
Wulf


Meine Anlage: Modellbahnprojekt "unendliche Geschichte"
http://stummiforum.de/viewtopic.php?f=64...513940#p1509012


andreasheckt hat sich bedankt!
wulf43  
wulf43
InterRegio (IR)
Beiträge: 186
Registriert am: 28.02.2013
Gleise K-GLEIS
Spurweite H0
Steuerung Eigenentwicklung Software
Stromart AC, Digital

zuletzt bearbeitet 19.12.2022 | Top

RE: NodeMCU - Messwagen WLAN

#10 von Bussi , 22.03.2023 19:38

Hallo an Alle,
Leider bekomme ich die Software nicht am‘s laufen.
Ich habe als Hardware einen Nodemcu V3.
Ich habe leider nicht so viel Ahnung wie ich den Fehler finden soll, kann mir jemand einen Skript zukommen lassen?
Beste Grüße


Bussi  
Bussi
Beiträge: 1
Registriert am: 20.03.2023


   

ESU Loksound 5 - ABC Bremsweg
Eine Glasdiode die leuchtet

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