Main Page with explanations of code development etc.
#include <LCD_1602.h>LCD_1602 lcd2(0x27);LCD_1602 lcd1(0x20);/*Delta_layout * Program to monitor 3 sets of points plus one switch and control 8 sets of signals at Leonland * Ag = 61n.60n./BG Aa = 61n.60t./BG Ar = 61t+BG * Bg = 61t.60n./BG Ba = 61t.60t./BG Br = 61n+BG * Cg = 63n Ca = 63t * Dg = 63t.60t./BG Da = 63t.60n Dr = 63n * Eg = 63n.60t./BG Ea = 63n.60n Er = 63t * Fg = 61n.60n./BG Fa = 61t.60n./BG Fr = 60t+BG * Gg = 60n.63n Ga = 60n.63t Gr = 60t * Hg = 61n./BG Ha = 61t./BG Hr = BG * * 0 60t.61t.63t./BG AR BA CA DG ER * 1 60n.61t.63t./BG AR BG CA DA ER * 2 60t.61n.63t./BG AA BR CA DG ER * 3 60n.61n.63t./BG AG BR CA DA ER * 4 60t.61t.63n./BG AR BA CG DR EG * 5 60n.61t.63n./BG AR BG CG DR EG * 6 60t.61n.63n./BG AA BR CG DR EG * 7 60n.61n.63n./BG AG BR CG DR EG * 8 60t.61t.63t.BG AR BR CA * 9 60n.61t.63t.BG AR BR CA DA * 10 60t.61n.63t.BG AR BR CA * 11 60n.61n.63t.BG AR BR CA DA * 12 60t.61t.63n.BG AR BR CG DR * 13 60n.61t.63n.BG AR BR CG DR * 14 60t.61n.63n.BG AR BR CG DR * 15 60n.61n.63n.BG AR BR CG DR */int points;int previous_points;const int POINT_MASK = 0b1000; //in case need to change polarity#define DEBUG 1#define P60 A0 //wiring#define P61 A1#define P63 A2#define BroadG A3const long HRL = 0x000001;const long HAL = 0x000002;const long HGL = 0x000004;const long GRL = 0x000008;const long GAL = 0x000010;const long GGL = 0x000020;const long FRL = 0x000040;const long FAL = 0x000080;const long FGL = 0x000100;const long ERL = 0x000200;const long EAL = 0x000400;const long EGL = 0x000800;const long DRL = 0x001000;const long DAL = 0x002000;const long DGL = 0x004000;const long CRL = 0x008000;const long CAL = 0x010000;const long CGL = 0x020000;const long BRL = 0x040000;const long BAL = 0x080000;const long BGL = 0x100000;const long ARL = 0x200000;const long AAL = 0x400000;const long AGL = 0x800000;int read_points( ){ int pts = (digitalRead(P60) + 2 * digitalRead(P61) + 4 * digitalRead(P63) + 8 * digitalRead(BroadG)); return (pts^POINT_MASK); }enum signals {HR,HA,HG,GR,GA,GG,FR,FA,FG,ER,EA,EG,DR,DA,DG,CR,CA,CG,BR,BA,BG,AR,AA,AG} signal_state;void dump_sig(int sig) { Serial.print("Sensor State = "); Serial.print(sig); if (sig & 1) Serial.print(" Point60 normal."); else Serial.print(" Point60 turn."); if (sig & 2) Serial.print(" Point61 normal."); else Serial.print(" Point61 turn."); if (sig & 4) Serial.print(" Point63 normal."); else Serial.print(" Point63 turn."); if (sig & 8) Serial.println(" BG Active."); else Serial.println(" BG Inactive.");}void print_signals(long int sig){ //Serial.println(); Serial.print("Signals State = "); Serial.print(sig); if (sig & HGL) Serial.print(" HG"); if (sig & HAL) Serial.print(" HA"); if (sig & HRL) Serial.print(" HR"); if (sig & GGL) Serial.print(" GG"); if (sig & GAL) Serial.print(" GA"); if (sig & GRL) Serial.print(" GR"); if (sig & FGL) Serial.print(" FG"); if (sig & FAL) Serial.print(" FA"); if (sig & FRL) Serial.print(" FR"); if (sig & EGL) Serial.print(" EG"); if (sig & EAL) Serial.print(" EA"); if (sig & ERL) Serial.print(" ER"); if (sig & DGL) Serial.print(" DG"); if (sig & DAL) Serial.print(" DA"); if (sig & DRL) Serial.print(" DR"); if (sig & CGL) Serial.print(" CG"); if (sig & CAL) Serial.print(" CA"); if (sig & CRL) Serial.print(" CR"); if (sig & BGL) Serial.print(" BG"); if (sig & BAL) Serial.print(" BA"); if (sig & BRL) Serial.print(" BR"); if (sig & ARL) Serial.print(" AR"); if (sig & AGL) Serial.print(" AG"); if (sig & AAL) Serial.print(" AA"); Serial.println( );} unsigned long work_signals(int sig) { unsigned long the_signals; #if DEBUG dump_sig(sig); #endif //********************************Program Here************************** switch ( sig) { case 0 : the_signals = ARL+BAL+CRL+DRL+EGL+FRL+GRL+HGL; lcd1.message(0,"GO: Main to Pommy"); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Pom. to Main"); lcd2.message(1,"ST: HW,Side,Ash."); break; //BG*,63*,61*,60* case 1 : the_signals = ARL+BGL+CRL+DRL+EAL+FAL+GGL+HRL; lcd1.message(0,"GO: Main to HW."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: HW to Main"); lcd2.message(1,"GO: Side <-> Pom."); break; //BG*,63*,61*,60 case 2 : the_signals = AAL+BRL+CRL+DRL+EGL+FRL+GRL+HAL; lcd1.message(0,"GO: Silos to Pom."); lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"GO: Pom. to Silos"); lcd2.message(1,"ST: HW,Side,Ash."); break; //BG*,63*,61,60* case 3 : the_signals = AGL+BRL+CRL+DRL+EAL+FAL+GAL+HRL; lcd1.message(0,"GO: Silos to HW"); lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"GO: HW to Silos"); lcd2.message(1,"GO: Side <-> Pom."); break; //BG*,63*,61,60 //----------------------------------------------------------------------- case 4 : the_signals = ARL+BAL+CGL+DGL+ERL+FRL+GRL+HGL; lcd1.message(0,"GO: Main to Ash."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Ash to Main."); lcd2.message(1,"ST: HW,Side,Pom."); break; //BG*,63,61*,60* case 5 : the_signals = ARL+BGL+CGL+DAL+ERL+FGL+GGL+HRL; lcd1.message(0,"GO: Main to HW."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: HW to Main."); lcd2.message(1,"GO: Side <-> Ash."); break; //BG*,63,61*,60 case 6 : the_signals = AAL+BRL+CGL+DGL+ERL+FRL+GRL+HAL; lcd1.message(0,"GO: Main to Ash."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Ash to Main."); lcd2.message(1,"ST: HW,Side,Pom."); break; //BG*,63,61,60* case 7 : the_signals = AGL+BRL+CGL+DAL+ERL+FGL+GAL+HRL; lcd1.message(0,"GO: Silos to HW."); lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"GO: HW to Silos"); lcd2.message(1,"GO: Side <-> Ash."); break; //BG*,63,61,60 //------------------------------------------------------------- case 8 : the_signals = ARL+BRL+CRL+DRL+ERL+FRL+GRL+HRL; lcd1.message(0,"GO: Main to Pom."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Pom. to Main"); lcd2.message(1,"ST: HW,Side,Ash."); break; //BG,63*,61*,60* case 9 : the_signals = ARL+BRL+CRL+DRL+EAL+FAL+GRL+HRL; lcd1.message(0,"??: Main to Side"); //Trains could cross at scissor crossing lcd1.message(1,"STOP: Silos"); lcd2.message(0,"??: Side to Main"); //Trains could cross at scissor crossing lcd2.message(1,"ST: HW,Ash,Pom."); break; //BG,63*,61*,60 case 10 : the_signals = ARL+BRL+CRL+DRL+ERL+FRL+GRL+HRL; lcd1.message(0,"GO: Silos to Pom."); lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"GO: Pom. to Silos"); lcd2.message(1,"ST: HW,Side,Ash."); break; //BG,63*,61,60* case 11 : the_signals = ARL+BRL+CRL+DRL+EAL+FAL+GRL+HRL; lcd1.message(0,"??: Silos to Side"); //Trains could cross at scissor crossing lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"??: Side to Silos"); //Trains could cross at scissor crossing lcd2.message(1,"ST: HW,Ash,Pom."); break; //BG,63*,61*,60 //-------------------------------------------------------------------------- case 12 : the_signals = ARL+BRL+CRL+DRL+ERL+FRL+GRL+HRL; lcd1.message(0,"GO: Main to Ash."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Ash to Main"); lcd2.message(1,"ST: HW & Pom."); break; //BG,63,61*,60* case 13 : the_signals = ARL+BRL+CRL+DAL+ERL+FGL+GRL+HRL; lcd1.message(0,"??: Main to Side"); //Trains could cross at scissor crossing lcd1.message(1,"STOP: Silos"); lcd2.message(0,"??: Side to Main"); //Trains could cross at scissor crossing lcd2.message(1,"ST: HW,Ash,Pom."); break; //BG,63,61,60 case 14 : the_signals = ARL+BRL+CRL+DRL+ERL+FRL+GRL+HRL; lcd1.message(0,"GO: Main to Ash."); lcd1.message(1,"STOP: Silos"); lcd2.message(0,"GO: Ash to Main."); lcd2.message(1,"ST: Pom.,Side,HW"); break; //BG,63,61*,60* case 15 : the_signals = ARL+BRL+CRL+DAL+ERL+FGL+GRL+HRL; lcd1.message(0,"??: Silos to Side"); //Trains could cross at scissor crossing lcd1.message(1,"STOP: Mainline"); lcd2.message(0,"??: Side to Silos"); //Trains could cross at scissor crossing lcd2.message(1,"ST: HW,Ash,Pom."); ;break; //BG,63,61,60 } //******************End Program Here Code************************* #if DEBUG print_signals(the_signals); #endif return the_signals;}void ripple_out(unsigned long sig) { //sig = 0x800000; //AG //sig = 1; //HR int j; sig = sig^((1<<AG)|(1<<AA)|(1<<AR)|(1<<BG)|(1<<BA)|(1<<BR)|(1<<CG)|(1<<CA)|(1<<CR)|(1<<DG)|(1<<DA)|(1<<DR)|(1<<EG)|(1<<EA)|(1<<ER)| (1<<FG)|(1<<FA)|(1<<FR)|(1<<GG)|(1<<GA)|(1<<GR)|(1<<HG)|(1<<HA)|(1<<HR)); //SIGNALS NEGATIVE LOGIC #if DEBUG Serial.print("Serial string HR..AG (active low) = "); #endif for ( int i = HR; i<= AG; i++ ) { digitalWrite(2,sig&1); #if DEBUG Serial.print(sig&1); j++; if ((j==3)&&(i!=AG)) { j=0; Serial.print(",");} #endif digitalWrite(3,1); //clock digitalWrite(3,0); sig = sig>>1; } #if DEBUG Serial.println(); Serial.println(); #endif } //ripple_outvoid setup() { lcd1.begin( ); lcd2.begin( ); pinMode(2,OUTPUT); pinMode(3,OUTPUT); #if (DEBUG) Serial.begin(115200); Serial.println("Action"); #endif; previous_points = read_points( ); ripple_out(work_signals(previous_points)); lcd1.message(0,"-Point settings-"); lcd1.message(1,"--Delta Layout--"); lcd2.message(0,"-Point settings-"); lcd2.message(1,"--Delta Layout--");}void loop() { points = read_points( ); //continuously read //delay(5000); // 3 lines used to test LCD displays //points += 1; //if (points == 8) points= 0; if (points != previous_points) { previous_points = points; //work_signals(points); ripple_out(work_signals(previous_points)); }}