Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen
Verfasst: Di 16. Feb 2021, 16:31
Hallo Franz,
ich habe da mal einen Sketch mit den MobaTools erweitert.
Das Relais funktioniert wunderbar, aber ich bekomme die beiden LED ( ledGeradePin und ledAbzweigPin) nicht angesteuert.
Je nach Position ( weichenPos1 und weichenPos2 ) sollen die LED leuchten - also
Weiche gerade / grüne LED an - Servo bewegt sich / beide LED aus - Weiche steht auf Abzweig / rote LED an.
Der MicroBahner hatte noch einen anderen Sketch veröffentlicht, den bekomme ich aber nicht abgeändert ( Relais soll nach dem halben Verfahrweg umschalten.
Vielleicht kannst Du mir mal wieder weiterhelfen - Danke im vorraus
ich habe da mal einen Sketch mit den MobaTools erweitert.
Das Relais funktioniert wunderbar, aber ich bekomme die beiden LED ( ledGeradePin und ledAbzweigPin) nicht angesteuert.
Je nach Position ( weichenPos1 und weichenPos2 ) sollen die LED leuchten - also
Weiche gerade / grüne LED an - Servo bewegt sich / beide LED aus - Weiche steht auf Abzweig / rote LED an.
Code: Alles auswählen
// Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen // e69-fan #define MAX8BUTTONS #include <MobaTools.h> //Variablendeklaration const byte weichenPin[] = {2, 3, 4}; // Pins für die Weichenantriebe // ------------------------------------------------------------------------------------------------------------------------ // const byte ANZAHL = sizeof(weichenPin); // ------------------------------------------------------------------------------------------------------------------------ // const byte buttonPin[ANZAHL] = {A1, A2, A3}; // Pins für die Taster // ------------------------------------------------------------------------------------------------------------------------ // const byte relaisPin[ANZAHL] = {5, 6, 7}; // Pins für die Relais // ------------------------------------------------------------------------------------------------------------------------ // const int weichenPos1[ANZAHL] = {40, 40, 40}; // linke Position der Servos const int weichenPos2[ANZAHL] = {120, 120, 120}; // rechte Position der Servos // ------------------------------------------------------------------------------------------------------------------------ // const byte ledGeradePin[ANZAHL] = {8, 9, 10}; // Pin für die LED Zustand gerade const byte ledAbzweigPin[ANZAHL] = {11, 12, 13}; // Pin für die LED Zustand Anzweig // ------------------------------------------------------------------------------------------------------------------------ // const int speed[ANZAHL] = {8, 8, 8}; // festlegen der Verfahrgeschwindigkeit der Servos // ------------------------------------------------------------------------------------------------------------------------ // boolean weicheToPos1[ANZAHL]; // Sollposition des Servo ( true = Pos1 ) MoToButtons taster( buttonPin, ANZAHL, 20, 300 ); // Weichentaster einrichten MoToServo servos[ANZAHL]; void setup() { for (byte i = 0; i < ANZAHL; i++) { servos[i].attach(weichenPin[i], true ); servos[i].setSpeed(speed[i]); pinMode(relaisPin[i], OUTPUT); weicheToPos1[i] = true; servos[i].write(weichenPos1[i]); // Startstellung Servo digitalWrite(relaisPin[i], weicheToPos1[i] ); // Startstellung Relais } }//Ende void setup void loop() { taster.processButtons(); for ( byte i = 0; i < ANZAHL; i++ ) { if ( taster.pressed(i) ) { weicheToPos1[i] = !weicheToPos1[i]; // Weichenstellung umschalten if ( weicheToPos1[i] ) { servos[i].write(weichenPos1[i]); } else { servos[i].write(weichenPos2[i]); } } if ( servos[i].moving() ) { // Umstellvorgang läuft, Relais umschalten if ( servos[i].moving() < 50 ) { digitalWrite(relaisPin[i], weicheToPos1[i] ); } } } // Ende for - schleife } // Ende void loop
Der MicroBahner hatte noch einen anderen Sketch veröffentlicht, den bekomme ich aber nicht abgeändert ( Relais soll nach dem halben Verfahrweg umschalten.
Also, wie bei der alten Fernsehsendung: TorA oder TorB oder TorC - im TorC ist der ZonkCode: Alles auswählen
/* Demo zum Anschluß mehrerer Weichen, realisiert mit objektorientierter Programmierung (OOP) Anstelle von Funktionen und Feldern werden Methoden und Strukturen verwendet. Die Methoden sehen so aus, als seien sie für eine Weiche geschrieben, tatsächlich können aber bis zu 16 Weichen, begrenzt durch die Bibliothek, verwendet werden, wenn die Pins wie beim Mega2560 ausreichen. Beim Drücken des Tasters geht die LED aus, der Servo bewegt die Zunge mit eingestellter Geschwindigkeit in die andere Position, die LED für die neue Position geht an, der Servo wird nach einer Sekunde ausgeschaltet. Ausgaben auf den seriellen Monitor dienen nur der Veranschaulichung und können entfernt werden. */ #include <MobaTools.h> const byte ZUNGENGESCHWINDIGKEIT = 10; // entspricht 1,7 Sekunden class Weiche { const byte tasterPin; // Pin für den Taster const byte ledGeradePin; // Pin für die LED Zustand gerade const byte ledAbzweigPin; // Pin für die LED Zustand Anzweig const byte servoPin; // Pin für den Weichenservo const byte winkelG; // Winkel für die Geradenstellung const byte winkelA; // Winkel für die Abzweigtellung const bool grundStellung; // Grundstellung beim Einschalten: 0=gerade, 1=Abzweig bool tasterAlt, tasterAkt; // Tasterzustände alt und aktuell MoToServo weichenServo; // Objekt der Bibliothek public: Weiche (const byte tasterPin, const byte ledGeradePin, const byte ledAbzweigPin, const byte servoPin, const byte winkelG, const byte winkelA, const bool grundStellung) : tasterPin(tasterPin), ledGeradePin(ledGeradePin), ledAbzweigPin(ledAbzweigPin), servoPin(servoPin), winkelG(winkelG), winkelA(winkelA), grundStellung(grundStellung), tasterAlt(0), tasterAkt(0), weichenServo() {} void init() { pinMode(tasterPin, INPUT_PULLUP); // Taster schaltet nach GND pinMode(ledGeradePin, OUTPUT); pinMode(ledAbzweigPin, OUTPUT); weichenServo.attach(servoPin, true); // Pin für den Weichenservo und Abschalten nach einer Sekunde weichenServo.setSpeed(ZUNGENGESCHWINDIGKEIT); // Weichenzungengeschwindigkeit if (grundStellung) { weichenServo.write(winkelA); // definierten Anfangswinkel anfahren } else { weichenServo.write(winkelG); // definierten Anfangswinkel anfahren } } void stellen() { tasterAlt = tasterAkt; tasterAkt = digitalRead(tasterPin); if (weichenServo.moving() == 0) { byte winkel = weichenServo.read(); if (winkel == winkelG) digitalWrite(ledGeradePin, HIGH); if (winkel == winkelA) digitalWrite(ledAbzweigPin, HIGH); if (tasterAlt && !tasterAkt) { Serial.print(F("Tastendruck Pin ")); Serial.print(tasterPin); if (winkel == winkelG) { Serial.print(F("\tWeiche Pin ")); Serial.print(servoPin); Serial.println(F(" abbiegen")); digitalWrite(ledGeradePin, LOW); weichenServo.write(winkelA); } else { Serial.print(F("\tWeiche Pin ")); Serial.print(servoPin); Serial.println(F(" gerade")); digitalWrite(ledAbzweigPin, LOW); weichenServo.write(winkelG); } } } } }; Weiche weichen[] = { // tasterPin, ledGeradePin, ledAbzweigPin, servoPin, winkelG, winkelA, Grundstellung // {A1, 6, 5, 9, 36, 85, 0}, // jede Zeile entspricht einer Weiche {A2, 7, 4, 10, 30, 80, 1}, // jede Zeile entspricht einer Weiche {A3, 2, 3, 4 , 30, 80, 0} // jede Zeile entspricht einer Weiche }; void setup() { Serial.begin(9600); Serial.println(F("Gleisschaltplan")); for (Weiche &w : weichen) w.init(); } void loop() { for (Weiche &w : weichen) w.stellen(); }
Vielleicht kannst Du mir mal wieder weiterhelfen - Danke im vorraus