NEOPIXEL brightness control

EL Wire/Tape/Panels, LEDs, pixels and strips, LCDs and TFTs, etc products from Adafruit

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

Re: NEOPIXEL brightness control

Post by adafruit_support_rick »

Nice!

justinw3115
 
Posts: 3
Joined: Mon Dec 02, 2013 4:16 pm

Re: NEOPIXEL brightness control

Post by justinw3115 »

I'm wondering if it is possible to condense this down and place it in a void and call it in the loop.

Code: Select all

void loop() {
//Written by: Jason Yandell

int TOTAL_LEDS = 60;
float MaximumBrightness = 255;
float SpeedFactor = 0.008; // I don't actually know what would look good
float StepDelay = 5; // ms for a step delay on the lights

// Make the lights breathe
for (int i = 0; i < 65535; i++) {
// Intensity will go from 10 - MaximumBrightness in a "breathing" manner
float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
strip.setBrightness(intensity);
// Now set every LED to that color
for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
strip.setPixelColor(ledNumber, 0, 0, 255);
}

strip.show();
//Wait a bit before continuing to breathe
delay(StepDelay);

}
}

User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

Re: NEOPIXEL brightness control

Post by adafruit_support_rick »

Like this?

Code: Select all

#define TOTAL_LEDS 60

void loop()
{
  breathe(255, 0.008, 5);
}

void breathe(float MaximumBrightness, float SpeedFactor, float StepDelay)
{
  // Make the lights breathe
  for (int i = 0; i < 65535; i++) {
    // Intensity will go from 10 - MaximumBrightness in a "breathing" manner
    float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
    strip.setBrightness(intensity);
    // Now set every LED to that color
    for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
      strip.setPixelColor(ledNumber, 0, 0, 255);
    }

    strip.show();
    //Wait a bit before continuing to breathe
    delay(StepDelay);
  }
}

justinw3115
 
Posts: 3
Joined: Mon Dec 02, 2013 4:16 pm

Re: NEOPIXEL brightness control

Post by justinw3115 »

Yes, just like that, thanks!

User avatar
escazu005
 
Posts: 3
Joined: Mon Feb 09, 2015 9:07 pm

Re: NEOPIXEL brightness control

Post by escazu005 »

Hi! I'm new with Arduino and I'm totally in love with neopixels. I'm working with a NeoPixel Stick - 8 x WS2812 5050 RGB LED with Integrated Drivers.

I'm using a simple button to change stick's color but I want to add a potentiometer to dim brightness without changing the color. Is it possible? Would you help me?

This is the code I am using:

Code: Select all

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN 2
#define PIXEL_PIN 6
#define PIXEL_COUNT 8

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show();
}

void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
  
  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 8)
        showType=0;
      startShow(showType);
    }
  }
    oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Off
            break;
    case 1: colorWipe(strip.Color(255, 255, 255), 50);  // White
            break;
    case 2: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 3: colorWipe(strip.Color(255, 90, 0), 50);  // Orange
            break;
    case 4: colorWipe(strip.Color(255, 255, 0), 50);  // Yellow
            break;
    case 5: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 6: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 7: colorWipe(strip.Color(255, 0, 255), 50);  // Purple
            break;
    case 8: colorWipe(strip.Color(255, 255, 255), 50);  // White
            break;
  }
}
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

User avatar
michaelmeissner
 
Posts: 1615
Joined: Wed Aug 29, 2012 12:40 am

Re: NEOPIXEL brightness control

Post by michaelmeissner »

The general method is to change the 255's to a number between 1..255 to be the brightness level, based on the potentiometer. Basically the last 3 arguments to the 4 argument setPixelColor are 0..255 that are the brightness for the red, green, and blue LEDs inside of each neopixel. Similarly for the 2 argument setPixelColor, the uint32 argument encodes the 3 colors and their brightness level.

User avatar
escazu005
 
Posts: 3
Joined: Mon Feb 09, 2015 9:07 pm

Re: NEOPIXEL brightness control

Post by escazu005 »

Thanks Michael! but I'm pretty new on Arduino and Neopixels. Could you give more details?

User avatar
michaelmeissner
 
Posts: 1615
Joined: Wed Aug 29, 2012 12:40 am

Re: NEOPIXEL brightness control

Post by michaelmeissner »

You are going to have to sit down, and learn the rudiments of programming. Unfortunately, most of the texts I've seen over-simplify it and only talk about the appropriate syntax for the language (you need that, but you need more than that). Most people need a spark of insight to go from desire to code. I've been programming for 40 years now, and I really don't know how to get people past that threshold, since my own spark happened so long ago, and coding is now so instinctual to me. In addition, most people tend to need a live person to help them start coding, or else they just take fragments of code and make changes, without understanding why they are making the changes. Sorry. Is there somebody near by that has recently started Arduino programming, and is a little bit further up the ladder that you can ask? Is there a maker space that might have courses or open nights that you can ask questions of?

Or maybe people who just started out with no programming experience can chime in and say what worked for them.

User avatar
michaelmeissner
 
Posts: 1615
Joined: Wed Aug 29, 2012 12:40 am

Re: NEOPIXEL brightness control

Post by michaelmeissner »

One other thing. Don't defeat yourself. Don't say 'I can't do this' without adding the words 'right now'. If you keep telling yourself that you can't do something, then it will be a self-fulfilling prophesy. While if you say 'I can't do this right now', it should spur you to figure out what the next step is.

User avatar
escazu005
 
Posts: 3
Joined: Mon Feb 09, 2015 9:07 pm

Re: NEOPIXEL brightness control

Post by escazu005 »

Thanks Michael I'll take your advice :)

User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

Re: NEOPIXEL brightness control

Post by adafruit_support_rick »

You might want to start with our Learn Arduino series:
https://learn.adafruit.com/lesson-0-getting-started

Lesson 8 is about reading analog input from a potentiometer.
https://learn.adafruit.com/adafruit-ard ... log-inputs

Once you get your analog input working, you can use the setBrightness function of the neopixel library to set the overall brightness level of the pixels.

User avatar
yesnoio
 
Posts: 6
Joined: Sat Nov 30, 2013 8:08 am

Re: NEOPIXEL brightness control

Post by yesnoio »

I've been working on a small library which does not require any modification to the stock Adafruit library. It simply provides a rgbl() function.
It takes into account color levels of primary & secondary colors (since secondary colors require up to 3x leds).
I would be stoked to see parts of it included in the Adafruit NeoPixel library by default.

I have posted the initial version to github: https://github.com/yesnoio/yesnoio-rgbl

User avatar
Rated_M
 
Posts: 10
Joined: Wed Mar 11, 2015 1:31 pm

Re: NEOPIXEL brightness control

Post by Rated_M »

Hi, so I'm a complete noob with Arduino, Neopixels, and any kind of coding, but I'm a pretty quick study.
I am using a Trinket, and I modified the code below to suit my purpose one action of my project (the "Idle" action), now I need to do two more. The second could maybe be a variation of this, but it must start with all LEDs at zero then fade up to max (defined) brightness, then fast flicker like it's about too explode. :)
Can this code be easily modified to do this, or can you provide some guidance as to how best?

For some context, I am making Ornstein's Dragonslayer Spear from the video game Dark Souls for a cosplay. It's a lightning spear, that will charge up, then fire a bolt of lightning. The 'blade' section of the spear will have about 86 neopixels (43 each back to back) inside a polycarbonite tube cast into translucent urethane resin.

The spear will have three modes of operation:

1) Idle - just powered on, the spear will do the modified breathe code below with color 255,128,0, maxbrightness 128, speedfactor .012, delay 4 (Done)

2) Charge up - upon a button press (I assume I need to use another trinket pin and do pullup or something, haven't read into it that far yet) it will start from all LEDs off, then fade up to 192 brightness (same color as 1 above), then flicker at a high rate (This mode I need help with)

3) Firing - upon another button press (not sure if this can be the same button or will have to be another on a separate pin) It will jump to max white brightness 255 then a quick chase from back to front (This I can do I think)

The other issue I need to account for is that modes 2 and 3 can't loop. Mode 2 must hold at the flicker until mode 3 is activated, and mode 3 must return to mode 1 automatically after the one sequence.

Thanks in advance, this stuff is really cool!


adafruit_support_rick wrote:Like this?

Code: Select all

#define TOTAL_LEDS 60

void loop()
{
  breathe(255, 0.008, 5);
}

void breathe(float MaximumBrightness, float SpeedFactor, float StepDelay)
{
  // Make the lights breathe
  for (int i = 0; i < 65535; i++) {
    // Intensity will go from 10 - MaximumBrightness in a "breathing" manner
    float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
    strip.setBrightness(intensity);
    // Now set every LED to that color
    for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
      strip.setPixelColor(ledNumber, 0, 0, 255);
    }

    strip.show();
    //Wait a bit before continuing to breathe
    delay(StepDelay);
  }
}

User avatar
adafruit_support_bill
 
Posts: 84656
Joined: Sat Feb 07, 2009 10:11 am

Re: NEOPIXEL brightness control

Post by adafruit_support_bill »


User avatar
Rated_M
 
Posts: 10
Joined: Wed Mar 11, 2015 1:31 pm

Re: NEOPIXEL brightness control

Post by Rated_M »

Okay wow, that's a little more involved, but thanks. :)
So once I get the code for my three patterns sorted out, and manipulate the multitasking code to fit what I'm after, will the Trinket have enough memory/capabilities to run it or will I need an Arduino?

Thanks

Locked
Please be positive and constructive with your questions and comments.

Return to “Glowy things (LCD, LED, TFT, EL) purchased at Adafruit”