vulture2600

Trike Lights

Feb 15th, 2016
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.54 KB | None | 0 0
  1. /*
  2. TRIKE LIGHTS for Peacock Groove Cargo Trike. www.facebook.com/peacockgroove/
  3. Code by Steve McCluskey and Karl Stoerzinger
  4.  
  5. This sketch flashes 13 LEDs and has 3 digital inputs for mode and L/R turn signals.
  6.  
  7. Revision History:
  8. V1.0 : Prototype release. 02/14/16
  9. V1.1 : Changed led0next/led1next/etc to ledNext[7] array. 02/15/16
  10. V1.2 : Changed led0p/led1p/etc to ledP[7] array. Karl tweaked hazard() to only blink corners and make the sides and center reds stay on. Mode 3 is now
  11. skipped due to lack of dedicated brake lever switch. 02/16/15
  12.  
  13. Modes:
  14. ----------
  15. Switch off     : all lights off.
  16. Switch on      : steady on (default).
  17. Off/on quick 1 : normal amber, normal red.
  18. Off/on quick 2 : normal amber, brake red.
  19. Off/on quick 3 : hazards.
  20. Off/on quick 4 : back to steady on.
  21.  
  22. Turn signals are always active and work with current pattern.
  23.  
  24. Hardware:
  25. Using TIP102/TIP1206 NPN transistors to switch the ground of the 12v LED fixtures.
  26.  - 1k resistor from digitial pin to left leg of TIP102.
  27.  - middle leg of TIP102 to negative wire of LED (white, in this case!).
  28.  - right leg of TIP102 to ground of 12v power source.
  29.  - tie 12v ground to 5v ground!!!
  30.  - +12v to positive wires of all LED fixtures.
  31.  - 5v supplied to power microcontroller via appropriate LM7805 vreg circuit, etc.
  32.  - put a suitable fuse on the 12v wire(s) going out to lights!
  33.  
  34. ARRAY SIZES:
  35. https://arduino.land/FAQ/content/6/29/en/how-to-get-the-size-of-an-array.html  
  36. number of elements in array (kludged because there is no straightforward array length function!)
  37. unsigned int led0el = sizeof( ledAr[0] ) / sizeof( uint16_t );
  38. unsigned int led1el = sizeof( ledAr[1] ) / sizeof( uint16_t );
  39. unsigned int led2el = sizeof( ledAr[2] ) / sizeof( uint16_t );
  40. Not currently used.
  41.  
  42. Some sample patterns by Karl:
  43. {40,40,40,40,40,40,40,40,300,400,0};                                            4 short pulses, 1 long
  44. {100,50,100,50,100,50,50,100,50,100,50,100,0};                                  alternating duty cycle (needs work)
  45. {10,10,20,20,30,30,40,40,50,50,60,60,70,70,80,80,90,90,100,100,0};              ramp down fast to slow (needs work)
  46. {50,50,50,50,50,50,50,50,50,50,50,100,100,50,100,50,100,100,0};                 alternating fast and slow strobes (pretty good)
  47. {50,50,50,50,50,50,50,50,50,550,0}    and   {50,550,50,50,50,50,50,50,50,50,0}  kind of alternating pairs of strobes
  48. {25,100,50,100,75,100,100,100,75,100,50,100,25,100,0}                           constant off time, ramping on time
  49. {50,200,50,150,50,100,50,50,50,100,50,150,50,200,50,250,0}                      constant on time, ramping off time
  50. {370,340,0}                                                                     turn signal
  51. {20,40,20,40,20,200,20,40,20,40,20,200,20,40,20,40,20,500,0}                    three fast strobes and a pause (pretty good)
  52.  
  53. On/off logic:
  54. 0%2 = 0
  55. 1%2 = 1
  56. 2%2 = 0
  57. 3%2 = 1
  58.  
  59. element   0             1             2             3
  60. value     20            30            10            50
  61. meaning   on for 20ms   off for 30    on for 10     off for 50
  62.  
  63. LEDs on trike are arranged as follows:
  64.  
  65.   Y0     Y0
  66. Y1         Y1
  67.  
  68. Y2         Y2
  69.  
  70. Y3         Y3
  71.   R  RRR  R
  72.   0  123  4
  73.  
  74. Output pin layout as follows:
  75. 0  : Serial RX     (NC).
  76. 1  : Serial TX     (NC).
  77. 2  : Amber Left  0 (Front facing).
  78. 3 ~: Amber Left  1 (Side facing).
  79. 4  : Amber Left  2 (Side facing).
  80. 5 ~: Red         0 (Rear facing).
  81. 6 ~: Red         1 (Rear facing).
  82. 7  : Amber Left  3 (Side facing).
  83. 8  : Amber Right 0 (Front facing).
  84. 9 ~: Red         2 (Rear facing).
  85. 10~: Red         3 (Rear facing).
  86. 11~: Red         4 (Rear facing).
  87. 12 : Amber Right 1 (Side facing).
  88. 13 : Amber Right 2 (Side facing).
  89. A5 : Amber Right 3 (Side facing).
  90.  
  91. Inputs:
  92. A0 : NC.
  93. A1 : Ground.
  94. A2 : Mode.
  95. A3 : Left turn.
  96. A4 : Right turn.
  97. */
  98.  
  99. // Pin declarations:
  100. #define amberL0        2
  101. #define amberL1        3
  102. #define amberL2        4
  103. #define amberL3        7
  104.  
  105. #define amberR0        8
  106. #define amberR1        12
  107. #define amberR2        13
  108. #define amberR3        A5
  109.  
  110. #define red0           5
  111. #define red1           6
  112. #define red2           9
  113. #define red3           10
  114. #define red4           11
  115.  
  116. #define inputGnd       A1
  117. #define modeSwitch     A2
  118. #define lturn          A3
  119. #define rturn          A4
  120.  
  121. #define modeSwitchTime 500 // Change to make switching modes easier or harder.
  122.  
  123.  
  124. // Current flash patterns:
  125. uint16_t ledAr[7][11] = {{40, 40, 40, 40, 40, 40, 40, 40, 300, 400, 0},
  126.                          {42, 42, 42, 42, 42, 42, 42, 42, 300, 400, 0},
  127.                          {44, 44, 44, 44, 44, 44, 44, 44, 300, 400, 0},
  128.                          {46, 46, 46, 46, 46, 46, 46, 46, 300, 400, 0},
  129.                          {48, 48, 48, 48, 48, 48, 48, 48, 300, 400, 0},
  130.                          {50, 50, 50, 50, 50, 50, 50, 50, 300, 400, 0},
  131.                          {54, 54, 54, 54, 54, 54, 54, 54, 400, 500, 0}};
  132.  
  133. // Flash pattern array position pointers:
  134. uint8_t  ledP [7]     =  {0, 0, 0, 0, 0, 0, 0};
  135.  
  136. // Turn signal pattern and its position pointer:
  137. uint16_t turn  [3] = {370, 340, 0};
  138. uint8_t  turnP     =  0;
  139.  
  140. // Hazard pattern and its position pointer:
  141. uint16_t hazard[3] = {550, 400, 0};
  142. uint8_t  hazP      =  0;
  143.  
  144. //uint8_t chaseP = 0; // Chase position.
  145.  
  146. byte currentMode  = 1;
  147.  
  148. bool timerReset   = false;
  149. bool modeChanged  = true;
  150. bool modeSwitchOn = false;
  151. bool leftTurnOn   = false;
  152. bool rightTurnOn  = false;
  153.  
  154. unsigned long mls        =  0;                    // Value in which to store millis() for multiple rapid comparisons.
  155. unsigned long ledNext[7] = {0, 0, 0, 0, 0, 0, 0}; // Next millis() value at which LED state will change.
  156. unsigned long turnNext   =  0;                    // Next turn time.
  157. unsigned long hazNext    =  0;                    // Next hazard time.
  158. unsigned long modeTime   =  0;                    // How long mode switch has been off.
  159. //unsigned long chaseNext = 0;
  160.  
  161.  
  162. void setup() {
  163.   pinMode     (amberL0,    OUTPUT);
  164.   pinMode     (amberL1,    OUTPUT);
  165.   pinMode     (amberL2,    OUTPUT);
  166.   pinMode     (amberL3,    OUTPUT);
  167.   pinMode     (amberR0,    OUTPUT);
  168.   pinMode     (amberR1,    OUTPUT);
  169.   pinMode     (amberR2,    OUTPUT);
  170.   pinMode     (amberR3,    OUTPUT);
  171.   pinMode     (red0,       OUTPUT);
  172.   pinMode     (red1,       OUTPUT);
  173.   pinMode     (red2,       OUTPUT);
  174.   pinMode     (red3,       OUTPUT);
  175.   pinMode     (red4,       OUTPUT);
  176.   pinMode     (inputGnd,   OUTPUT);
  177.   digitalWrite(inputGnd,   LOW);          // Using as ground pin for now.
  178.   pinMode     (modeSwitch, INPUT_PULLUP);
  179.   pinMode     (lturn,      INPUT_PULLUP);
  180.   pinMode     (rturn,      INPUT_PULLUP);
  181. } //end setup().
  182.  
  183. void loop() {
  184.   mls = millis();                         // Store millis() in a variable for many rapid comparisons.
  185.  
  186.   // Read inputs:
  187.   if (digitalRead(modeSwitch) == LOW) {   // Input defaults to HIGH. Switch on pulls it low.
  188.     modeSwitchOn = true;
  189.   } // end if.
  190.   else {
  191.     modeSwitchOn = false;
  192.   }
  193.  
  194.   if (digitalRead(lturn)      == LOW) {
  195.     leftTurnOn   = true;
  196.   } // end if.
  197.   else {
  198.     leftTurnOn   = false;
  199.   } // end else.
  200.  
  201.   if (digitalRead(rturn)      == LOW) {
  202.     rightTurnOn  = true;
  203.   } // end if.
  204.  
  205.   else {
  206.     rightTurnOn  = false;
  207.   } // end else.
  208.  
  209.  
  210.   // Mode switch ON, no turn signals:
  211.   if (modeSwitchOn && !leftTurnOn && !rightTurnOn) {
  212.     timerReset = false;                                  // Set to false every time switch turns on.
  213.     if (mls - modeTime > modeSwitchTime) {               // Longer than timeout?
  214.       if (!modeChanged) {                                // Has mode been changed?
  215.         currentMode = 1;                                 // Reset back to 1.
  216.         modeChanged = true;                              // Mode has been changed.
  217.       } // end if.
  218.     } // end if.
  219.  
  220.     else {                                               // Shorter than timeout.
  221.       if (!modeChanged) {                                // Has mode been changed?
  222.         currentMode ++;                                  // Next mode.
  223.         if (currentMode > 4) {                           // Limit on number of modes.
  224.           currentMode = 1;                               // Reset back to 1.
  225.         } // end if.
  226.         modeChanged = true;                              // Mode has been changed.
  227.       } // end if.
  228.     } // end else.
  229.    
  230.     switch (currentMode) {                               // Displays pattern.
  231.       case 1:
  232.         steadyOn();
  233.       break; // end case 1.
  234.      
  235.       case 2:
  236.         normalAmber();
  237.         normalRed();
  238.       break; // end case 2.
  239.  
  240.       case 3:
  241.         currentMode = 4;                                 // Skip past brake light mode for now due to lack of dedicated hardware. -Karl
  242.         //normalAmber();
  243.         //brakeRed();
  244.       break; // end case 3.
  245.      
  246.       case 4:
  247.         hazards();
  248.       break; // end case 4.
  249.  
  250.       default:
  251.       break; // end case default.
  252.     } // end switch.    
  253.   } // end if switch ON.
  254.  
  255.   // Mode switch off, no turn signals:
  256.   else if (!modeSwitchOn && !leftTurnOn && !rightTurnOn) {
  257.     allOff();
  258.     modeChanged = false;
  259.     if (!timerReset) { // Only resets timer once per switch off.
  260.       modeTime = mls;
  261.       timerReset = true;
  262.     } // end if.
  263.   } // end else.
  264.  
  265.   // Mode switch off, left turn ON:
  266.   else if (leftTurnOn && !modeSwitchOn && !rightTurnOn) {
  267.     leftTurn();
  268.   } // end if.
  269.  
  270.   // Mode switch off, right turn ON:
  271.   else if (rightTurnOn && !modeSwitchOn && !leftTurnOn) {
  272.     rightTurn();
  273.   }
  274.  
  275.   // Mode switch ON, left turn ON:
  276.   else if (modeSwitchOn && leftTurnOn && !rightTurnOn) {
  277.     leftTurn();
  278.   } // end else if.
  279.  
  280.   // Mode switch ON, right turn ON:
  281.   else if (modeSwitchOn && rightTurnOn && !leftTurnOn) {
  282.     rightTurn();
  283.   } // end else if.
  284.  
  285.   delay(2);
  286. } // end loop().
  287.  
  288. void normalAmber() {
  289.   // Fronts L/R:
  290.   if (mls >= ledNext[0]) {                        // Time to do something?
  291.     if (ledAr[0][ledP[0]] == 0) {                 // Reached null value of array? Return to beginning.
  292.       ledP[0] = 0;
  293.     } // end if.
  294.     digitalWrite(amberL0, ((ledP[0] + 1) % 2));   // %2 is modulus of 2. +1 inverts the result so first element (0) creates 1 for on.
  295.     digitalWrite(amberR0, ((ledP[0] + 1) % 2));
  296.     ledNext[0] = mls + ledAr[0][ledP[0]];         // Next time to do something.
  297.     ledP[0] ++;                                   // Increment pointer.
  298.   } // end if.
  299.  
  300.   // Front side L/R:
  301.   if (mls >= ledNext[1]) {
  302.     if (ledAr[1][ledP[1]] == 0) {
  303.       ledP[1] = 0;
  304.     } // end if.
  305.     digitalWrite(amberL1, ((ledP[1] + 1) % 2));  
  306.     digitalWrite(amberR1, ((ledP[1] + 1) % 2));
  307.     ledNext[1] = mls + ledAr[1][ledP[1]];
  308.     ledP[1] ++;
  309.   } // end if.
  310.  
  311.   // Mid side L/R:
  312.   if (mls >= ledNext[2]) {
  313.     if (ledAr[2][ledP[2]] == 0) {
  314.       ledP[2] = 0;
  315.     } // end if.
  316.     digitalWrite(amberL2, ((ledP[2] + 1) % 2));
  317.     digitalWrite(amberR2, ((ledP[2] + 1) % 2));
  318.     ledNext[2] = mls + ledAr[2][ledP[2]];
  319.     ledP[2] ++;
  320.   } // end if.
  321.  
  322.   // Rear side L/R.
  323.   if (mls >= ledNext[3]) {
  324.     if (ledAr[3][ledP[3]] == 0) {
  325.       ledP[3] = 0;
  326.     } // end if.
  327.     digitalWrite(amberL3, ((ledP[3] + 1) % 2));
  328.     digitalWrite(amberR3, ((ledP[3] + 1) % 2));
  329.     ledNext[3] = mls + ledAr[3][ledP[3]];
  330.     ledP[3] ++;
  331.   } // end if.
  332. } //end normalAmber().
  333.  
  334. void normalRed() {
  335.   // Outer reds:  
  336.   if (mls >= ledNext[4]) {
  337.     if (ledAr[4][ledP[4]] == 0) {
  338.       ledP[4] = 0;
  339.     } // end if.
  340.     digitalWrite(red0, ((ledP[4] + 1) % 2));
  341.     digitalWrite(red4, ((ledP[4] + 1) % 2));
  342.     ledNext[4] = mls + ledAr[4][ledP[4]];
  343.     ledP[4] ++;
  344.   } // end if.
  345.  
  346.   // Center red:
  347.   if (mls >= ledNext[5]) {
  348.     if (ledAr[5][ledP[5]] == 0) {
  349.       ledP[5] = 0;
  350.     } // end if.
  351.     digitalWrite(red2, ((ledP[5] + 1) % 2));
  352.     ledNext[5] = mls + ledAr[5][ledP[5]];
  353.     ledP[5] ++;
  354.   } // end if.
  355.  
  356.   // Mid reds:
  357.   if (mls >= ledNext[6]) {
  358.     if (ledAr[6][ledP[6]] == 0) {
  359.       ledP[6] = 0;
  360.     } // end if.
  361.     digitalWrite(red3, ((ledP[6] + 1) % 2));
  362.     digitalWrite(red1, ((ledP[6] + 1) % 2));
  363.     ledNext[6] = mls + ledAr[6][ledP[6]];
  364.     ledP[6] ++;
  365.   } // end if.
  366. } // end normalRed().
  367.  
  368. void brakeRed() {
  369.   analogWrite(red0, 100);
  370.   analogWrite(red1, 150);
  371.   analogWrite(red2, 255);
  372.   analogWrite(red3, 150);
  373.   analogWrite(red4, 100);
  374. } //end brakeRed();
  375.  
  376. void leftTurn() {
  377.   if (modeSwitchOn) {
  378.     switch (currentMode) {
  379.       case 1:
  380.      
  381.       break; // end case 1.
  382.      
  383.       case 2 ... 3:                                  // Only do this if in normalAmber() and switch is on.
  384.         if (mls >= ledNext[0]) {
  385.           if (ledAr[0][ledP[0]] == 0) {
  386.             ledP[0] = 0;
  387.           } // end if.
  388.           digitalWrite(amberR0, ((ledP[0] + 1) % 2));
  389.           ledNext[0] = mls + ledAr[0][ledP[0]];
  390.           ledP[0] ++;
  391.         } // end if.
  392.      
  393.         if (mls >= ledNext[1]) {
  394.           if (ledAr[1][ledP[1]] == 0) {
  395.             ledP[1] = 0;
  396.           } // end if.
  397.           digitalWrite(amberR1, ((ledP[1] + 1) % 2));
  398.           ledNext[1] = mls + ledAr[1][ledP[1]];
  399.           ledP[1] ++;
  400.         } // end if.
  401.        
  402.         if (mls >= ledNext[2]) {
  403.           if (ledAr[2][ledP[2]] == 0) {
  404.             ledP[2] = 0;
  405.           } // end if.
  406.           digitalWrite(amberR2, ((ledP[2] + 1) % 2));  
  407.           ledNext[2] = mls + ledAr[2][ledP[2]];
  408.           ledP[2] ++;
  409.         } // end if.
  410.        
  411.         if (mls >= ledNext[3]) {
  412.           if (ledAr[3][ledP[3]] == 0) {
  413.             ledP[3] = 0;
  414.           } // end if.
  415.           digitalWrite(amberR3, ((ledP[3] + 1) % 2));
  416.           ledNext[3] = mls + ledAr[3][ledP[3]];
  417.           ledP[3] ++;
  418.         } // end if.
  419.       break; // end case 2 or 3.
  420.      
  421.       case 4:                                           // If in hazard mode, turn off other lights.
  422.         digitalWrite(amberR0, LOW);
  423.         digitalWrite(amberR1, LOW);
  424.         digitalWrite(amberR2, LOW);
  425.         digitalWrite(amberR3, LOW);
  426.         digitalWrite(red4,    LOW);
  427.         digitalWrite(red3,    LOW);
  428.         digitalWrite(red2,    LOW);
  429.       break; // end case 4.
  430.      
  431.       default:
  432.      
  433.       break; // end case default.
  434.     } // end switch  
  435.   } // end if modeSwitchOn.
  436.  
  437.   else {                                                 // Turn off other lights if mode switch off.
  438.     digitalWrite(amberR0, LOW);
  439.     digitalWrite(amberR1, LOW);
  440.     digitalWrite(amberR2, LOW);
  441.     digitalWrite(amberR3, LOW);
  442.     digitalWrite(red2,    LOW);
  443.     digitalWrite(red3,    LOW);
  444.     digitalWrite(red4,    LOW);
  445.   } // end else.
  446.  
  447.   // Calls turn signal array pattern:
  448.   if (mls >= turnNext) {                      
  449.     if (turn[turnP] == 0) {
  450.       turnP = 0;
  451.     } // end if.
  452.     digitalWrite(amberL0, ((turnP + 1) % 2));
  453.     digitalWrite(amberL1, ((turnP + 1) % 2));
  454.     digitalWrite(amberL2, ((turnP + 1) % 2));
  455.     digitalWrite(amberL3, ((turnP + 1) % 2));
  456.     digitalWrite(red0,    ((turnP + 1) % 2));
  457.     digitalWrite(red1,    ((turnP + 1) % 2));
  458.    
  459.     if (modeSwitchOn && currentMode != 4) {              // Ignore hazard mode.
  460.       analogWrite (red2,    128);
  461.       analogWrite (red3,    40);
  462.       analogWrite (red4,    10);
  463.     } // end if.
  464.     else {
  465.       digitalWrite(red2,    LOW);
  466.       digitalWrite(red3,    LOW);
  467.       digitalWrite(red4,    LOW);
  468.     } // end else.
  469.    
  470.     turnNext = mls + turn[turnP];
  471.     turnP ++;
  472.   } // end if.
  473. } // end leftTurn().
  474.  
  475. void rightTurn() {
  476.   if (modeSwitchOn) {
  477.     switch (currentMode) {
  478.       case 1:
  479.      
  480.       break; // end case 1.
  481.      
  482.       case 2 ... 3:
  483.         if (mls >= ledNext[0]) {
  484.           if (ledAr[0][ledP[0]] == 0) {
  485.             ledP[0] = 0;
  486.           } // end if.
  487.           digitalWrite(amberL0, ((ledP[0] + 1) % 2));  
  488.           ledNext[0] = mls + ledAr[0][ledP[0]];
  489.           ledP[0] ++;
  490.         } // end if.
  491.      
  492.         if (mls >= ledNext[1]) {
  493.           if (ledAr[1][ledP[1]] == 0) {
  494.             ledP[1] = 0;
  495.           } // end if.
  496.           digitalWrite(amberL1, ((ledP[1] + 1) % 2));
  497.           ledNext[1] = mls + ledAr[1][ledP[1]];  
  498.           ledP[1] ++;
  499.         } // end if.
  500.        
  501.         if (mls >= ledNext[2]) {
  502.           if (ledAr[2][ledP[2]] == 0) {
  503.             ledP[2] = 0;
  504.           } // end if.
  505.           digitalWrite(amberL2, ((ledP[2] + 1) % 2));  
  506.           ledNext[2] = mls + ledAr[2][ledP[2]];
  507.           ledP[2] ++;
  508.         } // end if.
  509.        
  510.         if (mls >= ledNext[3]) {
  511.           if (ledAr[3][ledP[3]] == 0) {
  512.             ledP[3] = 0;
  513.           } // end if.
  514.           digitalWrite(amberL3, ((ledP[3] + 1) % 2));  
  515.           ledNext[3] = mls + ledAr[3][ledP[3]];
  516.           ledP[3] ++;
  517.         } // end if.
  518.       break; // end case 2 or 3.
  519.        
  520.       case 4:
  521.         digitalWrite(amberL0, LOW);
  522.         digitalWrite(amberL1, LOW);
  523.         digitalWrite(amberL2, LOW);
  524.         digitalWrite(amberL3, LOW);
  525.         digitalWrite(red0,    LOW);
  526.         digitalWrite(red1,    LOW);
  527.         digitalWrite(red2,    LOW);
  528.       break; // end case 4.
  529.      
  530.       default:
  531.      
  532.       break; // end case default.
  533.     } // end switch.
  534.   } // end if modeSwitchOn.
  535.  
  536.   else {
  537.     digitalWrite(amberL0, LOW);
  538.     digitalWrite(amberL1, LOW);
  539.     digitalWrite(amberL2, LOW);
  540.     digitalWrite(amberL3, LOW);
  541.     digitalWrite(red2,    LOW);
  542.     digitalWrite(red1,    LOW);
  543.     digitalWrite(red0,    LOW);
  544.   } // end else.
  545.  
  546.   if (mls >= turnNext) {
  547.     if (turn[turnP] == 0) {
  548.       turnP = 0;
  549.     } // end if.
  550.     digitalWrite(amberR0, ((turnP + 1) % 2));
  551.     digitalWrite(amberR1, ((turnP + 1) % 2));
  552.     digitalWrite(amberR2, ((turnP + 1) % 2));
  553.     digitalWrite(amberR3, ((turnP + 1) % 2));
  554.     digitalWrite(red3,    ((turnP + 1) % 2));
  555.     digitalWrite(red4,    ((turnP + 1) % 2));
  556.    
  557.     if (modeSwitchOn && currentMode != 4) {
  558.       analogWrite (red2,    128);
  559.       analogWrite (red1,    40);
  560.       analogWrite (red0,    10);
  561.     } // end if.
  562.     else {
  563.       digitalWrite(red0,    LOW);
  564.       digitalWrite(red1,    LOW);
  565.       digitalWrite(red2,    LOW);
  566.     } // end else.
  567.     turnNext = mls + turn[turnP];
  568.     turnP ++;
  569.   } // end if.
  570. } // end rightTurn().
  571.  
  572. void steadyOn() {
  573.   digitalWrite(amberL0, HIGH);
  574.   digitalWrite(amberL1, HIGH);
  575.   digitalWrite(amberL2, HIGH);
  576.   digitalWrite(amberL3, HIGH);
  577.   digitalWrite(amberR0, HIGH);
  578.   digitalWrite(amberR1, HIGH);
  579.   digitalWrite(amberR2, HIGH);
  580.   digitalWrite(amberR3, HIGH);
  581.   analogWrite (red0,    40);
  582.   analogWrite (red1,    40);
  583.   analogWrite (red2,    40);
  584.   analogWrite (red3,    40);
  585.   analogWrite (red4,    40);
  586. } // end steadyOn().
  587.  
  588. void allOff() { // All lights off.
  589.   for (uint8_t x = 2; x < 14; x ++) {
  590.     digitalWrite(x, LOW);
  591.   } // end for.
  592.   digitalWrite(A5, LOW);
  593. } // end allOff().
  594.  
  595. void hazards(){
  596.   if (mls >= hazNext) {
  597.     if (hazard[hazP] == 0) {
  598.       hazP = 0;
  599.     } // end if.
  600.     uint8_t value = ((hazP + 1) % 2); // Only do calculation once instead of each digitalWrite.
  601.     digitalWrite(amberL0, value);     // Tweak hazards to only flash the corners of the vehicle. -Karl
  602.     digitalWrite(amberL1, value);
  603.     digitalWrite(amberL2, 1);
  604.     digitalWrite(amberL3, value);
  605.     digitalWrite(amberR0, value);
  606.     digitalWrite(amberR1, value);
  607.     digitalWrite(amberR2, 1);
  608.     digitalWrite(amberR3, value);
  609.     digitalWrite(red0,    value);
  610.     digitalWrite(red1,    1);
  611.     digitalWrite(red2,    1);
  612.     digitalWrite(red3,    1);
  613.     digitalWrite(red4,    value);
  614.     hazNext = mls + hazard[hazP];
  615.     hazP ++;
  616.   } // end if.
  617. } // end hazards().
Advertisement
Add Comment
Please, Sign In to add comment