RGBpixel: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
No edit summary |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 11: | Line 11: | ||
== Code == | == Code == | ||
=== Simple Test === | |||
<pre> | <pre> | ||
/* | /* | ||
Developed by: thex (noisebridge) | Developed by: thex (noisebridge) | ||
Updated: 20131122 | Updated: 20131122 | ||
Revised: 20140829 (evil dan) | |||
https://noisebridge.net/wiki/RGBpixel | https://noisebridge.net/wiki/RGBpixel | ||
*/ | */ | ||
// Arduino UNO Default wiring, Yellow to Pin 13 & Green to Pin 11 | |||
#include <SPI.h> | #include <SPI.h> | ||
Line 68: | Line 71: | ||
sendColor(maxPower,0x00,0x00); | sendColor(maxPower,0x00,0x00); | ||
// ORANGE | // ORANGE | ||
sendColor(maxPower, maxPower>> | sendColor(maxPower, maxPower>>1, 0x00); | ||
// YELLOW | // YELLOW | ||
sendColor(maxPower, maxPower, 0x00); | sendColor(maxPower, maxPower, 0x00); | ||
// CHARTREUSE | // CHARTREUSE | ||
sendColor(maxPower>> | sendColor(maxPower>>1, maxPower, 0x00); | ||
// GREEN | // GREEN | ||
sendColor(0x00,maxPower,0x00); | sendColor(0x00,maxPower,0x00); | ||
// SPRING | // SPRING | ||
sendColor(0x00, maxPower, maxPower>> | sendColor(0x00, maxPower, maxPower>>1); | ||
// CYAN | // CYAN | ||
sendColor(0x00, maxPower, maxPower); | sendColor(0x00, maxPower, maxPower); | ||
// AZURE | // AZURE | ||
sendColor(0x00, maxPower>> | sendColor(0x00, maxPower>>1, maxPower); | ||
// BLUE | // BLUE | ||
sendColor(0x00,0x00,maxPower); | sendColor(0x00,0x00,maxPower); | ||
// VIOLOET | // VIOLOET | ||
sendColor(maxPower>> | sendColor(maxPower>>1, 0x00, maxPower); | ||
// MAGENTA | // MAGENTA | ||
sendColor(maxPower, 0x00, maxPower); | sendColor(maxPower, 0x00, maxPower); | ||
// ROSE | // ROSE | ||
sendColor(maxPower, 0x00, maxPower>> | sendColor(maxPower, 0x00, maxPower>>1); | ||
} | } | ||
sendEmptyFrame(); | sendEmptyFrame(); | ||
Line 128: | Line 131: | ||
flag |= ((blue&0xC0)>>2); | flag |= ((blue&0xC0)>>2); | ||
return ~flag; | return ~flag; | ||
} | |||
</pre> | |||
=== Evil Dan Edition [EXPERIMENTAL] === | |||
<pre> | |||
/* | |||
EvilDan of moisebridge | |||
*/ | |||
#include <SPI.h> | |||
struct lenvec | |||
{ | |||
int len; | |||
unsigned long *vals; | |||
}; | |||
const int updateDelay = 200; | |||
const unsigned long MAX_COUNT = 0xffffffff; | |||
const int PIXEL_COUNT = 25; | |||
const int COLOR_COUNT = 255; // changed to constant (+hex) | |||
byte colors[COLOR_COUNT][3]; // added color table for all pixels (+hex) | |||
void sendAll(void (*f)(void)); | |||
void sendPackedRGB(unsigned long); | |||
void sendRed(void); | |||
void sendYellow(void); | |||
void sendBlue(void); | |||
void sendGreen(void); | |||
void sendOff(void); | |||
void sendOn(void); | |||
void sendGreen(void); | |||
void sendVector(unsigned long *, int); | |||
void sendByteAsRYBG(byte); | |||
void loop() | |||
{ | |||
static unsigned long count = 0; | |||
// sendPrimes(); | |||
// sendLongAsRYBG(nextPrime()); | |||
// countRYBG(16); | |||
/*** | |||
sendLongAsRYBG(count); | |||
count += 1; | |||
if( count >= MAX_COUNT ) | |||
{ | |||
count = 0; | |||
} | |||
***/ | |||
// pissRainbeau(); | |||
// sendMagicVals(); | |||
sendLongAsRYBG(getLongFromSerial()); | |||
delay(updateDelay); | |||
} | |||
void setup() | |||
{ | |||
setColorPixelTable(); | |||
initSerialAndSPI(); | |||
sendAll(sendOff); | |||
sendFlair(); | |||
sendAll(sendOff); | |||
delay(500); | |||
} | |||
void initSerialAndSPI() | |||
{ | |||
Serial.begin(9600); | |||
SPI.begin(); | |||
SPI.setBitOrder(MSBFIRST); | |||
SPI.setDataMode(SPI_MODE0); | |||
SPI.setClockDivider(SPI_CLOCK_DIV2); | |||
sendSPIEndFrame(); | |||
} | |||
void sendFlair() | |||
{ | |||
int flashcount = 11; | |||
int flashrate = 100; // times per second | |||
int millisec = int(1000 / flashrate); | |||
for( int i = 0; i < flashcount; i++) | |||
{ | |||
int pause = i * millisec; | |||
sendAll(sendRed); | |||
delay(pause); | |||
sendAll(sendYellow); | |||
delay(pause); | |||
sendAll(sendBlue); | |||
delay(pause); | |||
sendAll(sendGreen); | |||
delay(pause); | |||
} | |||
} | |||
void sendPackedRGB(unsigned long p) | |||
{ | |||
byte r, g, b; | |||
r = byte((p >> 16) & 0xff); | |||
g = byte((p >> 8) & 0xff); | |||
b = byte(p & 0xff); | |||
sendSPI(r, g, b); | |||
} | |||
unsigned long packRGB(byte red, byte green, byte blue) | |||
{ | |||
unsigned long rgb; | |||
rgb = (red * 65536) + (green * 256) + blue; | |||
// rgb = (red << 16) | (green << 8) | blue; | |||
return rgb; | |||
} | |||
void sendVector(unsigned long v[], int len) | |||
{ | |||
for (int i = 0; i < len; i++) | |||
{ | |||
sendPackedRGB(v[i]); | |||
} | |||
sendSPIEndFrame(); | |||
/*** | |||
delay(150); | |||
sendAll(sendOff); | |||
delay(20); | |||
***/ | |||
} | |||
void sendPixel(int i, unsigned long p) | |||
{ | |||
static unsigned long vals[PIXEL_COUNT]; | |||
if( i >= PIXEL_COUNT ) | |||
return; | |||
vals[i] = p; | |||
sendVector(vals, PIXEL_COUNT); | |||
sendSPIEndFrame(); | |||
} | |||
unsigned long * getRYBGVector() | |||
{ | |||
static int init = 1; | |||
static unsigned long v[PIXEL_COUNT]; | |||
if( init) | |||
{ | |||
for(int i = 0; i < (PIXEL_COUNT - 4); i+=4) | |||
{ | |||
v[i] = packRGB(127, 0, 0); // red | |||
v[i+1] = packRGB(127, 127, 0); // yellow | |||
v[i+2] = packRGB(0, 0, 127); // blue | |||
v[i+3] = packRGB(0, 127, 0); // green | |||
} | |||
init = 0; | |||
} | |||
return v; | |||
} | |||
void setColorPixelTable() | |||
{ | |||
for (int i = 0; i < COLOR_COUNT; i++) | |||
{ | |||
colors[i][0] = (i%2) ? byte(i*10) : 0x00; | |||
colors[i][1] = (i%2) ? 0x00 : byte(i*10); | |||
colors[i][2] = 0x00; | |||
} | |||
} | |||
void pissRainbeau() | |||
{ | |||
static unsigned long count = 0; | |||
byte r, g, b; | |||
for (int i = COLOR_COUNT; i > 0; i--) | |||
{ | |||
setColorDataFromTable((count + i) % COLOR_COUNT); | |||
} | |||
sendSPIEndFrame(); | |||
while (count >= COLOR_COUNT) count -= COLOR_COUNT; | |||
Serial.println(String(count++)); | |||
} | |||
void sendSPIEndFrame() | |||
{ | |||
for (int i = 0; i < 4; i++) | |||
SPI.transfer(0x00); | |||
} | |||
void setColorDataFromTable(int i) | |||
{ | |||
sendSPI(byte(colors[i][0]), byte(colors[i][1]), byte(colors[i][2])); | |||
} | |||
byte makeFlag(byte red, byte green, byte blue) | |||
{ | |||
byte flag = 0; | |||
flag = (red&0xC0)>>6; | |||
flag |= ((green&0xC0)>>4); | |||
flag |= ((blue&0xC0)>>2); | |||
return ~flag; | |||
} | |||
void sendSPI(byte r, byte g, byte b) | |||
{ | |||
SPI.transfer(makeFlag(r, g, b)); | |||
SPI.transfer(b); // Blue | |||
SPI.transfer(g); // Green | |||
SPI.transfer(r); // Red | |||
} | |||
void sendAll(void (*f)(void)) | |||
{ | |||
for (int i = 0; i < PIXEL_COUNT; i++) | |||
{ | |||
f(); | |||
} | |||
sendSPIEndFrame(); | |||
} | |||
void sendAllOff() | |||
{ | |||
sendAll(sendOff); | |||
} | |||
void sendOff(void) | |||
{ | |||
sendSPI(0, 0, 0); | |||
} | |||
void sendRed(void) | |||
{ | |||
sendSPI(127, 0, 0); | |||
} | |||
void sendYellow(void) | |||
{ | |||
sendSPI(127, 127, 0); | |||
} | |||
void sendBlue(void) | |||
{ | |||
sendSPI(0, 0, 127); | |||
} | |||
void sendGreen(void) | |||
{ | |||
sendSPI(0, 127, 0); | |||
} | |||
void sendByteAsRYBG(byte val) | |||
{ | |||
static unsigned long ret[4] = {0, 0, 0, 0}; | |||
sendVector(byte2RYBGVector(val), 4); | |||
} | |||
void sendLongAsRYBG(unsigned long val) | |||
{ | |||
sendVector(long2RYBGVector(val), 16); | |||
} | |||
unsigned long * long2RYBGVector(unsigned long val) | |||
{ | |||
static unsigned long ret[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |||
for( int i = 0; i < 16; i++) | |||
{ | |||
ret[i] = RYBGColor(byte(val & 0x00000003)); | |||
val >>= 2; | |||
} | |||
return ret; | |||
} | |||
unsigned long * byte2RYBGVector(byte val) | |||
{ | |||
static unsigned long ret[4]; | |||
for( int i = 0; i < 4; i++ ) | |||
{ | |||
ret[i] = RYBGColor(byte(val & 0x03)); | |||
val >>= 2; | |||
} | |||
return ret; | |||
} | |||
unsigned long RYBGColor(byte val) | |||
{ | |||
static unsigned long RYBG[] = { | |||
packRGB(127, 0, 0), // red | |||
packRGB(127, 127, 0), // yellow | |||
packRGB(0, 0, 127), // blue | |||
packRGB(0, 127, 0) // green | |||
}; | |||
return RYBG[val % 4]; | |||
} | |||
unsigned long nextPrime() | |||
{ | |||
static unsigned long n = 0; | |||
unsigned long i = 3; | |||
if( n < 3 ) | |||
{ | |||
if( n == 0 ) | |||
{ | |||
n = 2; | |||
} else if( n == 2 ) { | |||
n = 3; | |||
} | |||
// n = 2 ? n < 3 : 3; | |||
return n; | |||
} | |||
n += 2; | |||
for( ; ; ) | |||
{ | |||
if ( i * i > n ) // no divisor found - current n is prime | |||
{ | |||
break; | |||
} | |||
if( n % i == 0) | |||
{ | |||
i = 3; | |||
// if( MAX_COUNT - 2 < n ) | |||
if( 100 < n ) | |||
{ | |||
n = 2; | |||
break; | |||
} | |||
n += 2; | |||
} else { | |||
i += 2; | |||
} | |||
} | |||
return(n); | |||
} | |||
void sendPrimes() | |||
{ | |||
static unsigned long primes[] = { | |||
2, 3, 5, 7, 11, 13, 17, 19, | |||
23, 29, 31, 37, 41, 43, 47, 53, | |||
59, 61, 67, 71, 73, 79, 83, 89, | |||
91, 97, 0}; | |||
unsigned long *p = primes; | |||
while( *p ) | |||
{ | |||
sendByteAsRYBG(byte(*p % 256)); | |||
p++; | |||
} | |||
} | |||
void countRYBG(byte count) | |||
{ | |||
for( int i = 0; i < count; i++ ) | |||
{ | |||
sendByteAsRYBG( byte(i % 256) ); | |||
delay(updateDelay); | |||
} | |||
} | |||
void sendMagicVals() | |||
{ | |||
struct lenvec lv = GetMagicVals(); | |||
sendVector(lv.vals, lv.len); | |||
} | |||
struct lenvec GetMagicVals() | |||
{ | |||
struct lenvec lv; | |||
lv.vals = getRYBGVector(); | |||
lv.len = PIXEL_COUNT; | |||
return lv; | |||
} | |||
unsigned long getLongFromSerial() | |||
{ | |||
unsigned long ret; | |||
byte num_read; | |||
char input_str[256]; | |||
char term = '\n'; | |||
while( Serial.available() <= 0 ) | |||
{ | |||
delay(updateDelay); | |||
} | |||
num_read = Serial.readBytesUntil(term, input_str, 256); | |||
input_str[num_read] = 0; | |||
ret = strtoul(input_str, NULL, 10); | |||
Serial.println(String(ret)); | |||
return ret; | |||
} | } | ||
</pre> | </pre> | ||
Line 137: | Line 537: | ||
* https://bitbucket.org/devries/arduino-tcl/overview | * https://bitbucket.org/devries/arduino-tcl/overview | ||
* http://projects.mathfarmer.com/home/12-band-color-organ-rgb-led | * http://projects.mathfarmer.com/home/12-band-color-organ-rgb-led | ||
* http://bestrgbledstrips.com/2016/11/18/rgb-led-strip-arduino/ | |||
[[Category:Fort]] |
Latest revision as of 00:39, 18 November 2016
Addressable RGB LED "pixels" from Cool Neon
Wiring[edit]
- RED - +5v
- GREEN - Data
- YELLOW - Clock
- BLUE - Ground
Code[edit]
Simple Test[edit]
/* Developed by: thex (noisebridge) Updated: 20131122 Revised: 20140829 (evil dan) https://noisebridge.net/wiki/RGBpixel */ // Arduino UNO Default wiring, Yellow to Pin 13 & Green to Pin 11 #include <SPI.h> int waitTime = 100; byte maxPower = 0x33; int offset = 0; /* color hex r g b deg ========================================== RED #FF0000 255, 0, 0 0 ORANGE #FF7F00 255, 127, 0 30 YELLOW #FFFF00 255, 255, 0 60 CHARTREUSE #7FFF00 127, 255, 0 90 GREEN #00FF00 0, 255, 0 120 SPRING #00FF7F 0, 255, 127 150 CYAN #00FFFF 0, 255, 255 180 AZURE #007FFF 0, 127, 255 210 BLUE #0000FF 0, 0, 255 240 VIOLET #7F00FF 127, 0, 255 270 MAGENTA #FF00FF 255, 0, 255 300 ROSE #FF007F 255, 0, 127 330 */ void setup() { // Set the SPI parameters SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV2); sendEmptyFrame(); } void loop() { for (int o = 0; o < offset; o++) sendColor(maxPower, maxPower, maxPower); offset++; if (offset > 25) offset = 0; for (int i = 0; i < 2; i++) { // RED sendColor(maxPower,0x00,0x00); // ORANGE sendColor(maxPower, maxPower>>1, 0x00); // YELLOW sendColor(maxPower, maxPower, 0x00); // CHARTREUSE sendColor(maxPower>>1, maxPower, 0x00); // GREEN sendColor(0x00,maxPower,0x00); // SPRING sendColor(0x00, maxPower, maxPower>>1); // CYAN sendColor(0x00, maxPower, maxPower); // AZURE sendColor(0x00, maxPower>>1, maxPower); // BLUE sendColor(0x00,0x00,maxPower); // VIOLOET sendColor(maxPower>>1, 0x00, maxPower); // MAGENTA sendColor(maxPower, 0x00, maxPower); // ROSE sendColor(maxPower, 0x00, maxPower>>1); } sendEmptyFrame(); delay(waitTime); } // Extrapolated functions from TCL Library void sendFrame(byte flag, byte red, byte green, byte blue) { SPI.transfer(flag); SPI.transfer(blue); SPI.transfer(green); SPI.transfer(red); } void sendColor(byte red, byte green, byte blue) { byte flag; flag = makeFlag(red,green,blue); sendFrame(flag,red,green,blue); } void sendEmptyFrame() { sendFrame(0x00, 0x00, 0x00, 0x00); } byte makeFlag(byte red, byte green, byte blue) { byte flag = 0; flag = (red&0xC0)>>6; flag |= ((green&0xC0)>>4); flag |= ((blue&0xC0)>>2); return ~flag; }
Evil Dan Edition [EXPERIMENTAL][edit]
/* EvilDan of moisebridge */ #include <SPI.h> struct lenvec { int len; unsigned long *vals; }; const int updateDelay = 200; const unsigned long MAX_COUNT = 0xffffffff; const int PIXEL_COUNT = 25; const int COLOR_COUNT = 255; // changed to constant (+hex) byte colors[COLOR_COUNT][3]; // added color table for all pixels (+hex) void sendAll(void (*f)(void)); void sendPackedRGB(unsigned long); void sendRed(void); void sendYellow(void); void sendBlue(void); void sendGreen(void); void sendOff(void); void sendOn(void); void sendGreen(void); void sendVector(unsigned long *, int); void sendByteAsRYBG(byte); void loop() { static unsigned long count = 0; // sendPrimes(); // sendLongAsRYBG(nextPrime()); // countRYBG(16); /*** sendLongAsRYBG(count); count += 1; if( count >= MAX_COUNT ) { count = 0; } ***/ // pissRainbeau(); // sendMagicVals(); sendLongAsRYBG(getLongFromSerial()); delay(updateDelay); } void setup() { setColorPixelTable(); initSerialAndSPI(); sendAll(sendOff); sendFlair(); sendAll(sendOff); delay(500); } void initSerialAndSPI() { Serial.begin(9600); SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV2); sendSPIEndFrame(); } void sendFlair() { int flashcount = 11; int flashrate = 100; // times per second int millisec = int(1000 / flashrate); for( int i = 0; i < flashcount; i++) { int pause = i * millisec; sendAll(sendRed); delay(pause); sendAll(sendYellow); delay(pause); sendAll(sendBlue); delay(pause); sendAll(sendGreen); delay(pause); } } void sendPackedRGB(unsigned long p) { byte r, g, b; r = byte((p >> 16) & 0xff); g = byte((p >> 8) & 0xff); b = byte(p & 0xff); sendSPI(r, g, b); } unsigned long packRGB(byte red, byte green, byte blue) { unsigned long rgb; rgb = (red * 65536) + (green * 256) + blue; // rgb = (red << 16) | (green << 8) | blue; return rgb; } void sendVector(unsigned long v[], int len) { for (int i = 0; i < len; i++) { sendPackedRGB(v[i]); } sendSPIEndFrame(); /*** delay(150); sendAll(sendOff); delay(20); ***/ } void sendPixel(int i, unsigned long p) { static unsigned long vals[PIXEL_COUNT]; if( i >= PIXEL_COUNT ) return; vals[i] = p; sendVector(vals, PIXEL_COUNT); sendSPIEndFrame(); } unsigned long * getRYBGVector() { static int init = 1; static unsigned long v[PIXEL_COUNT]; if( init) { for(int i = 0; i < (PIXEL_COUNT - 4); i+=4) { v[i] = packRGB(127, 0, 0); // red v[i+1] = packRGB(127, 127, 0); // yellow v[i+2] = packRGB(0, 0, 127); // blue v[i+3] = packRGB(0, 127, 0); // green } init = 0; } return v; } void setColorPixelTable() { for (int i = 0; i < COLOR_COUNT; i++) { colors[i][0] = (i%2) ? byte(i*10) : 0x00; colors[i][1] = (i%2) ? 0x00 : byte(i*10); colors[i][2] = 0x00; } } void pissRainbeau() { static unsigned long count = 0; byte r, g, b; for (int i = COLOR_COUNT; i > 0; i--) { setColorDataFromTable((count + i) % COLOR_COUNT); } sendSPIEndFrame(); while (count >= COLOR_COUNT) count -= COLOR_COUNT; Serial.println(String(count++)); } void sendSPIEndFrame() { for (int i = 0; i < 4; i++) SPI.transfer(0x00); } void setColorDataFromTable(int i) { sendSPI(byte(colors[i][0]), byte(colors[i][1]), byte(colors[i][2])); } byte makeFlag(byte red, byte green, byte blue) { byte flag = 0; flag = (red&0xC0)>>6; flag |= ((green&0xC0)>>4); flag |= ((blue&0xC0)>>2); return ~flag; } void sendSPI(byte r, byte g, byte b) { SPI.transfer(makeFlag(r, g, b)); SPI.transfer(b); // Blue SPI.transfer(g); // Green SPI.transfer(r); // Red } void sendAll(void (*f)(void)) { for (int i = 0; i < PIXEL_COUNT; i++) { f(); } sendSPIEndFrame(); } void sendAllOff() { sendAll(sendOff); } void sendOff(void) { sendSPI(0, 0, 0); } void sendRed(void) { sendSPI(127, 0, 0); } void sendYellow(void) { sendSPI(127, 127, 0); } void sendBlue(void) { sendSPI(0, 0, 127); } void sendGreen(void) { sendSPI(0, 127, 0); } void sendByteAsRYBG(byte val) { static unsigned long ret[4] = {0, 0, 0, 0}; sendVector(byte2RYBGVector(val), 4); } void sendLongAsRYBG(unsigned long val) { sendVector(long2RYBGVector(val), 16); } unsigned long * long2RYBGVector(unsigned long val) { static unsigned long ret[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for( int i = 0; i < 16; i++) { ret[i] = RYBGColor(byte(val & 0x00000003)); val >>= 2; } return ret; } unsigned long * byte2RYBGVector(byte val) { static unsigned long ret[4]; for( int i = 0; i < 4; i++ ) { ret[i] = RYBGColor(byte(val & 0x03)); val >>= 2; } return ret; } unsigned long RYBGColor(byte val) { static unsigned long RYBG[] = { packRGB(127, 0, 0), // red packRGB(127, 127, 0), // yellow packRGB(0, 0, 127), // blue packRGB(0, 127, 0) // green }; return RYBG[val % 4]; } unsigned long nextPrime() { static unsigned long n = 0; unsigned long i = 3; if( n < 3 ) { if( n == 0 ) { n = 2; } else if( n == 2 ) { n = 3; } // n = 2 ? n < 3 : 3; return n; } n += 2; for( ; ; ) { if ( i * i > n ) // no divisor found - current n is prime { break; } if( n % i == 0) { i = 3; // if( MAX_COUNT - 2 < n ) if( 100 < n ) { n = 2; break; } n += 2; } else { i += 2; } } return(n); } void sendPrimes() { static unsigned long primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 91, 97, 0}; unsigned long *p = primes; while( *p ) { sendByteAsRYBG(byte(*p % 256)); p++; } } void countRYBG(byte count) { for( int i = 0; i < count; i++ ) { sendByteAsRYBG( byte(i % 256) ); delay(updateDelay); } } void sendMagicVals() { struct lenvec lv = GetMagicVals(); sendVector(lv.vals, lv.len); } struct lenvec GetMagicVals() { struct lenvec lv; lv.vals = getRYBGVector(); lv.len = PIXEL_COUNT; return lv; } unsigned long getLongFromSerial() { unsigned long ret; byte num_read; char input_str[256]; char term = '\n'; while( Serial.available() <= 0 ) { delay(updateDelay); } num_read = Serial.readBytesUntil(term, input_str, 256); input_str[num_read] = 0; ret = strtoul(input_str, NULL, 10); Serial.println(String(ret)); return ret; }
Links[edit]
- http://www.coolneon.com/
- http://arduino.cc/en/Reference/SPI
- http://www.idolstarastronomer.com/Home/char-total_control_lighting
- https://bitbucket.org/devries/arduino-tcl/overview
- http://projects.mathfarmer.com/home/12-band-color-organ-rgb-led
- http://bestrgbledstrips.com/2016/11/18/rgb-led-strip-arduino/