//Signals3_Serial_Class.ino#include "Signals3_Serial_Class.h"#define DELTA 5000long int go;Signals3_Serial_Class signal(D2,D1);void setup() { signal.begin(1,1); //signal.begin(0 ); //no external NOR gate signal.signal_control(3,1,2,3);}
void loop() { if (millis( ) < (go+DELTA)) signal.signal_control(3,1); //signal red for 5 seconds else { signal.signal_control(3,0); //in next 20 seconds signal goes through RED-AMBER_GREEN if ((millis( ) > (go+(5*DELTA)))) go =millis(); } };----------------------------------------//Signals3_Serial_Class.cpp#include "Signals3_Serial_Class.h"
Signals3_Serial_Class::Signals3_Serial_Class(int ser_in, int clk){ _ser_in = ser_in; _clk = clk;}oneSignal::oneSignal(){ _theRed =0; _theGreen = 0; _signalStart=0; }
void oneSignal::setRed(int red){ _theRed =red;}void oneSignal::setGreen(int green){ _theGreen =green;}int oneSignal::getRed(){ return _theRed;}int oneSignal::getGreen( ){ return _theGreen;}void oneSignal::setState(int st) { _trainState= st;}int oneSignal::getState( ){ return _trainState;}void oneSignal::setTime(long tt) { _signalStart= tt;}long oneSignal::getTime( ){ return _signalStart;}oneSignal *signalArray;long int updateOP;
void Signals3_Serial_Class::begin(int external, int polarity,int no_sigs ){ _external = external; _polarity = polarity;_no_sigs=no_sigs; pinMode(_ser_in,OUTPUT); pinMode(_clk,OUTPUT); digitalWrite(_clk,LOW); signalArray = new oneSignal[_no_sigs]; for (int i=0; i<_no_sigs; i++){ signalArray[i].setRed(0); signalArray[i].setGreen(0); signalArray[i].setState(wait4train); } updateOP = millis( ); }void Signals3_Serial_Class::begin(int external, int polarity ){ Signals3_Serial_Class:: begin(external,polarity,4); }
void Signals3_Serial_Class::begin(int external ){ Signals3_Serial_Class:: begin(external,1,4);}void Signals3_Serial_Class::begin( ){ Signals3_Serial_Class::begin(1,1,4);}void Signals3_Serial_Class::dumpArray( ){ if (millis() < (updateOP + UPDATE_TIME)) return; updateOP= millis( ); //reset the timing clock for (int i=0; i<_no_sigs; i++) { //with no change in data get 4 pulses 1.96uS apart if (_polarity) digitalWrite(_ser_in, signalArray[i].getRed( )); else digitalWrite(_ser_in, !signalArray[i].getRed( )); digitalWrite(_clk,HIGH); //each pulse 980nS digitalWrite(_clk,LOW); if (!_external){ //output amber signal as well if (_polarity) digitalWrite(_ser_in, !(signalArray[i].getRed()||signalArray[i].getGreen())); else digitalWrite(_ser_in, (signalArray[i].getRed()||signalArray[i].getGreen())); digitalWrite(_clk,HIGH); digitalWrite(_clk,LOW); } if (_polarity) digitalWrite(_ser_in, signalArray[i].getGreen( )); else digitalWrite(_ser_in, !signalArray[i].getGreen( )); digitalWrite(_clk,HIGH); digitalWrite(_clk,LOW); }}
void Signals3_Serial_Class::signal_control(int sig, int dsp){ switch(signalArray[sig].getState( ) ) { case wait4train: signalArray[sig].setRed(0 ); signalArray[sig].setGreen(1); if (dsp ==1) signalArray[sig].setState(wait4end); break; case wait4end: signalArray[sig].setRed(1 ); signalArray[sig].setGreen(0); signalArray[sig].setTime(millis( )); if (dsp == 0) {signalArray[sig].setState(wait4red); //another train } break; case wait4red: signalArray[sig].setRed(1 ); //keep RED active signalArray[sig].setGreen(0); if (millis( )-signalArray[sig].getTime() >= delay4red) { signalArray[sig].setState(wait4amber); signalArray[sig].setTime(millis( )); } if (dsp ==1) signalArray[sig].setState(wait4end ); break; case wait4amber: signalArray[sig].setRed(0 ); //Now AMBER signalArray[sig].setGreen(0); if (millis( )-signalArray[sig].getTime( ) >= delay4amber) { signalArray[sig].setState(wait4train); } if (dsp ==1) signalArray[sig].setState(wait4end ); //another train break; default: signalArray[sig].setState(wait4train); } dumpArray( );}
void Signals3_Serial_Class::signal_control(int sig, int dsp, int red_wait){ delay4red = red_wait*1000; signal_control(sig,dsp); }void Signals3_Serial_Class::signal_control(int sig, int dsp, int red_wait, int amber_wait){ delay4amber = amber_wait * 1000; signal_control(sig,dsp,red_wait);} ;--------------------------------------//Signals3_Serial_Class.h#ifndef SIGNALS3_SERIAL_CLASS_H#define SIGNALS3_SERIAL_CLASS_H#include "Arduino.h"#define UPDATE_TIME 100
class oneSignal { public: oneSignal( ); enum state {wait4train, wait4end, wait4red, wait4amber}; void setRed(int red); void setGreen(int green); int getRed( ); int getGreen( ); void setTime(long int time); long int getTime( ); void setState(int st); int getState(); private: int _theRed, _theGreen; long int _signalStart; int _trainState =wait4train; }; //<----don't forget semi colon -error flagged in unexpected places
class Signals3_Serial_Class : public oneSignal { public: Signals3_Serial_Class(int ser_in, int clk); void begin( ); void begin(int ext_gate); void begin(int ext_gate, int polarity); void begin(int ext_gate, int polarity, int no_sigs); void signal_control(int sig, int dsp); void signal_control(int sig, int dsp, int red_wait); void signal_control(int sig, int dsp, int red_wait, int amber_wait); private: int _ser_in, _clk; int _external, _polarity, _no_sigs; void dumpArray( ); long delay4red = 5000L; //RED remains on for 5 seconds long delay4amber = 5000L; //AMBER on for 5 seconds };#endif