| 
									
										
										
										
											2017-10-10 15:42:26 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |   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
 | 
					
						
							| 
									
										
										
										
											2021-04-14 18:10:05 +03:00
										 |  |  | uint8_t ledR = 2; | 
					
						
							|  |  |  | uint8_t ledG = 4; | 
					
						
							|  |  |  | uint8_t ledB = 5;  | 
					
						
							| 
									
										
										
										
											2017-10-10 15:42:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |