Blog 24
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Working with RGB leds on the WS2812
For Linux/Raspberry:
apt-get install ckermit
If you use and other device, or want to know more:
C-Kermit
For Windows users it's optional to use:
PuTTY
RGB lighted paper Tree
The c-program RGBTree.c can be downloaded: here.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define WHITE 0xffffff #define YELLOW 0xffff00 #define RED 0x800000 #define GREEN 0x008000 #define BLUE 0x0000ff #define BLACK 0x000000 int nfadesteps = 30; int delayms = 30; int interpolate (int c1, int c2, int shift, int pos, int end) { c1 >>= shift; c2 >>= shift; c1 &= 0xff; c2 &= 0xff; return c1 * (end-pos) / end + c2 * pos / end; } void fadeto (int pixnum, int col1, int col2) { int i; int r, g, b; for (i=0;i <= nfadesteps;i++) { r = interpolate (col1, col2, 16, i, nfadesteps); g = interpolate (col1, col2, 8, i, nfadesteps); b = interpolate (col1, col2, 0, i, nfadesteps); printf ("pix %d %06x\n", pixnum, (r << 16) | (g << 8) | (b << 0)); usleep (delayms*1000); } } int main (int argc, char **argv) { int nleds = 10; int *pixels; int pixnum, newcolor; int i; if (argc > 1) nleds = atoi (argv[1]); pixels = calloc (nleds, sizeof(int)); printf ("pix %d %06x\n", nleds, WHITE); for (i=0;i < nleds;i++){ if (random () % 2 == 0) pixels[i] = RED; else pixels[i] = GREEN; printf ("pix %d %06x\n", i, pixels[i]); } while (1) { pixnum = random () % nleds; if (pixels[pixnum] == RED) newcolor = GREEN; else newcolor = RED; fadeto (pixnum, pixels[pixnum], newcolor); pixels[pixnum] = newcolor; } exit (0); }