Created
October 2, 2023 07:56
-
-
Save kakopappa/22bb8d2cf157df07724fc9571edd7764 to your computer and use it in GitHub Desktop.
ESP32 LED Strip. tutorial: https://help.sinric.pro/pages/tutorials/light/LED-Stripe-5050.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Red, green, and blue pins for PWM control | |
const int ledR = 14; | |
const int ledG = 12; | |
const int bluePin = 27; | |
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. | |
bool invert = false; | |
void hueToRGB(uint8_t hue, uint8_t brightness); | |
void setup() { | |
Serial.begin(115200); | |
delay(10); | |
ledcAttachPin(ledR, 1); | |
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(){ | |
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment