/* Pendelbaanbesturing www.ab-treinen.nl Bij if functie niet = maar == gebruiken, bij = wordt de waarde geschreven, == is gelijk aan. Digitale ingangen 0 en 1 niet gebruikt in verband met gebruik van seriele communicatie en uploadproblemen. Als ingang 0 aan massa ligt dan gaat uploaden niet. Als serielecommunicatie gebruikt wordt dan kan ingang 1 niet gebruikt worden. Nu AO A1 A2 A3 */
de is is is is
analoge ingangen A0, A1, A2 en A3 als ingang gebruikt. auto-start of manuele start. startknop 1 of twee treinen wachttijdinstelling met potmeter
/* Werking: 2 stations, dal met twee sporen en berg met één spoor. 2 treinen -> beurtelings van dal naar berg. 1 trein -> naar berg en terug op ander spoor, dus van 1->2 en van 2->1 Bij manueel trein elke keer vanaf spoor 1 te starten, dus altijd twee ritten. StartLED gaat aan en pas uit als trein op 1 arriveert. Als hoofdspoor bezet is dan geen vertrek vanuit dalstation en als de trein vanaf het bergstation komt dan stopt deze voor het hoofdspoor. */ /* -const const const const
Benoemen van de analoge ingangen -- */ int manueel = 0; // Analoge ingang int start = 1; // Analoge ingang int loks = 2; // Analoge ingang int wacht = 3; // Analoge ingang -
/* -const const const
Benoemen van de digitale ingangen -- */ int HS = 2; // trein vanaf hoofdspoor int HE = 3; // hoofdspoor is vrij int C20 = 4; // pendel 1 komt aan op dalstation
Manueel of autostart pendel Start bij manueelbedrijf 1 of 2 loks in bedrijf wachttijd voor vertrek.
const int C21 = 5; const int C22 = 6;
// pendel 2 komt aan op dalstation // pendel komt aan op bergstation
/* -const const const const const const const
Benoemen van de uitgangen -- */ int Richting = 7; // Berg of dal richting int Spoor = 8; // Dalstation spoor 1 of 2 int Stop4 = 9; // Stoppen op stopplaats 4 aan is stoppen int WBocht = 10; // Zet de wissel op bocht int WRecht = 11; // Zet de wissel op recht int LEDstart = 12; // Aan sls de baan manueel gestart is int LEDman = 13; // Aan als baan manueel gestart gaat worden
/* -const const const const
Vaste waarden -- */ int berg = 0; int dal = 1; int spoor1 = 0; int spoor2 = 1;
/* -- Benoemen van variabelen -- */ int HSbezet; // Als trein naderd op hoofdspoor int Rijrichting; // Berg of dal richting int Startknop; // Als startknop is ingedrukt int Spoorkeuze; // Spoor 1 of spoor 2 is actief int Automaat; // Start pendel automatisch of manueel int treinen; // Aantal treinen dat pendeld 1 of 2 int wachten; // Waarde voor vertrektijd analoog-in A3 int wstand; // Stand van de wissel - schermafdruk int wisseltijd; // Omzettijd van de wissel int klaar; // Handeling vertrek berg is klaar int Sberg; // Schakelaar C22 is gemaakt int Sdal20; // Schakelaar C20 is gemaakt int Sdal21; // Schakelaar C21 is gemaakt void setup() { Serial.begin(9600); pinMode(HS, INPUT); pinMode(HE, INPUT); pinMode(C20, INPUT); pinMode(C21, INPUT); pinMode(C22, INPUT);
pinMode(Richting, OUTPUT); pinMode(Spoor, OUTPUT); pinMode(Stop4, OUTPUT); pinMode(WBocht, OUTPUT); pinMode(WRecht, OUTPUT); pinMode(LEDstart, OUTPUT); pinMode(LEDman, OUTPUT); wisseltijd = 300; resetten(); attachInterrupt(0, leesinganghoofdbaan, FALLING); attachInterrupt(1, leesinganghoofdbaan, FALLING); /* FALLING, RISING, LOW, CHANGE */ } void loop() { leesinganginstellingen(); leesingangpendel(); /* -- 1 Vertrek dalstation spoor 1-- */ if (Sdal20 == 1) { delay(wachten); digitalWrite(LEDstart, LOW); Startknop = 0; if (Automaat == 1) { do { leesinganginstellingen(); Serial.println(" ;Wacht op Startknop "); } while(Startknop == 0 && Automaat == 1);} Rijrichting = berg; do { leesinganginstellingen(); Serial.println(" ;Wacht op hoofdspoorvrij S20"); } while(HSbezet == 1); if (treinen == 2) {wisselbocht(); Spoorkeuze = spoor2;} digitalWrite(Spoor, Spoorkeuze); digitalWrite(Richting, Rijrichting); Sdal20 = 0; } /* -- 2 vertrek dalstation spoor 2 -- */ if (Sdal21 == 1) {
delay(wachten); Rijrichting = berg; do { leesinganginstellingen(); Serial.println(" ;Wacht op hoofdspoorvrij S21"); } while(HSbezet == 1); if (treinen == 2) {wisselrecht(); Spoorkeuze = spoor1;} digitalWrite(Spoor, Spoorkeuze); digitalWrite(Richting, Rijrichting); Sdal21=0; } /* -- 3 Vertrek bergstation -- */ if (Sberg == 1) { delay(wachten); Rijrichting = dal; klaar = 1; digitalWrite(Richting, Rijrichting); Sberg = 0; /* Bij gebruik else bij onderstaande if, dan komt else bij bovenstaande if. Daarom is klaar erbij gezet zodat twee keer if gebruikt kan worden. Bij niet gebruik van klaar dan komt tweede if altijd als eerste if afgehandeld is */ if (treinen == 1 && Spoorkeuze == spoor1 && klaar == 1) { wisselbocht(); Spoorkeuze = spoor2; klaar = 0;} if (treinen == 1 && Spoorkeuze == spoor2 && klaar == 1) { wisselrecht(); Spoorkeuze = spoor1; klaar = 0;} } /* -- 4 Stopplaats voor hoofdspoor -- */ if (HSbezet == 1 && Rijrichting == dal) { digitalWrite(Stop4, HIGH);} else {digitalWrite(Stop4, LOW);}
if (HSbezet == 0) {digitalWrite(Stop4, LOW);} /* -- 5 afdrukken status opscherm -- */ Serial.print("Hoofdspoor "); if (HSbezet == 1) {Serial.print("Bezet ");} else {Serial.print("Vrij ");} Serial.print(";Richting "); if (Rijrichting == 1) {Serial.print("Dal ");} else {Serial.print("Berg ");} Serial.print(";Treinen "); Serial.print(treinen); Serial.print(" ;V/A "); if (Spoorkeuze == 1) {Serial.print("Spoor-2 ");} else {Serial.print("Spoor-1 ");} Serial.print(" ;Wissel "); if (wstand == 1) {Serial.print("Bocht ");} else {Serial.print("Recht ");} Serial.print(";S20-"); Serial.print(Sdal20); Serial.print(" ;S21-"); Serial.print(Sdal21); Serial.print(" ;Berg-"); Serial.print(Sberg); Serial.print(" ;Start "); if (Automaat == 1) {Serial.print("Manueel ");} else {Serial.print("Auto ");} Serial.print(" ;Startknop "); if (Startknop == 1) {Serial.println("Aan ");} else {Serial.println("Uit ");} } /* -- Einde loop ---------------------------------------- */ void leesinganghoofdbaan() { if (digitalRead(HS) == 0) {HSbezet = 1;} if (digitalRead(HE) == 0) {HSbezet = 0;} } void if if if }
leesingangpendel() { (digitalRead(C20) == 0) {Sdal20 = 1; } (digitalRead(C21) == 0) {Sdal21 = 1; } (digitalRead(C22) == 0) {Sberg = 1; }
void leesinganginstellingen() { if (analogRead(manueel) < 100) { Automaat = 1; digitalWrite(LEDman, HIGH);} else { Automaat = 0; digitalWrite(LEDman, LOW);} if (analogRead(loks) < 100) {treinen = 1;} else {treinen = 2;} if (analogRead(start) < 100 && Automaat == 1) { Startknop = 1; digitalWrite(LEDstart, HIGH);} wachten = analogRead(wacht); wachten = map(wachten, 0, 1023, 3000, 15000); //wachttijd van 3-15sec. } void wisselbocht() { digitalWrite(WBocht, HIGH); wstand = 1; delay(wisseltijd); digitalWrite(WBocht, LOW); } void wisselrecht() { digitalWrite(WRecht, HIGH); wstand = 0; delay(wisseltijd); digitalWrite(WRecht, LOW); } void resetten() { HSbezet = 1; //HE maken voor start pendeldienst. Rijrichting = berg; digitalWrite(Richting, Rijrichting); Spoorkeuze = spoor1;
Startknop = 0; digitalWrite(LEDstart, LOW); Sdal20 = 1; Sdal21 = 0; Sberg = 0; Serial.println("Regeling gereset"); }