Weichendecoder mit Servo
Verfasst: 07.06.2019, 10:52
Hallo zusammen,
wie bereits an anderer Stelle bemerkt, möchte ich das Framework für meinen Weichendecoder etwas erweitern. Generell plane ich Folgendes:
Später kommt noch ein weiterer Wert dazu. Ich möchte die Weichenadresse gern über einen DIP switch einstellen und über einen MCP23017 einlesen. Dieser Wert soll dann nicht nur die Weichenadresse darstellen, sondern auch einen Offset auf eine feste IP Adresse in meinem WLAN Netz, in dem auch ein MQTT Server (RasPi) hängt. Aber eins nach dem anderen.
Vorerst habe ich mir mit einer globalen Variablen geholfen. Das funktioniert auch, aber ich habe mich etwas in cpp eingelesen und dort gesehen, dass globale Variablen nicht mehr das Mittel der Wahl sind. Da fehlt es mir noch an Hintergrundwissen.
Ich möchte euch hier schon einmal die von mir gemachten Änderungen (auf Basis der Version V1.2.2) mitteilen. Vielleicht kann ja der ein oder andere davon profitieren oder mir noch Tipps geben.
unter "turnout2value" in parseIn habe ich das Einlesen der Verzögerung aus config.json ergänzt:
sowie
Damit kann in der config.json der Verzögerungswert delay in ms/Grad eingestellt werden:
Bei mir funktioniert das soweit zufriedenstellend. Anmerkungen oder Verbesserungen werden gern gesehen.
Sobald ich weiter in dem Thema bin, werde ich das Neue wieder hier einstellen.
Beste Grüße
Lorenzo
wie bereits an anderer Stelle bemerkt, möchte ich das Framework für meinen Weichendecoder etwas erweitern. Generell plane ich Folgendes:
- Verlangsamen der Servo Geschwindigkeit für natürlicheres Weichen stellen
- Einlesen Meldekontakt bevor Weiche aufgeschnitten wird zum automatischen Stellen der Weiche
- Rückmeldung der Weichenstellung über MQTT
- Stellen der Weiche über MQTT
Später kommt noch ein weiterer Wert dazu. Ich möchte die Weichenadresse gern über einen DIP switch einstellen und über einen MCP23017 einlesen. Dieser Wert soll dann nicht nur die Weichenadresse darstellen, sondern auch einen Offset auf eine feste IP Adresse in meinem WLAN Netz, in dem auch ein MQTT Server (RasPi) hängt. Aber eins nach dem anderen.
Vorerst habe ich mir mit einer globalen Variablen geholfen. Das funktioniert auch, aber ich habe mich etwas in cpp eingelesen und dort gesehen, dass globale Variablen nicht mehr das Mittel der Wahl sind. Da fehlt es mir noch an Hintergrundwissen.
Ich möchte euch hier schon einmal die von mir gemachten Änderungen (auf Basis der Version V1.2.2) mitteilen. Vielleicht kann ja der ein oder andere davon profitieren oder mir noch Tipps geben.
- in config.h habe ich eine globale Variable für die Verzögerung deklariert
Code: Alles auswählen
extern unsigned int moveDelay;
- in config.cpp wird diese Variable initialisiert
Code: Alles auswählen
extern unsigned int moveDelay = 0; // delay for servo movement [ms/degree]
Code: Alles auswählen
moveDelay = parser->getValueByKey(idx, "delay").toInt();
Serial.println("Turnout2Value delay: " + String(moveDelay) + " [ms/degree]");
- in ActionServo.h wurden folgende Variablen unter private hinzugefügt:
Code: Alles auswählen
unsigned int newPosition;
unsigned int actPosition = -1;
- dazu die Ergänzungen in ActionServo.cpp:
Code: Alles auswählen
#include "config.h"
Code: Alles auswählen
int ActionServo::loop() {
if (lastcommand == 0) {
return 50;
}
// next Servo move after xx ms (moveDelay)
if (millis() > lastcommand + moveDelay) {
if (actPosition != -1) {
if (actPosition > newPosition) {
myservo.write(--actPosition);
lastcommand = millis();
} else if (actPosition < newPosition) {
myservo.write(actPosition++);
lastcommand = millis();
}
}
}
// Autodetach after 2 sec
// if (millis() > lastcommand + 2000) {
// Autodetach after newPosition reached + 10ms or after 2s (moveDelay = 0)
if (millis() > lastcommand + (moveDelay == 0 ? 2000 : 10) && actPosition == newPosition) {
lastcommand = 0;
detach();
return 2000;
}
return 5;
}
Code: Alles auswählen
void ActionServo::setSettings(String key, String value) {
unsigned int status = value.toInt();
Logger::getInstance()->addToLog(
"Servo Value: " + value);
if (status == -1) {
detach();
} else {
newPosition = status;
if (actPosition == -1 || moveDelay == 0) {
actPosition = status;
myservo.write(actPosition);
}
attach();
lastcommand = millis() + moveDelay;
}
}
Code: Alles auswählen
"in":[
{
"m": "turnout2value",
"addr": "1",
"delay": "25",
"out": [ "S1" ],
"turnout2value": { "0": "55", "1": "120"}
}
],
Sobald ich weiter in dem Thema bin, werde ich das Neue wieder hier einstellen.
Beste Grüße
Lorenzo