Cuando el espacio o el número de pines apremian en nuestros circuitos y necesitamos ajustarlo todo al máximo existe la posibilidad, en el caso de los leds RGB, de usar unos que incluyen su propio driver.
En el caso de estos leds RGB con encapsulado 5050 pasan de necesitar 3 cables de datos y 3 resistencias, a solo necesitar 1 condensador y 1 único cable de datos, podemos ajustar tanto el color como el brillo del led, es mas, con ese mismo cable de datos podemos controlar varios leds colocados en serie controlando en cada uno de ellos el brillo y el color de forma independiente!
Para hacer funcionar este tipo de leds es necesario usar una librería para comunicarse con los drivers, y enviarle los datos necesarios. Hay muchas librerías, recomiendo bajar varias, probarlas y quedarnos con la que mas nos guste.
A continuación un ejemplo, es realmente sencillo cambiar el color y el brillo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <Adafruit_NeoPixel.h> #include <avr/power.h> #define PIN 12 #define NUMPIXELS 8 #define DELAY 100 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); } void loop() { for( int i=0 ; i<NUMPIXELS ; i++ ) { pixels.setPixelColor(i, pixels.Color(255,0,0)); pixels.show(); delay(DELAY); } for( int i=0 ; i<NUMPIXELS ; i++ ) { pixels.setPixelColor(i, pixels.Color(0,255,0)); pixels.show(); delay(DELAY); } for( int i=0 ; i<NUMPIXELS ; i++ ) { pixels.setPixelColor(i, pixels.Color(0,0,255)); pixels.show(); delay(DELAY); } for( int i=0 ; i<NUMPIXELS ; i++ ) { pixels.setPixelColor(i, pixels.Color(255,255,255)); pixels.show(); delay(DELAY); } } |
Otro cantar es hacer los diferentes efectos de luz… este ejemplo viene incluido con la librería:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
#include <Adafruit_NeoPixel.h> #include <avr/power.h> #define PIN 12 #define NUMPIXELS 8 Adafruit_NeoPixel strip = Adafruit_NeoPixel( NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800 ); void setup() { strip.begin(); strip.show(); } void loop() { // Some example procedures showing how to display to the pixels: colorWipe( strip.Color( 255, 0, 0 ), 50 ); // Red colorWipe( strip.Color( 0, 255, 0 ), 50 ); // Green colorWipe( strip.Color( 0, 0, 255 ), 50 ); // Blue // Send a theater pixel chase in... theaterChase( strip.Color( 127, 127, 127 ), 50 ); // White theaterChase( strip.Color( 127, 0, 0 ), 50 ); // Red theaterChase( strip.Color( 0, 0, 127 ), 50 ); // Blue rainbow( 20 ); rainbowCycle( 20 ); theaterChaseRainbow( 50 ); } // Fill the dots one after the other with a color void colorWipe( uint32_t c, uint8_t wait ) { for ( uint16_t i = 0; i < strip.numPixels(); i++ ) { strip.setPixelColor( i, c ); strip.show(); delay( wait ); } } void rainbow( uint8_t wait ) { uint16_t i, j; for ( j = 0; j < 256; j++ ) { for ( i = 0; i < strip.numPixels(); i++ ) { strip.setPixelColor( i, Wheel( (i + j) & 255 ) ); } strip.show(); delay( wait ); } } // Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle( uint8_t wait ) { uint16_t i, j; for ( j = 0; j < 256 * 5; j++ ) { // 5 cycles of all colors on wheel for ( i = 0; i < strip.numPixels(); i++ ) { strip.setPixelColor( i, Wheel( ((i * 256 / strip.numPixels()) + j) & 255 ) ); } strip.show(); delay( wait ); } } //Theatre-style crawling lights. void theaterChase( uint32_t c, uint8_t wait ) { for ( int j = 0; j < 10; j++ ) { //do 10 cycles of chasing for ( int q = 0; q < 3; q++ ) { for ( int i = 0; i < strip.numPixels(); i = i + 3 ) { strip.setPixelColor( i + q, c ); //turn every third pixel on } strip.show(); delay( wait ); for ( int i = 0; i < strip.numPixels(); i = i + 3 ) { strip.setPixelColor( i + q, 0 ); //turn every third pixel off } } } } //Theatre-style crawling lights with rainbow effect void theaterChaseRainbow( uint8_t wait ) { for ( int j = 0; j < 256; j++ ) { // cycle all 256 colors in the wheel for ( int q = 0; q < 3; q++ ) { for ( int i = 0; i < strip.numPixels(); i = i + 3 ) { strip.setPixelColor( i + q, Wheel( (i + j) % 255 ) ); //turn every third pixel on } strip.show(); delay( wait ); for ( int i = 0; i < strip.numPixels(); i = i + 3 ) { strip.setPixelColor( i + q, 0 ); //turn every third pixel off } } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel( byte WheelPos ) { WheelPos = 255 - WheelPos; if( WheelPos < 85 ) { return strip.Color( 255 - WheelPos * 3, 0, WheelPos * 3 ); } else if( WheelPos < 170 ) { WheelPos -= 85; return strip.Color( 0, WheelPos * 3, 255 - WheelPos * 3 ); } else { WheelPos -= 170; return strip.Color( WheelPos * 3, 255 - WheelPos * 3, 0 ); } } |