131 lines
3.5 KiB
Arduino
131 lines
3.5 KiB
Arduino
|
/*
|
||
|
ledcWrite_RGB.ino
|
||
|
Runs through the full 255 color spectrum for an rgb led
|
||
|
Demonstrate ledcWrite functionality for driving leds with PWM on ESP32
|
||
|
|
||
|
This example code is in the public domain.
|
||
|
|
||
|
Some basic modifications were made by vseven, mostly commenting.
|
||
|
*/
|
||
|
|
||
|
// Set up the rgb led names
|
||
|
uint8_t ledR = A4;
|
||
|
uint8_t ledG = A5;
|
||
|
uint8_t ledB = A18;
|
||
|
|
||
|
uint8_t ledArray[3] = {1, 2, 3}; // three led channels
|
||
|
|
||
|
const boolean invert = true; // set true if common anode, false if common cathode
|
||
|
|
||
|
uint8_t color = 0; // a value from 0 to 255 representing the hue
|
||
|
uint32_t R, G, B; // the Red Green and Blue color components
|
||
|
uint8_t brightness = 255; // 255 is maximum brightness, but can be changed. Might need 256 for common anode to fully turn off.
|
||
|
|
||
|
// the setup routine runs once when you press reset:
|
||
|
void setup()
|
||
|
{
|
||
|
Serial.begin(115200);
|
||
|
delay(10);
|
||
|
|
||
|
ledcAttachPin(ledR, 1); // assign RGB led pins to channels
|
||
|
ledcAttachPin(ledG, 2);
|
||
|
ledcAttachPin(ledB, 3);
|
||
|
|
||
|
// Initialize channels
|
||
|
// channels 0-15, resolution 1-16 bits, freq limits depend on resolution
|
||
|
// ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
|
||
|
ledcSetup(1, 12000, 8); // 12 kHz PWM, 8-bit resolution
|
||
|
ledcSetup(2, 12000, 8);
|
||
|
ledcSetup(3, 12000, 8);
|
||
|
}
|
||
|
|
||
|
// void loop runs over and over again
|
||
|
void loop()
|
||
|
{
|
||
|
Serial.println("Send all LEDs a 255 and wait 2 seconds.");
|
||
|
// If your RGB LED turns off instead of on here you should check if the LED is common anode or cathode.
|
||
|
// If it doesn't fully turn off and is common anode try using 256.
|
||
|
ledcWrite(1, 255);
|
||
|
ledcWrite(2, 255);
|
||
|
ledcWrite(3, 255);
|
||
|
delay(2000);
|
||
|
Serial.println("Send all LEDs a 0 and wait 2 seconds.");
|
||
|
ledcWrite(1, 0);
|
||
|
ledcWrite(2, 0);
|
||
|
ledcWrite(3, 0);
|
||
|
delay(2000);
|
||
|
|
||
|
Serial.println("Starting color fade loop.");
|
||
|
|
||
|
for (color = 0; color < 255; color++) { // Slew through the color spectrum
|
||
|
|
||
|
hueToRGB(color, brightness); // call function to convert hue to RGB
|
||
|
|
||
|
// write the RGB values to the pins
|
||
|
ledcWrite(1, R); // write red component to channel 1, etc.
|
||
|
ledcWrite(2, G);
|
||
|
ledcWrite(3, B);
|
||
|
|
||
|
delay(100); // full cycle of rgb over 256 colors takes 26 seconds
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Courtesy http://www.instructables.com/id/How-to-Use-an-RGB-LED/?ALLSTEPS
|
||
|
// function to convert a color to its Red, Green, and Blue components.
|
||
|
|
||
|
void hueToRGB(uint8_t hue, uint8_t brightness)
|
||
|
{
|
||
|
uint16_t scaledHue = (hue * 6);
|
||
|
uint8_t segment = scaledHue / 256; // segment 0 to 5 around the
|
||
|
// color wheel
|
||
|
uint16_t segmentOffset =
|
||
|
scaledHue - (segment * 256); // position within the segment
|
||
|
|
||
|
uint8_t complement = 0;
|
||
|
uint16_t prev = (brightness * ( 255 - segmentOffset)) / 256;
|
||
|
uint16_t next = (brightness * segmentOffset) / 256;
|
||
|
|
||
|
if(invert)
|
||
|
{
|
||
|
brightness = 255 - brightness;
|
||
|
complement = 255;
|
||
|
prev = 255 - prev;
|
||
|
next = 255 - next;
|
||
|
}
|
||
|
|
||
|
switch(segment ) {
|
||
|
case 0: // red
|
||
|
R = brightness;
|
||
|
G = next;
|
||
|
B = complement;
|
||
|
break;
|
||
|
case 1: // yellow
|
||
|
R = prev;
|
||
|
G = brightness;
|
||
|
B = complement;
|
||
|
break;
|
||
|
case 2: // green
|
||
|
R = complement;
|
||
|
G = brightness;
|
||
|
B = next;
|
||
|
break;
|
||
|
case 3: // cyan
|
||
|
R = complement;
|
||
|
G = prev;
|
||
|
B = brightness;
|
||
|
break;
|
||
|
case 4: // blue
|
||
|
R = next;
|
||
|
G = complement;
|
||
|
B = brightness;
|
||
|
break;
|
||
|
case 5: // magenta
|
||
|
default:
|
||
|
R = brightness;
|
||
|
G = complement;
|
||
|
B = prev;
|
||
|
break;
|
||
|
}
|
||
|
}
|