Advertisement
2dbit

FastLED using rotary encoder to switch between dynamic patterns and adjusting brightness

Sep 23rd, 2020 (edited)
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.50 KB | None | 0 0
  1. #include <FastLED.h>
  2. #include <ClickEncoder.h>
  3. #include <TimerOne.h>
  4.  
  5. #define DATA_PIN  6  
  6. #define LED_TYPE    WS2812B
  7. #define COLOR_ORDER GRB
  8. #define NUM_LEDS    16
  9. CRGB leds[NUM_LEDS];
  10.  
  11. #define BRIGHTNESS          120
  12. #define FRAMES_PER_SECOND  120
  13.  
  14. bool brightnessMode = false;
  15.  
  16. ClickEncoder *encoder;
  17. int16_t last, value;
  18.  
  19. void timerIsr() {
  20.   encoder->service();
  21. }
  22.  
  23.  
  24. //Light Box Colors Travel CCW starting bottom middle.
  25. //Define Gradient Palette up here, create gpattern below loop, add gpattern to simplepatternlist
  26.  
  27.  
  28. DEFINE_GRADIENT_PALETTE( PurpleOrange_gp ) {  
  29.   0,     147,   0, 150, //(purple)  
  30.   110,   255,  69,   0,  //(orange)  
  31.   255,   147,   0, 150  //(purple)  
  32.   }; //end PurpleOrange_gp
  33.  
  34. DEFINE_GRADIENT_PALETTE( GreenMint_gp ) {
  35.   0,     50,  205,  50,   //lime green
  36.   110,   245, 255, 250,   //mint cream
  37.   255,   50,  205,  50    //lime green
  38.   }; //end GreenMint_gp
  39.  
  40. DEFINE_GRADIENT_PALETTE( BlueWhiteYellow_gp ) {
  41.   0,      11,   2, 105,   //Beast Blue
  42.   30,     11,   2, 105,
  43.   90,    200, 200, 180,
  44.   110,   200, 200, 180,   //White
  45.   130,   200, 200, 180,
  46.   205,   255, 231,   0,
  47.   255,   255, 231,   0    //Belle Yellow
  48.   }; //end BlueWhiteYellow_gp
  49.  
  50.   DEFINE_GRADIENT_PALETTE( RedYellowRed_gp ) {  
  51.   0,     139,   0,   0,  // Dark Red
  52.   60,    139,   0,   0,
  53.   //100,   255, 231,   0,
  54.   120,   255, 231,   0,
  55.   130,   255, 231,   0,  //Belle Yellow
  56.   //120,   255, 231,   0,
  57.   195,   139,   0,   0,
  58.   255,   139,   0,   0   // Dark Red
  59.   }; //end RedYellowRed_gp
  60.  
  61.  
  62.  
  63.  
  64.  
  65. void setup() {
  66.   delay(1000); //sanity delay
  67.   Serial.begin(115200);
  68.  
  69.   // tell FastLED about the LED strip configuration
  70.   FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  71.  
  72.  // set master brightness control
  73.   FastLED.setBrightness(BRIGHTNESS);
  74.   FastLED.setTemperature(0xFF7029);
  75.  
  76.  
  77.  
  78.   encoder = new ClickEncoder(2, 3, 4);
  79.  
  80.   Timer1.initialize(1000);
  81.   Timer1.attachInterrupt(timerIsr);
  82.  
  83.   last = 5;
  84.  
  85.  
  86. }//end of Setup
  87.  
  88.  
  89.  
  90.  
  91.  // List of patterns to cycle through.  Each is defined as a separate function below.
  92. typedef void (*SimplePatternList[])();
  93. SimplePatternList gPatterns = {
  94.   Yellow,
  95.   Red,
  96.   PurpleOrange,
  97.   GreenMint,
  98.   BlueWhiteYellow,
  99.   RedYellowRed,
  100.   White,
  101.  
  102.  
  103.   };
  104. //  rainbow,
  105. //  rainbowWithGlitter,
  106. //  confetti,
  107. //  sinelon,
  108. //  juggle,
  109. //  bpm };
  110.  
  111. uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
  112. uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121. void loop() {
  122.  
  123.  
  124.   value += encoder->getValue();
  125.  
  126.   if (value != last) {
  127.     last = value;
  128.  
  129. if(value > 255)
  130.   value = 255; //prevent encoder from exceeding 255
  131. if(value < 0)
  132.   value = 0;  //prevent encoder from going negative
  133.    
  134.     Serial.print("Brightness Level: ");
  135.     Serial.println(value);
  136.             static uint8_t BRIGHT = value;
  137.         if (brightnessMode == true) {
  138.         FastLED.setBrightness(value);
  139.       }//end brightness mode
  140.       else{
  141.       if (last < value) {
  142.         Serial.print("Current Pattern # ");
  143.         Serial.print(value);
  144.         gCurrentPatternNumber = (value);
  145.         nextPattern();
  146.       }
  147.       else  {
  148.         Serial.print("Current Pattern # ");
  149.         Serial.print(value);
  150.        
  151.         prevPattern();
  152.       }  
  153.       }//end pattern mode
  154.  
  155.  
  156.      
  157.   }
  158.  
  159.   ClickEncoder::Button b = encoder->getButton();
  160.  if (b != ClickEncoder::Open) {
  161.   switch (b) {
  162.     case ClickEncoder::Clicked:
  163.       Serial.println("Button was clicked");
  164.       brightnessMode = !brightnessMode;
  165.       if (brightnessMode) {
  166.         Serial.println("Knob now controls brightness");
  167.        
  168.       } else {
  169.         Serial.println("Knob now controls color");
  170.       }
  171.      
  172.       break;
  173.   }
  174.  }
  175.  
  176.  // Call the current pattern function once, updating the 'leds' array
  177.   gPatterns[gCurrentPatternNumber]();
  178.  
  179.   // send the 'leds' array out to the actual LED strip
  180.   FastLED.show();  
  181.   // insert a delay to keep the framerate modest
  182.   FastLED.delay(1000/FRAMES_PER_SECOND);
  183.  
  184.  }//end of loop
  185.  
  186.  
  187.  
  188.  
  189.  
  190. #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
  191.  
  192.  
  193. void nextPattern()
  194. {
  195.   // add one to the current pattern number, and wrap around at the end
  196.   //gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
  197.     gCurrentPatternNumber = (gCurrentPatternNumber + 1);
  198.   if (gCurrentPatternNumber > ARRAY_SIZE(gPatterns)) {
  199.     gCurrentPatternNumber = ARRAY_SIZE(gPatterns)+1;
  200.   }
  201. }
  202. void prevPattern()
  203. {
  204.     gCurrentPatternNumber = (gCurrentPatternNumber - 1);
  205.   if (gCurrentPatternNumber > ARRAY_SIZE(gPatterns)) {
  206.     gCurrentPatternNumber = ARRAY_SIZE(gPatterns)-1;
  207.   }
  208. }
  209.  
  210.  
  211.  
  212.  
  213. //begin patterns
  214.  
  215. void Red() {
  216.   for(int i=0; i< NUM_LEDS; i++) {
  217.             leds[i] = CRGB::Red;
  218.         }
  219.             for (uint16_t i = 0; i < NUM_LEDS; i++)
  220.   {
  221.     leds[i].r = dim8_video(leds[i].r);
  222.     leds[i].g = dim8_video(leds[i].g);
  223.     leds[i].b = dim8_video(leds[i].b);
  224.   }
  225. } // end Red
  226.  
  227.  
  228. void Yellow() {  
  229.   for(int i=0; i< NUM_LEDS; i++) {
  230.             leds[i] = CRGB::Yellow;
  231.         }
  232.             for (uint16_t i = 0; i < NUM_LEDS; i++)
  233.   {
  234.     leds[i].r = dim8_video(leds[i].r);
  235.     leds[i].g = dim8_video(leds[i].g);
  236.     leds[i].b = dim8_video(leds[i].b);
  237.   }
  238. } // end Yellow
  239.  
  240.  
  241. void White() {  
  242.   for(int i=0; i< NUM_LEDS; i++) {
  243.             leds[i] = CRGB::White;
  244.         }
  245.             for (uint16_t i = 0; i < NUM_LEDS; i++)
  246.   {
  247.     leds[i].r = dim8_video(leds[i].r);
  248.     leds[i].g = dim8_video(leds[i].g);
  249.     leds[i].b = dim8_video(leds[i].b);
  250.   }
  251. } // end White
  252.  
  253.  
  254. void RedYellowRed(){
  255.   CRGBPalette16 palette = RedYellowRed_gp;
  256.   for (int i=0; i< NUM_LEDS; i++) {
  257.       leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
  258.   }
  259.     for (uint16_t i = 0; i < NUM_LEDS; i++)
  260.   {
  261.     leds[i].r = dim8_video(leds[i].r);
  262.     leds[i].g = dim8_video(leds[i].g);
  263.     leds[i].b = dim8_video(leds[i].b);
  264.   }
  265. }//end RedYellowRed
  266.  
  267.  
  268. void BlueWhiteYellow(){
  269.   CRGBPalette16 palette = BlueWhiteYellow_gp;
  270.   for (int i=0; i< NUM_LEDS; i++) {
  271.       leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
  272.   }
  273.     for (uint16_t i = 0; i < NUM_LEDS; i++)
  274.   {
  275.     leds[i].r = dim8_video(leds[i].r);
  276.     leds[i].g = dim8_video(leds[i].g);
  277.     leds[i].b = dim8_video(leds[i].b);
  278.   }
  279. }//end BlueWhiteYellow
  280.  
  281.  
  282. void PurpleOrange(){
  283.   CRGBPalette16 palette = PurpleOrange_gp;
  284.   for (int i=0; i< NUM_LEDS; i++) {
  285.       leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
  286.   }
  287.     for (uint16_t i = 0; i < NUM_LEDS; i++)
  288.   {
  289.     leds[i].r = dim8_video(leds[i].r);
  290.     leds[i].g = dim8_video(leds[i].g);
  291.     leds[i].b = dim8_video(leds[i].b);
  292.   }
  293. }//end Purple Orange
  294.  
  295.  
  296. void GreenMint(){
  297.   CRGBPalette16 palette = GreenMint_gp;
  298.   for (int i=0; i< NUM_LEDS; i++) {
  299.       leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
  300.   }
  301.     for (uint16_t i = 0; i < NUM_LEDS; i++)
  302.   {
  303.     leds[i].r = dim8_video(leds[i].r);
  304.     leds[i].g = dim8_video(leds[i].g);
  305.     leds[i].b = dim8_video(leds[i].b);
  306.   }
  307. }//end GreenMint
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314. void rainbow()
  315. {
  316.   // FastLED's built-in rainbow generator
  317.   fill_rainbow( leds, NUM_LEDS, 0, 255/NUM_LEDS );
  318.  
  319.   //fill_rainbow( leds, NUM_LEDS, gHue, 7);
  320. }
  321.  
  322. void rainbowWithGlitter()
  323. {
  324.   // built-in FastLED rainbow, plus some random sparkly glitter
  325.   rainbow();
  326.   addGlitter(80);
  327. }
  328.  
  329. void addGlitter( fract8 chanceOfGlitter)
  330. {
  331.   if( random8() < chanceOfGlitter) {
  332.     leds[ random16(NUM_LEDS) ] += CRGB::White;
  333.   }
  334. }
  335.  
  336. void confetti()
  337. {
  338.   // random colored speckles that blink in and fade smoothly
  339.   fadeToBlackBy( leds, NUM_LEDS, 10);
  340.   int pos = random16(NUM_LEDS);
  341.   leds[pos] += CHSV( gHue + random8(64), 200, 255);
  342. }
  343.  
  344. void sinelon()
  345. {
  346.   // a colored dot sweeping back and forth, with fading trails
  347.   fadeToBlackBy( leds, NUM_LEDS, 20);
  348.   int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  349.   leds[pos] += CHSV( gHue, 255, 192);
  350. }
  351.  
  352. void bpm()
  353. {
  354.   // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  355.   uint8_t BeatsPerMinute = 62;
  356.   CRGBPalette16 palette = PartyColors_p;
  357.   uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  358.   for( int i = 0; i < NUM_LEDS; i++) { //9948
  359.     leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  360.   }
  361. }
  362.  
  363. void juggle() {
  364.   // eight colored dots, weaving in and out of sync with each other
  365.   fadeToBlackBy( leds, NUM_LEDS, 20);
  366.   byte dothue = 0;
  367.   for( int i = 0; i < 8; i++) {
  368.     leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
  369.     dothue += 32;
  370.   }
  371. }
  372.  
  373.  
  374.  
  375.  
  376.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement