* Create ledcWrite_demo_ESP32_RGB.ino adding the public domain example ledcWrite_demo_ESP32.ino to this repo. Added RGB to the name for people searching, added some comments, and renames things to make a bit more sense. * Update ledcWrite_demo_ESP32_RGB.ino renamed to ledcWrite_RGB.ino and added a couple more comments based on https://github.com/espressif/arduino-esp32/issues/689 * Rename libraries/ESP32/examples/AnalogOut/ledcWrite_demo_ESP32_RGB/ledcWrite_demo_ESP32_RGB.ino to libraries/ESP32/examples/AnalogOut/ledcWrite_RGB/ledcWrite_RGB.ino Renamed.
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|   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;
 | |
|     }
 | |
| }
 |