Advertisement
nathancarter

8-mode Neopixel Sign

Feb 6th, 2023
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.51 KB | None | 0 0
  1. #include <Adafruit_NeoPixel.h>
  2. #include <FastLED.h>
  3. #include <JC_Button.h>
  4.  
  5. #define COLOR_ORDER GRB
  6. #define CHIPSET     WS2812
  7.  
  8. #define MAIN_LEDS_TOTAL 112
  9. #define SEGMENT_START_1 0
  10. #define SEGMENT_COUNT_1 10
  11. #define SEGMENT_START_2 10
  12. #define SEGMENT_COUNT_2 14
  13. #define SEGMENT_START_3 24
  14. #define SEGMENT_COUNT_3 16
  15. #define SEGMENT_START_4 40
  16. #define SEGMENT_COUNT_4 16
  17. #define SEGMENT_START_5 56
  18. #define SEGMENT_COUNT_5 16
  19. #define SEGMENT_START_6 72
  20. #define SEGMENT_COUNT_6 16
  21. #define SEGMENT_START_7 88
  22. #define SEGMENT_COUNT_7 14
  23. #define SEGMENT_START_8 102
  24. #define SEGMENT_COUNT_8 10
  25.  
  26. #define MODE_BUTTON_PIN 15 // A1 on nano
  27. #define DATA_PIN 14 // A0 on nano
  28.  
  29. #define MODE_COUNT_MAXIMUM 8 // number of different lighting modes
  30.  
  31. #define DIM_YELLOW_COLOR 0xFFFF00
  32. #define BRIGHT_YELLOW_COLOR 0x999900
  33. #define BRIGHT_BLUE_COLOR 0x0000FF
  34. #define WHITE_COLOR 0X999999
  35. #define BRIGHT_RED_COLOR 0XFF0300
  36.  
  37. // brightness settings are to work with a 1A power supply, with this specific number of LEDs.
  38. // can be increased or decreased if using a different power supply or a different number of LEDs.
  39. #define BRIGHTNESS_NOMINAL 12
  40. #define BRIGHTNESS_MID 32
  41. #define BRIGHTNESS_STROBE 100
  42. #define BRIGHTNESS_MAX 127
  43.  
  44. #define DEMO_SPEED 5000 // ms to change animations in demo mode, higher is slower
  45.  
  46. #define FIRE_SPEED 50 // ms between fire refresh rate, higher is slower
  47. #define FIRE_COOLING 70
  48. #define FIRE_SPARKING 270
  49. // #define FIRE_ROW_LEDS 11
  50. // #define FIRE_ROW_COUNT 5
  51.  
  52. #define SPARKLE_SPEED 75 // ms between sparkle refresh rate, higher is slower
  53.  
  54. #define RAINBOW_SWEEP_SPEED 10 // ms between rainbow sweep movement, higher is slower
  55. #define RAINBOW_FILL_SPEED 5 // ms between rainbow fill movement, higher is slower
  56.  
  57. #define FADE_SPEED 1 // ms between fade steps, higher is slower
  58.  
  59. #define CONFETTI_SPEED 75 // ms to between confetti refresh rate, higher is slower
  60. #define CONFETTI_FADE 20 // cycles to fade confetti, higher is faster
  61.  
  62. #define STROBE_SPEED 70 // ms between strobes, higher is slower
  63.  
  64. Adafruit_NeoPixel MainStrip = Adafruit_NeoPixel(MAIN_LEDS_TOTAL, DATA_PIN, NEO_GRB + NEO_KHZ800);
  65.  
  66. Button ModeButton(MODE_BUTTON_PIN);       // define the button that increases brightness
  67.  
  68. CRGBPalette16 gPal;     // Palette color for flames
  69.  
  70.  
  71. unsigned long TimerMaster = 0; // master clock timer
  72. unsigned long TimerDemo = 0; // fire update timer
  73. unsigned long TimerFire = 0; // fire update timer
  74. unsigned long TimerSparkle = 0; // sparkle update timer
  75. unsigned long TimerSweep = 0; // sweep update timer
  76. unsigned long TimerFill = 0; // rainbow fill update timer
  77. unsigned long TimerConfetti = 0; // confetti update timer
  78. unsigned long TimerStrobe = 0; // strobe update timer
  79. unsigned long TimerFade = 0; // fade update timer
  80.  
  81. bool DemoMode = 1; // Power up in demo mode, change to 0 the first time the button is pressed
  82.  
  83. int ModeCounter = 1; // cycle through different animation modes
  84.  
  85.  
  86. int ColorWheel = 0; // int to hold starting rainbow color
  87. bool FadeToggle = 0; // bool to hold fading in or out
  88. int FadeValue = BRIGHTNESS_MID;
  89.  
  90. bool StrobeToggle = 0; // bool to toggle strobe on or off
  91.  
  92. byte heat[MAIN_LEDS_TOTAL]; // global array of heat values
  93. CRGB leds[MAIN_LEDS_TOTAL]; // global array for confetti leds
  94.  
  95. void setup()
  96. {
  97.   delay(500); // sanity delay
  98.   gPal = HeatColors_p;
  99.   MainStrip.begin(); // initialize fire strip
  100.   MainStrip.setBrightness(BRIGHTNESS_NOMINAL);
  101.   ModeButton.begin();
  102. }
  103.  
  104. void loop()
  105. {
  106.   TimerMaster = millis();
  107.  
  108.   if ((TimerMaster >= TimerDemo) && (DemoMode == 1))
  109.   {
  110.     ModeCounter++;
  111.     // If it reaches the end, reset to beginning
  112.     if (ModeCounter > MODE_COUNT_MAXIMUM)
  113.     {
  114.       ModeCounter = 1;
  115.     }
  116.     TimerDemo = (TimerMaster + DEMO_SPEED);
  117.   }
  118.  
  119.   ModeButton.read();
  120.   if (ModeButton.wasPressed() )
  121.   {
  122.     if (DemoMode == 1) // if still in demo mode, stop demo cycling and keep current animation
  123.     {
  124.       DemoMode = 0;
  125.     }
  126.     else
  127.     {
  128.       // If not in demo mode, increase to the next animation mode
  129.       ModeCounter++;
  130.       // If it reaches the end, reset to beginning
  131.       if (ModeCounter > MODE_COUNT_MAXIMUM)
  132.       {
  133.         ModeCounter = 1;
  134.       }
  135.       MainStrip.fill(0x000000);
  136.       MainStrip.show();
  137.     }
  138.   }
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.   // Mode 1: Rainbow sweep
  146.   if (ModeCounter == 1)
  147.   {
  148.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  149.     if (TimerMaster >= TimerSweep)
  150.     {
  151.       if (ColorWheel >= 255)
  152.       {
  153.         ColorWheel = 0;
  154.       }
  155.       MainStrip.fill(Wheel(ColorWheel - 0), SEGMENT_START_1, SEGMENT_COUNT_1);
  156.       MainStrip.fill(Wheel(ColorWheel - 10), SEGMENT_START_2, SEGMENT_COUNT_2);
  157.       MainStrip.fill(Wheel(ColorWheel - 20), SEGMENT_START_3, SEGMENT_COUNT_3);
  158.       MainStrip.fill(Wheel(ColorWheel - 30), SEGMENT_START_4, SEGMENT_COUNT_4);
  159.       MainStrip.fill(Wheel(ColorWheel - 40), SEGMENT_START_5, SEGMENT_COUNT_5);
  160.       MainStrip.fill(Wheel(ColorWheel - 50), SEGMENT_START_6, SEGMENT_COUNT_6);
  161.       MainStrip.fill(Wheel(ColorWheel - 60), SEGMENT_START_7, SEGMENT_COUNT_7);
  162.       MainStrip.fill(Wheel(ColorWheel - 70), SEGMENT_START_8, SEGMENT_COUNT_8);
  163.       ColorWheel++;
  164.       MainStrip.show();
  165.       TimerSweep = (TimerMaster + RAINBOW_SWEEP_SPEED);
  166.     }
  167.   }
  168.  
  169.   // Mode 2: Rainbow fill
  170.   if (ModeCounter == 2)
  171.   {
  172.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  173.     if (TimerMaster >= TimerFill)
  174.     {
  175.       if (ColorWheel >= 255)
  176.       {
  177.         ColorWheel = 0;
  178.       }
  179.       MainStrip.fill(Wheel(ColorWheel));
  180.       ColorWheel++;
  181.       MainStrip.show();
  182.       TimerFill = (TimerMaster + RAINBOW_FILL_SPEED);
  183.     }
  184.   }
  185.  
  186.   // Mode 3:  Sparkling yellow
  187.   if (ModeCounter == 3)
  188.   {
  189.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  190.  
  191.     if (TimerMaster >= TimerSparkle)
  192.     {
  193.       MainStrip.fill(BRIGHT_YELLOW_COLOR);
  194.       MainStrip.setPixelColor(random(MAIN_LEDS_TOTAL), 0xFFFFFF);
  195.       MainStrip.show();
  196.       TimerSparkle = (TimerMaster + SPARKLE_SPEED);
  197.     }
  198.   }
  199.  
  200.   // Mode 4: Orange fire
  201.   if (ModeCounter == 4 )
  202.   {
  203.     gPal = HeatColors_p;
  204.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  205.     if (TimerMaster >= TimerFire)
  206.     {
  207.       Fire2022(SEGMENT_START_1, SEGMENT_COUNT_1, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  208.       Fire2022(SEGMENT_START_2, SEGMENT_COUNT_2, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  209.       Fire2022(SEGMENT_START_3, SEGMENT_COUNT_3, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  210.       Fire2022(SEGMENT_START_4, SEGMENT_COUNT_4, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  211.       Fire2022(SEGMENT_START_5, SEGMENT_COUNT_5, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  212.       Fire2022(SEGMENT_START_6, SEGMENT_COUNT_6, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  213.       Fire2022(SEGMENT_START_7, SEGMENT_COUNT_7, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  214.       Fire2022(SEGMENT_START_8, SEGMENT_COUNT_8, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  215.       TimerFire = (TimerMaster + FIRE_SPEED);
  216.       MainStrip.show();
  217.     }
  218.   }
  219.  
  220.  
  221.   // Mode 5: Blue fire
  222.   if (ModeCounter == 5 )
  223.   {
  224.     gPal = CRGBPalette16( CRGB::Black, CRGB::Blue, CRGB::Aqua,  CRGB::White);
  225.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  226.     if (TimerMaster >= TimerFire)
  227.     {
  228.       Fire2022(SEGMENT_START_1, SEGMENT_COUNT_1, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  229.       Fire2022(SEGMENT_START_2, SEGMENT_COUNT_2, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  230.       Fire2022(SEGMENT_START_3, SEGMENT_COUNT_3, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  231.       Fire2022(SEGMENT_START_4, SEGMENT_COUNT_4, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  232.       Fire2022(SEGMENT_START_5, SEGMENT_COUNT_5, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  233.       Fire2022(SEGMENT_START_6, SEGMENT_COUNT_6, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  234.       Fire2022(SEGMENT_START_7, SEGMENT_COUNT_7, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  235.       Fire2022(SEGMENT_START_8, SEGMENT_COUNT_8, 0, random(FIRE_COOLING * 0.8, FIRE_COOLING * 1.2), random(FIRE_SPARKING * 0.8, FIRE_SPARKING * 1.2));
  236.       TimerFire = (TimerMaster + FIRE_SPEED);
  237.       MainStrip.show();
  238.     }
  239.   }
  240.  
  241.   // Mode 6:  Sparkling blue
  242.   if (ModeCounter == 6)
  243.   {
  244.     MainStrip.setBrightness(BRIGHTNESS_MAX);
  245.  
  246.     if (TimerMaster >= TimerSparkle)
  247.     {
  248.       MainStrip.fill(BRIGHT_BLUE_COLOR);
  249.       MainStrip.setPixelColor(random(MAIN_LEDS_TOTAL), 0xFFFFFF);
  250.       MainStrip.show();
  251.       TimerSparkle = (TimerMaster + SPARKLE_SPEED);
  252.     }
  253.   }
  254.  
  255.   // Mode 7:  Fading red
  256.   if (ModeCounter == 7 )
  257.   {
  258.     MainStrip.fill(BRIGHT_RED_COLOR);
  259.     if (TimerMaster >= TimerFade)
  260.     {
  261.       if (FadeToggle == 0)
  262.       {
  263.         FadeValue++;
  264.         if (FadeValue >= BRIGHTNESS_MAX)
  265.         {
  266.           FadeToggle = 1;
  267.         }
  268.       }
  269.       else
  270.       {
  271.         FadeValue--;
  272.         if (FadeValue <= BRIGHTNESS_MID)
  273.         {
  274.           FadeToggle = 0;
  275.         }
  276.  
  277.       }
  278.       MainStrip.setBrightness(FadeValue);
  279.       MainStrip.show();
  280.       TimerFade = (TimerMaster + FADE_SPEED);
  281.     }
  282.   }
  283.  
  284.   // Mode 8:  Strobe
  285.   if (ModeCounter == 8 )
  286.   {
  287.     MainStrip.setBrightness(BRIGHTNESS_STROBE);
  288.  
  289.     if (TimerMaster >= TimerStrobe)
  290.     {
  291.       if (StrobeToggle == 0)
  292.       {
  293.         MainStrip.fill(WHITE_COLOR);
  294.       }
  295.       else
  296.       {
  297.         MainStrip.fill(0x000000);
  298.       }
  299.       MainStrip.show();
  300.       StrobeToggle = !StrobeToggle;
  301.       TimerStrobe = (TimerMaster + STROBE_SPEED);
  302.     }
  303.   }
  304.   /*
  305.  
  306.      confetti was stupid
  307.  
  308.     // Mode 9:  Confetti
  309.     if (ModeCounter == 9 )
  310.     {
  311.       MainStrip.setBrightness(BRIGHTNESS_MAX);
  312.       gPal = RainbowColors_p;
  313.       if (TimerMaster >= TimerConfetti)
  314.       {
  315.         fadeToBlackBy(leds, MAIN_LEDS_TOTAL, CONFETTI_FADE);
  316.         leds[random8(MAIN_LEDS_TOTAL)] = Wheel(random8(255));
  317.         for ( int i = 0; i < MAIN_LEDS_TOTAL; i++)
  318.         {
  319.           MainStrip.setPixelColor(i, leds[i].r, leds[i].g, leds[i].b);
  320.         }
  321.         MainStrip.show();
  322.         TimerConfetti = (TimerMaster + CONFETTI_SPEED);
  323.       }
  324.  
  325.  
  326.     }
  327.   */
  328.  
  329. }
  330.  
  331.  
  332.  
  333. void Fire2022(int LED_START_NUM, int FIRE_ROW_LEDS, bool gReverseDirection, int cool, int spark)
  334. {
  335.   // Step 1.  Cool down every cell a little
  336.   for ( int i = LED_START_NUM; i < (FIRE_ROW_LEDS + LED_START_NUM); i++)
  337.   {
  338.     heat[i] = qsub8( heat[i],  random8(0, ((cool * 10) / FIRE_ROW_LEDS) + 2));
  339.   }
  340.  
  341.   // Step 2.  Heat from each cell drifts 'up' and diffuses a little
  342.   for ( int k = (FIRE_ROW_LEDS + LED_START_NUM - 1) ; k >= (LED_START_NUM + 2); k--)
  343.   {
  344.     heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  345.   }
  346.  
  347.   // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
  348.   if ( random8() < spark )
  349.   {
  350.     int y = random8(3);
  351.     //int y = 0;
  352.     heat[LED_START_NUM + y] = qadd8( heat[LED_START_NUM + y], random8(160, 255) );
  353.   }
  354.  
  355.   // Step 4.  Map from heat cells to LED colors
  356.   for ( int j = LED_START_NUM; j < (FIRE_ROW_LEDS + LED_START_NUM); j++)
  357.   {
  358.     // CRGB color = HeatColor(min(150, heat[j]));
  359.     CRGB color = ColorFromPalette(gPal, min(150, heat[j]));
  360.     int pixelnumber;
  361.     if ( gReverseDirection )
  362.     {
  363.       pixelnumber = ((FIRE_ROW_LEDS + LED_START_NUM) - 1) - (j - LED_START_NUM);
  364.     }
  365.     else
  366.     {
  367.       pixelnumber = j;
  368.     }
  369.     MainStrip.setPixelColor(pixelnumber, color.r, color.g, color.b);
  370.   }
  371. }
  372.  
  373. // Input a value 0 to 255 to get a color value.
  374. // The colours are a transition r - g - b - back to r.
  375. uint32_t Wheel(byte WheelPos)
  376. {
  377.   WheelPos = 255 - WheelPos;
  378.   if (WheelPos < 85)
  379.   {
  380.     return MainStrip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  381.   }
  382.   else if (WheelPos < 170)
  383.   {
  384.     WheelPos -= 85;
  385.     return MainStrip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  386.   }
  387.   else
  388.   {
  389.     WheelPos -= 170;
  390.     return MainStrip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  391.   }
  392. }
  393.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement