Library for RGB LEDs

Thanks for sharing,

I would pass the three pins to the constructor of the lib, and let m.tick do the analogWrite
furthermore you might use an ENUM for the modes.

something like

RGBmood M = new RGBMood(redpin, greenpin, bleupin);

void setup()
{
  m.setMode(1);           // Automatic random fade.
  m.setHoldingTime(4000); // Keep the same color for 4 seconds.
  m.setFadingSteps(100);  // Fade with 100 steps.
  m.setFadingSpeed(50);   // Each step last 50ms. A complete fade takes 50*100 = 5 seconds
}

void loop() 
{
  // Update the colors.
  m.tick();
}


m.tick()
{
  // calculate new RGB values;
   // existing code here....
  
  analogWrite(_RED, _red);
  analogWrite(_GREEN, _green);
  analogWrite(_BLUE, _blue);
}

A fuction that could be interesting is one that calculates the distance between 2 colors
double distance(int R1, int G1, int B1, int R2, int G2, int B2)
{
return Math.sqrt((R1-R2)(R1-R2) + (G1-G2)(G1-G2) + (B1-B2) * (B1-B2));
}

with this distance function you can estimate what a still is a smooth number of steps

my 2 cents,

Thanks a lot for your feedback !

I've already integrated the pins in the code as well as the analogWrite in the tick function.
I've made it optional, if you don't provide pins, it's not a problem. (so it's more flexible)

I've also made some adjustments for fading in HSB space.
For example when fading from Hue: 10 to Hue: 350, it won't go up but down.
i.e. 10->9->...->0->360->...->350 instead of 10->11->...->349->350.

What is great about this library that I forgot to mention is that there's not a single delay() call.
This mean you can use it with a code that can't be interrupted, Ethernet stuff for example.
The code uses internal counters and intervals and update when necessary.

I'm gonna look at color distance to make automatic smooth fading :wink:

All other feedbacks will be greatly appreciated.

Pollop.

What is great about this library that I forgot to mention is that there's not a single delay() call.

I am gratefull for that :slight_smile:

  • negative(RGB) like the old foto film.

  • setStroboscope(); do a stroboscope while morphing colors

  • enum for a set of "named colors" Colors.Aquamarin etc :slight_smile:

Thanks again for the feedback !

robtillaart:

  • negative(RGB) like the old foto film.

Like setRGB but will actually do _r = 255 - r; _b = 255 - b ... ?

robtillaart:

  • setStroboscope(); do a stroboscope while morphing colors

What do you mean by "while morphing" ?
You can already do a kind of stroboscope like this (careful if you're epileptic :P)

  m.setMode(RGBMood::RANDOM_MODE); // Yeah enum already there xD
  m.setHoldingTime(200);
  m.setFadingSteps(2);
  m.setFadingSpeed(10);

robtillaart:

  • enum for a set of "named colors" Colors.Aquamarin etc :slight_smile:

Working on it :wink:

Gimme more work :smiley:

Thanks again for the feedback !

Quote from: robtillaart on Today at 03:49:20 PM

  • negative(RGB) like the old foto film.
    Like setRGB but will actually do _r = 255 - r; _b = 255 - b ... ?
    Don't know the right formula, but it could be simple as that

Quote from: robtillaart on Today at 03:49:20 PM

  • setStroboscope(); do a stroboscope while morphing colors
    What do you mean by "while morphing" ?
    fading

You can already do a kind of stroboscope like this (careful if you're epileptic smiley-razz)
Code:

m.setMode(RGBMood::RANDOM_MODE); // Yeah enum already there xD
m.setHoldingTime(200);
m.setFadingSteps(2);
m.setFadingSpeed(10);
OK

Hey just a small thing . I'm rusty , i grabbed your library and extracted it in my sketchbook/Libraries/ folder
Arduino V1.0 opens fine without library error but when I compile your example it does not find RGBMood.h.
I use Linux but everything else seems OK
What could cause this?

Hi,

Are you using other (non-official) libraries which work ?
Does those files exist in your sketchbook (at the same location) ?

libraries/RGBMood/RGBMood.h
libraries/RGBMood/RGBMood.cpp
libraries/RGBMood/examples/rainbow/rainbow.ino

Maybe rename your 'Libraries' folder in 'libraries'.
In the Arduino IDE, can you click "Sketch" -> "Importe Library", does "RGBMood" appear ?

Pollop.

Thank you
I am Rusty
changing "Library" to "library" fixed it and a few others too !

LucidTronix has a RGB HSB library and a tutorial with sample code. It has a bit packing function which is helpful for driving colors onto 16-bit screens and works just fine for RGB LEDs too. Check it out at lucidtronix.com - lucidtronix Resources and Information.

lucidTronix code looks good too

however they have serial.print statements in a convertion functions and I think these should not be in there.

That's really a absolute useable Library.

One feature i think is missing:

The ready-to-use Controller for RGB Stripes have a brightness control feature where you are able to choose about 5-10 different brightness steps.

Would that be easy to adapt or not?

Thanks Thomas

Thanks a lot for this library. This is exacly what I was looking for.

I use it with 6 differents sets of power RGB leds and your effects are very nice!

For information, my RGB leds are not plugged on pins that provide PWM (pins 2 to 13 on my mega 2560).
So I had to include in your library an other library to make PWM using software (softPWM library Google Code Archive - Long-term storage for Google Code Project Hosting.). I also had to change in your library the "anlogWrite" by "SoftPWMSet".

In your example of "random," you're missing a semicolon on line 14.

 m.setHSB(random(359), 255, 255);

Thank you for sharing that great library! Just what I was looking for... and more!

One thing... could setHoldingTime also work in HSB mode!!!

const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
#include <RGBMood.h>
RGBMood m(redPin, greenPin, bluePin);
int step = 0;
int length = 4;
int choosenColorsHSB[] = {0, 90, 180, 270};  

void setup() {
  m.setHoldingTime(10000);                                  // Keep the same color for 10 seconds before fading again. ***Not working here***
  m.setFadingSteps(200);                                     // Fade with 200 steps.
  m.setFadingSpeed(20);                                     // Each step last 20ms. 
  length = (sizeof(choosenColorsHSB)/sizeof(int));   //length automatically adjust to the number of colors chosen
}

void loop() {
  if (not m.isFading()) {
    m.fadeHSB( choosenColorsHSB[step], 255, 255);
    step = step + 1;
    if (step >= length) step = 0;
    }
      
  m.tick();
}

Nice library.

Does it use delay in any part of the code? Or its based on Time0?

Hello and thanks for your work!

Why do you use uint16_t instead of uint8_t for the colors as the PWM outputs can accept only a number between 0 and 255?

MrNiceGuy:
That's really a absolute useable Library.

One feature i think is missing:

The ready-to-use Controller for RGB Stripes have a brightness control feature where you are able to choose about 5-10 different brightness steps.

Would that be easy to adapt or not?

Thanks Thomas

Any news on that? Great library but brightness is missing!!

Nice library. Have you created any new moods for it?

Hey Pollop,

Sorry i'm a total noob, but:

was just wondering is this non blocking code?

const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
#include <RGBMood.h>
RGBMood m(redPin, greenPin, bluePin);

void setup() {
m.setMode(RGBMood::RANDOM_HUE_MODE);  // Automatic random fade.
m.setHoldingTime(4000);  // Keep the same color for 4 seconds before fading again.
m.setFadingSteps(150);   // Fade with 150 steps.
m.setFadingSpeed(50);    // Each step last 50ms. A complete fade takes 50*150 = 7.5 seconds
m.setHSB(random(359), 255, 255) // Random hue mode only change the hue so we first set the saturation and brightness to what we want.
}

void loop() {
m.tick(); // Update the colors.
}

Hello, thanks for this nice and usefull library, I started as a noob a few months ago, playing with the arduino.
I would like to use this for setup a BT communication between serial RGB strips and my phone.(Everything works, biut without the use of your laibrary).
The thing I can't solve is the following.
In tick you directly send the RGB-value to the used pins.
Because I need a serial comminucation for sending the value to the used drivers, I just need the value for sending them further.

Here's an example :

#include "RGBdriver.h"
*#define CLK 3//pins definitions for the driver *
#define DIO 2
RGBdriver Driver(CLK,DIO);
*void setup() *
{
*} *
*void loop() *
{

  • Driver.begin();*
  • Driver.SetColor(100, 0, 0); //Send Red to the first driver*
  • Driver.end();*
    }

It's perhaps very easy to change this, but for the moment I didn't found it.

I'll hope, it's a bit clear.

Thanks in advance