Guest User

Untitled

a guest
May 21st, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 KB | None | 0 0
  1. /*
  2. * TIMED SIGNAL CONTROLLER for the ARDUINO UNO
  3. * Timed Traffic Light Controller Sketch
  4. * Written by Jacob Jewett - May 2018
  5. *
  6. * Concept idea:
  7. * Use a 5VDC relay board to control a 3-section 120VAC traffic signal
  8. * from green to red based timers.
  9. *
  10. * Dependencies:
  11. * Atomic.h (Arduino standard lib)
  12. *
  13. * Breadboard parts:
  14. * - 4Ch. Relay Board
  15. * - 2x LED's: one red, one green
  16. *
  17. * Pinout:
  18. * A0: Relay 1, SIGNAL RED
  19. * A1: Relay 2, SIGNAL YELLOW
  20. * A2: Relay 3, SIGNAL GREEN
  21. * A3: Relay 4, Unused
  22. * A4: Status indicator
  23. * A5: Power indicator
  24. */
  25.  
  26. #include <util/atomic.h>
  27.  
  28. //User controllable defines
  29. #define RELAY_ACTIVE_LOW 1 //If the signal to relays should be inverted
  30. #define RLY1 A0 //Red
  31. #define RLY2 A1 //Yellow
  32. #define RLY3 A2 //Green
  33. #define RLY4 A3 //Relay 4
  34.  
  35. #define STSIND A4 //Status indicator
  36. #define PWRIND A5 //Power indicator
  37.  
  38. #define TIME_STOP_MAX 60
  39. #define TIME_CAUTION_MAX 10
  40. #define TIME_GO_MAX 60
  41. #define TIME_INIT_MAX 10
  42.  
  43. //Control types
  44. enum SignalMode
  45. {
  46. SIGNAL_BLANK,
  47. SIGNAL_GO,
  48. SIGNAL_GO_F,
  49. SIGNAL_CAUTION,
  50. SIGNAL_CAUTION_F,
  51. SIGNAL_STOP,
  52. SIGNAL_STOP_F
  53. };
  54. enum SignalState
  55. {
  56. STATE_INIT_FLASH,
  57. STATE_STOP,
  58. STATE_CAUTION,
  59. STATE_GO
  60. };
  61.  
  62. //Runtime variables
  63. unsigned long tNow = millis();
  64. volatile bool flashReference = false;
  65. volatile bool timer0Active = false;
  66. volatile unsigned int timer0 = 0;
  67. bool hasInit = false;
  68. bool initFlash = true;
  69. unsigned int signalState = STATE_INIT_FLASH;
  70.  
  71. void relayOn(int relay)
  72. {
  73. if (RELAY_ACTIVE_LOW)
  74. {
  75. digitalWrite(relay, LOW);
  76. }
  77. else
  78. {
  79. digitalWrite(relay, HIGH);
  80. }
  81. }
  82. void relayOff(int relay)
  83. {
  84. if (RELAY_ACTIVE_LOW)
  85. {
  86. digitalWrite(relay, HIGH);
  87. }
  88. else
  89. {
  90. digitalWrite(relay, LOW);
  91. }
  92. }
  93. bool relayState(int relay)
  94. {
  95. if (RELAY_ACTIVE_LOW)
  96. {
  97. return !digitalRead(relay);
  98. }
  99. return digitalRead(relay);
  100. }
  101. void relayState(int relay, int value)
  102. {
  103. if (RELAY_ACTIVE_LOW)
  104. {
  105. digitalWrite(relay, !value);
  106. }
  107. else
  108. {
  109. digitalWrite(relay, value);
  110. }
  111. }
  112. void flashPin(int pin)
  113. {
  114. digitalWrite(pin, flashReference);
  115. }
  116. void flashPinI(int pin)
  117. {
  118. digitalWrite(pin, !flashReference);
  119. }
  120. void flashRelay(int relayPin)
  121. {
  122. relayState(relayPin, flashReference);
  123. }
  124. class Signal3S
  125. {
  126. public:
  127. Signal3S(unsigned int red, unsigned int yellow, unsigned int green) : _pin_red(red), _pin_yellow(yellow), _pin_green(green) {}
  128. void setMode(int mode)
  129. {
  130. if (_mode != mode)
  131. {
  132. _mode = mode;
  133. }
  134. }
  135. int getMode() { return _mode; }
  136. void updateSignal()
  137. {
  138. if (_mode == SIGNAL_BLANK)
  139. {
  140. relayOff(_pin_green);
  141. relayOff(_pin_yellow);
  142. relayOff(_pin_red);
  143. }
  144. if (_mode == SIGNAL_GO)
  145. {
  146. relayOn(_pin_green);
  147. relayOff(_pin_yellow);
  148. relayOff(_pin_red);
  149. }
  150. if (_mode == SIGNAL_GO_F)
  151. {
  152. flashRelay(_pin_green);
  153. relayOff(_pin_yellow);
  154. relayOff(_pin_red);
  155. }
  156. if (_mode == SIGNAL_CAUTION)
  157. {
  158. relayOn(_pin_yellow);
  159. relayOff(_pin_red);
  160. relayOff(_pin_green);
  161. }
  162. if (_mode == SIGNAL_CAUTION_F)
  163. {
  164. flashRelay(_pin_yellow);
  165. relayOff(_pin_red);
  166. relayOff(_pin_green);
  167. }
  168. if (_mode == SIGNAL_STOP)
  169. {
  170. relayOn(_pin_red);
  171. relayOff(_pin_yellow);
  172. relayOff(_pin_green);
  173. }
  174. if (_mode == SIGNAL_STOP_F)
  175. {
  176. flashRelay(_pin_red);
  177. relayOff(_pin_yellow);
  178. relayOff(_pin_green);
  179. }
  180. }
  181. private:
  182. unsigned int _pin_red;
  183. unsigned int _pin_yellow;
  184. unsigned int _pin_green;
  185. unsigned int _mode;
  186. };
  187.  
  188. //Objects
  189. Signal3S s0(RLY1,RLY2,RLY3);
  190. void setup()
  191. {
  192. //Interupts
  193. cli();
  194. TCCR1A = 0;
  195. TCCR1B = 0;
  196. TCNT1 = 0;
  197. OCR1A = 15624;
  198. TCCR1B |= (1 << WGM12);
  199. TCCR1B |= (1 << CS12) | (1 << CS10);
  200. TIMSK1 |= (1 << OCIE1A);
  201. sei();
  202. //Relays:
  203. pinMode(RLY1, OUTPUT);
  204. pinMode(RLY2, OUTPUT);
  205. pinMode(RLY3, OUTPUT);
  206. pinMode(RLY4, OUTPUT);
  207. relayOff(RLY1);
  208. relayOff(RLY2);
  209. relayOff(RLY3);
  210. relayOff(RLY4);
  211. //Indicators
  212. pinMode(STSIND, OUTPUT);
  213. pinMode(PWRIND, OUTPUT);
  214. digitalWrite(PWRIND, HIGH);
  215. //Flags
  216. timer0Active = true;
  217. //Comms
  218. Serial.begin(9600);
  219. }
  220. ISR(TIMER1_COMPA_vect)
  221. {
  222. flashReference = !flashReference;
  223. if (timer0Active)
  224. {
  225. timer0++;
  226. }
  227. }
  228. void loop()
  229. {
  230. tNow = millis();
  231. flashPin(STSIND);
  232. if (signalState == 0 && timer0 >= TIME_INIT_MAX)
  233. {
  234. hasInit = true;
  235. signalState = 1;
  236. timer0 = 0;
  237. }
  238. else
  239. {
  240. s0.setMode(SIGNAL_STOP_F);
  241. }
  242. if (hasInit)
  243. {
  244. if (signalState == STATE_STOP)
  245. {
  246. s0.setMode(SIGNAL_STOP);
  247. }
  248. if (signalState == STATE_CAUTION)
  249. {
  250. s0.setMode(SIGNAL_CAUTION);
  251. }
  252. if (signalState == STATE_GO)
  253. {
  254. s0.setMode(SIGNAL_GO);
  255. }
  256.  
  257. if (signalState == STATE_STOP && timer0 >= TIME_STOP_MAX)
  258. {
  259. signalState = 3;
  260. timer0 = 0;
  261. }
  262. if (signalState == STATE_CAUTION && timer0 >= TIME_CAUTION_MAX)
  263. {
  264. signalState = 1;
  265. timer0 = 0;
  266. }
  267. if (signalState == STATE_GO && timer0 >= TIME_GO_MAX)
  268. {
  269. signalState = 2;
  270. timer0 = 0;
  271. }
  272. }
  273. s0.updateSignal();
  274. }
Add Comment
Please, Sign In to add comment