#include <MobaTools.h>
#include <EEPROM.h>
// Gleisstellpultweiche Nr.: 1, 2, 3, 4, 5, 6
const byte servoW[] ={ 6, 2, 19, 7, 33, 31}; //Array Weichen Pins
const byte WAnschlagMIN[] ={ 80, 120, 120, 70, 60, 100}; //Array Weichenauslenkung Minimum (geradeaus)
const byte WAnschlagMAX[] ={120, 70, 70, 120, 100, 50}; //Array Weichenauslenkung Maximum (abbiegen)
const byte servoSpeedW[] ={ 10, 10, 10, 10, 10, 10}; //Array Servogeschwindigkeit
const byte buttonGeradeW[] ={ A8, A11, A5, 38, A14, 37}; //Array Pins "Taster geradeaus"
const byte buttonAbbiegenW[] ={A10, A12, A4, A7, A15, 39}; //Array Pins "Taster abbiegen"
const byte ledW[] ={ 44, 48, 42, 46, 50, 40}; //Array LEDs
const byte addr[] ={ 1, 2, 3, 4, 5, 6}; //Array eeprom address
const byte ANZAHL_WEICHEN = sizeof(servoW);
// Gleisstellpultentkuppler Nr.: 1, 2, 3, 4, 5, 6, 7, 9, 10
const byte servoE[] ={ 4, 36, 29, 5, 25, 35, 3, 23, 27}; //Array Entkuppler Pins
const byte EAnschlagMIN[] ={ 50, 130, 55, 120, 70, 70, 60, 60, 120}; //Array Entkupplerauslenkung Minimum
const byte EAnschlagMAX[] ={ 80, 100, 90, 90, 90, 95, 90, 90, 90}; //Array Entkupplerauslenkung Maximum
const byte servoSpeedE[] ={ 20, 20, 20, 20, 20, 20, 20, 20, 20}; //Array Servogeschwindigkeit
const byte buttonE[] ={ A9, A13, A0, A3, A6, 13, 52, A1, A2}; //Array Pins "Taster Entkuppler"
const byte ANZAHL_ENTKUPPLER = sizeof(servoE);
const byte autoOff = 1; //damit die Servos nicht brummen...
Servo8 servoWeiche[ANZAHL_WEICHEN]; //Array Weichen 1 bis 6
Servo8 servoEntkuppler[ANZAHL_ENTKUPPLER]; //Array Entkuppler 1 bis 7, 9 und 10
EggTimer myTimerE[ANZAHL_ENTKUPPLER]; //Entkuppler sollen 5 sec. aktiv sein
byte buttonStatusGeradeW[ANZAHL_WEICHEN] ={0,0,0,0,0,0};
byte buttonStatusAbbiegenW[ANZAHL_WEICHEN]={0,0,0,0,0,0};
byte buttonStatusE[ANZAHL_ENTKUPPLER] ={0,0,0,0,0,0,0,0,0};
byte i; //Zählvariable Weichen
byte j; //Zählvariable Entkuppler
void setup() {
for (i=0; i<ANZAHL_WEICHEN; i++){
pinMode(buttonGeradeW[i], INPUT);
pinMode(buttonAbbiegenW[i], INPUT);
pinMode(ledW[i], OUTPUT);
if (EEPROM.read(addr[i]) == WAnschlagMIN[i]) // Wenn letzte Weichenposition Geradeaus war...
{
digitalWrite(ledW[i], HIGH); // dann wird LED grün geschaltet, ansonsten bleibt sie rot
}
servoWeiche[i].attach(servoW[i], autoOff );
servoWeiche[i].setSpeed(servoSpeedW[i]);
servoWeiche[i].write(EEPROM.read(addr[i])); // Bewege Servo zur letzten im EEPROM gespeicherten Position
}
for (j=0; j<ANZAHL_ENTKUPPLER; j++){
pinMode(buttonE[j], INPUT);
servoEntkuppler[j].attach(servoE[j], autoOff );
servoEntkuppler[j].setSpeed(servoSpeedE[j]);
}
}
void loop() {
// Schleife für Weichen
for (i=0; i<ANZAHL_WEICHEN; i++){
buttonStatusGeradeW[i]=digitalRead(buttonGeradeW[i]);
buttonStatusAbbiegenW[i]=digitalRead(buttonAbbiegenW[i]);
if (buttonStatusGeradeW[i] == HIGH)
{
digitalWrite(ledW[i], HIGH);
EEPROM.write(addr[i], WAnschlagMIN[i]); //Schreibe Zielposition in EEPROM
servoWeiche[i].write(WAnschlagMIN[i]);
}
else
{
if (buttonStatusAbbiegenW[i] == HIGH)
{
digitalWrite(ledW[i], LOW);
EEPROM.write(addr[i], WAnschlagMAX[i]); //Schreibe Zielposition in EEPROM
servoWeiche[i].write(WAnschlagMAX[i]);
}
else
{
}
}
}
// Schleife für Entkuppler
for (j=0; j<ANZAHL_ENTKUPPLER; j++){
buttonStatusE[j]=digitalRead(buttonE[j]);
if (buttonStatusE[j] == HIGH) //wenn der Entkuppler-Taster betätigt wird...
{
myTimerE[j].setTime(5000); //sollte der Timer auf 5 Sekunden gestellt werden und starten...
servoEntkuppler[j].write(EAnschlagMAX[j]); //... und das Servo auf 110 Grad (Entkuppeln) gehen...
}
else // wenn der Taster losgelassen wurde ...
{
if (myTimerE[j].running()==false) //...und wenn der Timer abgelaufen ist ...
{
servoEntkuppler[j].write(EAnschlagMIN[j]); //...wieder auf 75 Grad (Ruhezustand)
}
}
}
}