dillonradio

Untitled

Feb 28th, 2016
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.79 KB | None | 0 0
  1. /* candle for Adafruit NeoPixel
  2.    1 pixel version
  3.    by Tim Bartlett, December 2013
  4.    Version for FastLED and removed instances of delay()
  5.    Adapted by Rob Hilken, February 2016
  6. */
  7.  
  8. // current settings for 3.5v Teensy 3.1
  9.  
  10. #include <FastLED.h>
  11. #define LED_PIN 2
  12. #define NUM_LEDS 1
  13. #define BRIGHTNESS  100 // set at 25 to run powersaving
  14.  
  15. struct CRGB leds[NUM_LEDS];
  16.  
  17. // Candle animation randomiser and status monitor
  18. byte candleAnimStatus[NUM_LEDS];              // 1: On, 2: Burn, 3: Flicker, 4: Flutter
  19. byte randomAnimNumber;                        // to store random animation number from 1-4
  20. unsigned long candleAnimOnTimes[NUM_LEDS];    // millis() at switching on LED
  21. int candleAnimLength;                        // random between 1000 and 10000 milliseconds
  22.  
  23. // Storing the RGB Values of the LED
  24. byte ledRedValue[NUM_LEDS];
  25. byte ledGreenValue[NUM_LEDS];
  26. byte ledBlueValue[NUM_LEDS];
  27.  
  28. // color variables: mix RGB (0-255) for desired yellow
  29. byte redPx = 255;
  30. byte grnHigh = 100; //110-120 for 5v, 135 for 3.3v
  31. byte bluePx = 10; //10 for 5v, 15 for 3.3v
  32.  
  33. // animation time variables, with recommendations
  34. byte burnDepth = 14; //10 for 5v, 14 for 3.3v -- how much green dips below grnHigh for normal burn -
  35. byte flutterDepth = 30; //25 for 5v, 30 for 3.3v -- maximum dip for flutter
  36. byte cycleTime = 120; //120 -- duration of one dip in milliseconds
  37.  
  38. // pay no attention to that man behind the curtain
  39. byte fDelay;
  40. byte fRep;
  41. byte flickerDepth;
  42. byte burnDelay;
  43. byte burnLow;
  44. byte flickDelay;
  45. byte flickLow;
  46. byte flutDelay;
  47. byte flutLow;
  48.  
  49. // declare functions because of bug
  50. // https://github.com/FastLED/FastLED/issues/234
  51.  
  52. bool flutter(byte f, byte n);
  53. bool flicker(byte f, byte n);
  54. bool burn(byte f, byte n);
  55. void on(byte n);
  56. bool fire(byte grnLow, byte animLed);
  57. bool doDelay(unsigned long duration);
  58. void candleAnimation(byte animateCandleNumber);
  59.  
  60. void setup() {
  61.   FastLED.addLeds<WS2811, LED_PIN, RGB>(leds, NUM_LEDS);
  62.   FastLED.setBrightness( BRIGHTNESS );
  63.  
  64.   randomSeed(analogRead(0));
  65.  
  66.   flickerDepth = (burnDepth + flutterDepth) / 2.4;
  67.   burnLow = grnHigh - burnDepth;
  68.   burnDelay = (cycleTime / 2) / burnDepth;
  69.   flickLow = grnHigh - flickerDepth;
  70.   flickDelay = (cycleTime / 2) / flickerDepth;
  71.   flutLow = grnHigh - flutterDepth;
  72.   flutDelay = ((cycleTime / 2) / flutterDepth);
  73.  
  74.   Serial.begin(9600);
  75.   // while the serial stream is not open, do nothing:
  76.   // while (!Serial);
  77.  
  78.   // Print variable values for debugging
  79.   /*  Serial.print("flickerDepth = ");
  80.     Serial.println(flickerDepth);
  81.     Serial.print("burnLow = ");
  82.     Serial.println(burnLow);
  83.     Serial.print("burnDelay = ");
  84.     Serial.println(burnDelay);
  85.     Serial.print("flickLow = ");
  86.     Serial.println(flickLow);
  87.     Serial.print("flickDelay = ");
  88.     Serial.println(flickDelay);
  89.     Serial.print("flutLow = ");
  90.     Serial.println(flutLow);
  91.     Serial.print("flutDelay = ");
  92.     Serial.println(flutDelay);
  93.   */
  94. }
  95.  
  96. void loop() {
  97.   candleAnimation(0); // pass ledNumber
  98. }
  99.  
  100. void candleAnimation(byte animateCandleNumber)
  101. {
  102.   /*  each state of the animation calls one of the following animation elements:
  103.         1. on() = solid yellow - does not need a flicker so does not pass a variable
  104.         2. burn(onForSeconds) = candle is burning normally, flickering slightly
  105.         3. flicker(onForSeconds) = candle flickers noticably
  106.         4. flutter(onForSeconds) = the candle needs air!
  107.       the onForSeconds variable tells how long to play that animation element for and also
  108.       passes down into the elements that require effects
  109.   */
  110.  
  111.   //   candleAnimLength = random(0, 10);
  112.   //   randomAnimNumber = random(0, 4);
  113.   //   candleAnimStatus[animateCandleNumber] = random(0, 4);
  114.  
  115.  
  116.  
  117.   // initial value 0
  118.   static byte statenumber = 0;
  119.  
  120.   // allows for onForSecondss of each animation to be changed easily
  121.   byte onForSeconds; // in seconds
  122.  
  123.   switch (statenumber)
  124.   {
  125.     // state 0: burn for seconds equal to onForSeconds
  126.     case 0:
  127.       // burn
  128.       onForSeconds = 10;
  129.       Serial.println("Burn");
  130.       if (burn(onForSeconds, animateCandleNumber) == true)
  131.       {
  132.         // go to next state
  133.         statenumber = 1;
  134.       }
  135.       break;
  136.     // state 1: flicker for seconds equal to onForSeconds
  137.     case 1:
  138.       // flicker
  139.       onForSeconds = 5;
  140.       Serial.println("Flicker");
  141.       if (flicker(onForSeconds, animateCandleNumber) == true)
  142.       {
  143.         // go to next state
  144.         statenumber = 2;
  145.       }
  146.       break;
  147.  
  148.     // state 2: burn for seconds equal to onForSeconds
  149.     case 2:
  150.       // burn
  151.       onForSeconds = 8;
  152.       Serial.println("Burn");
  153.       if (burn(onForSeconds, animateCandleNumber) == true)
  154.       {
  155.         // go to next state
  156.         statenumber = 3;
  157.       }
  158.       break;
  159.     // state 3: flutter for seconds equal to onForSeconds
  160.     case 3:
  161.       // flutter
  162.       onForSeconds = 5;
  163.       Serial.println("Flutter");
  164.       if (flutter(onForSeconds, animateCandleNumber) == true)
  165.       {
  166.         // go to next state
  167.         statenumber = 4;
  168.       }
  169.       break;
  170.     // state 4: burn for seconds equal to onForSeconds
  171.     case 4:
  172.       // burn
  173.       onForSeconds = 3;
  174.       Serial.println("Burn");
  175.       if (burn(onForSeconds, animateCandleNumber) == true)
  176.       {
  177.         // go to next state
  178.         statenumber = 5;
  179.       }
  180.       break;
  181.     // state 5: on for seconds equal to onForSeconds
  182.     case 5:
  183.       // on
  184.       onForSeconds = 10;
  185.       Serial.println("On");
  186.       on(animateCandleNumber); // does not pass the variable as no effect is required
  187.       // delay
  188.       if (doDelay(onForSeconds * 1000)) // converts to seconds
  189.       {
  190.         // go to next state
  191.         statenumber = 6;
  192.       }
  193.       break;
  194.     // state 6: burn for seconds equal to onForSeconds
  195.     case 6:
  196.       // burn
  197.       onForSeconds = 10;
  198.       Serial.println("Burn");
  199.       if (burn(onForSeconds, animateCandleNumber) == true)
  200.       {
  201.         // go to next state
  202.         statenumber = 7;
  203.       }
  204.       break;
  205.     // state 7: flicker for seconds equal to onForSeconds and loop back
  206.     case 7:
  207.       // flicker
  208.       onForSeconds = 10;
  209.       Serial.println("Flicker");
  210.       if (flicker(onForSeconds, animateCandleNumber) == true)
  211.       {
  212.         // go to next state
  213.         statenumber = 0;
  214.       }
  215.       break;
  216.   }
  217. }
  218.  
  219.  
  220. /*
  221.   For Main Animation States
  222.   non-blocking delay for duration milliseconds
  223.   returns false if delay in progress, else true
  224. */
  225. bool doDelay(unsigned long duration)
  226. {
  227.   // variable to keep track of previous millis
  228.   static unsigned long previousStateMillis = 0;
  229.  
  230.   // if delay not started
  231.   if (previousStateMillis == 0)
  232.   {
  233.     // start delay
  234.     previousStateMillis = millis();
  235.   }
  236.   // if delay has lapsed
  237.   if (millis() - previousStateMillis >= duration)
  238.   {
  239.     // reset previous millis
  240.     previousStateMillis = 0;
  241.     // indicate that delay has lapsed
  242.     return true;
  243.   }
  244.   // indicate delay in progress
  245.   return false;
  246. }
  247.  
  248. /*
  249.   For Animation Element Effects
  250.   non-blocking delay for duration milliseconds
  251.   returns false if delay in progress, else true
  252. */
  253.  
  254.  
  255. // basic fire function - not called in main loop
  256.  
  257.  
  258. bool fire(byte grnLow, byte animLed) {
  259.   // remember if we're dimming (true) or brightening (false)
  260.   static bool fDimming = true;
  261.   // remember value for grnPx
  262.   static int grnPx = grnHigh;
  263.   // remember start time of delay
  264.   unsigned long previousMillis = 0;
  265.  
  266.   // if in dimming mode
  267.   if (fDimming == true)
  268.   {
  269.     // if timing not started yet
  270.     if (previousMillis == 0)
  271.     {
  272.       Serial.println("We have got here");
  273.       leds[animLed] = CRGB(redPx, grnPx, bluePx);
  274.       FastLED.show();
  275.       // set start time
  276.       previousMillis = millis();
  277.     }
  278.    
  279.     Serial.print("fDelay: ");
  280.     Serial.println(fDelay);
  281.     Serial.print("millis() - previousMillis: ");
  282.     Serial.println(millis() - previousMillis);
  283.    
  284.     // if delay lapsed
  285.     if (millis() - previousMillis >= fDelay)
  286.     {
  287.       Serial.println("We have got here point 2");
  288.       // decrement grnPx
  289.       grnPx--;
  290.       // reset start time
  291.       previousMillis = 0;
  292.     }
  293.  
  294.     // if lower limit reached
  295.     if (grnPx <= grnLow)
  296.     {
  297.       Serial.println("We have got here point 3");
  298.       // switch to next state
  299.       fDimming = false;
  300.     }
  301.   }
  302.   // if in brightening mode
  303.   else
  304.   {
  305.     Serial.println("We have got here point 4");
  306.     // if timing not started yet
  307.     if (previousMillis == 0)
  308.     {
  309.       Serial.println("We have got here point 5");
  310.       grnPx = grnLow;
  311.       leds[animLed] = CRGB(redPx, grnPx, bluePx);
  312.       FastLED.show();
  313.       // set start time
  314.       previousMillis = millis();
  315.     }
  316.  
  317.     // if delay lapsed
  318.     if (millis() - previousMillis >= fDelay)
  319.     {
  320.       Serial.println("We have got here point 6");
  321.       // increment grnPx
  322.       grnPx++;
  323.       // reset start time
  324.       previousMillis = 0;
  325.     }
  326.  
  327.     // if upper limit reached
  328.     if (grnPx >= grnHigh)
  329.     {
  330.       Serial.println("We have got here point 7");
  331.       // switch to previous state
  332.       fDimming = true;
  333.       // indicate that we have done one cycle dim and brighten
  334.       return true;
  335.     }
  336.   }
  337.   // indicate function not completed yet
  338.   return false;
  339. }
  340.  
  341.  
  342.  
  343. // fire animations
  344. void on(byte n) {
  345.  
  346.   byte grnPx = grnHigh - 5;
  347.   leds[n] = CRGB(redPx, grnPx, bluePx);
  348.   FastLED.show();
  349. }
  350.  
  351. bool burn(byte f, byte n) {
  352.  
  353.   fRep = f * (1000 / cycleTime);
  354.   fDelay = burnDelay;
  355.   // remember var count; initial value zero
  356.   static byte var = 0;
  357.  
  358.   // call fire; if the result is true, a cycle has been completed
  359.   if (fire(burnLow, n) == true)
  360.   {
  361.     // increment var
  362.     var++;
  363.   }
  364.  
  365.   // if not fRep cycles done
  366.   if (var < fRep)
  367.   {
  368.     // indicate burn (still) in progress
  369.     return false;
  370.   }
  371.  
  372.   // reset var
  373.   var = 0;
  374.   // indicate burn completed
  375.   return true;
  376. }
  377.  
  378. bool flicker(byte f, byte n) {
  379.  
  380.   fRep = f * (1000 / cycleTime);
  381.   static byte statenumber = 0;
  382.   static byte var = 0;
  383.  
  384.   switch (statenumber)
  385.   {
  386.     // state 0: burn once
  387.     case 0:
  388.  
  389.       fDelay = burnDelay;
  390.       if (fire(burnLow, n) == true)
  391.       {
  392.         // go to next state
  393.         statenumber = 1;
  394.       }
  395.       break;
  396.  
  397.     // state 1: flicker fRep times
  398.     case 1:
  399.       fDelay = flickDelay;
  400.  
  401.       // remember var count; initial value zero
  402.       var = 0;
  403.  
  404.       // call fire; if the result is true, a cycle has been completed
  405.       if (fire(flickLow, n) == true)
  406.       {
  407.         // increment var
  408.         var++;
  409.       }
  410.  
  411.       // if not fRep cycles done
  412.       if (var < fRep)
  413.       {
  414.         // indicate burn (still) in progress
  415.         return false;
  416.       }
  417.  
  418.       if (var == fRep)
  419.       {
  420.         // go to next state
  421.         statenumber = 2;
  422.  
  423.         // reset var
  424.         var = 0;
  425.       }
  426.       break;
  427.  
  428.     // state 2: burn three times
  429.     case 2:
  430.       fDelay = burnDelay;
  431.  
  432.       // remember var count; initial value zero
  433.       var = 0;
  434.  
  435.       // call fire; if the result is true, a cycle has been completed
  436.       if (fire(burnLow, n) == true)
  437.       {
  438.         // increment var
  439.         var++;
  440.       }
  441.  
  442.       // if not fRep cycles done
  443.       if (var < 3)
  444.       {
  445.         // indicate burn (still) in progress
  446.         return false;
  447.       }
  448.  
  449.       if (var == 3)
  450.       {
  451.         // go to next state
  452.         statenumber = 2;
  453.  
  454.         // reset var
  455.         var = 0;
  456.       }
  457.       break;
  458.   }
  459.   // indicate flicker completed
  460.   return true;
  461. }
  462.  
  463. bool flutter(byte f, byte n) {
  464.  
  465.   fRep = f * (1000 / cycleTime);
  466.  
  467.   static byte statenumber = 0;
  468.   static byte var = 0;
  469.  
  470.   switch (statenumber)
  471.   {
  472.     // state 0: burn once
  473.     case 0:
  474.       fDelay = burnDelay;
  475.       if (fire(burnLow, n) == true)
  476.       {
  477.         // go to next state
  478.         statenumber = 1;
  479.       }
  480.       break;
  481.  
  482.     // state 1: flicker once
  483.     case 1:
  484.       fDelay = flickDelay;
  485.       if (fire(flickLow, n) == true)
  486.       {
  487.         // go to next state
  488.         statenumber = 2;
  489.       }
  490.       break;
  491.  
  492.     // state 2 flutter fRep times
  493.     case 2:
  494.       fDelay = flutDelay;
  495.  
  496.       // remember var count; initial value zero
  497.       var = 0;
  498.  
  499.       // call fire; if the result is true, a cycle has been completed
  500.       if (fire(flutLow, n) == true)
  501.       {
  502.         // increment var
  503.         var++;
  504.       }
  505.  
  506.       // if not fRep cycles done
  507.       if (var < fRep)
  508.       {
  509.         // indicate burn (still) in progress
  510.         return false;
  511.       }
  512.  
  513.       if (var == fRep)
  514.       {
  515.         // go to next state
  516.         statenumber = 3;
  517.  
  518.         // reset var
  519.         var = 0;
  520.       }
  521.       break;
  522.  
  523.     // state 3: flicker two times
  524.     case 3:
  525.       fDelay = flickDelay;
  526.  
  527.       // remember var count; initial value zero
  528.       var = 0;
  529.  
  530.       // call fire; if the result is true, a cycle has been completed
  531.       if (fire(flickLow, n) == true)
  532.       {
  533.         // increment var
  534.         var++;
  535.       }
  536.  
  537.       // if not fRep cycles done
  538.       if (var < 2)
  539.       {
  540.         // indicate burn (still) in progress
  541.         return false;
  542.       }
  543.  
  544.       if (var == 2)
  545.       {
  546.         // go to next state
  547.         statenumber = 4;
  548.  
  549.         // reset var
  550.         var = 0;
  551.       }
  552.       break;
  553.  
  554.     // state 4: burn two times
  555.     case 4:
  556.       fDelay = burnDelay;
  557.  
  558.       // remember var count; initial value zero
  559.       var = 0;
  560.  
  561.       // call fire; if the result is true, a cycle has been completed
  562.       if (fire(burnLow, n) == true)
  563.       {
  564.         // increment var
  565.         var++;
  566.       }
  567.  
  568.       // if not fRep cycles done
  569.       if (var < 2)
  570.       {
  571.         // indicate burn (still) in progress
  572.         return false;
  573.       }
  574.  
  575.       if (var == 2)
  576.       {
  577.         // go to next state
  578.         statenumber = 2;
  579.  
  580.         // reset var
  581.         var = 0;
  582.       }
  583.       break;
  584.   }
  585.   // indicate flutter completed
  586.   return true;
  587. }
Advertisement
Add Comment
Please, Sign In to add comment