Example for WS2812 Library

Dependencies:   PixelArray WS2812 mbed

Dependents:   Button_Neopixel

This is a demo for the WS2812 LED driver library.

The the timings of the bit banging operation are very sensitive. Depending on the platform, you will need to change the timing values in the WS2812 constructor. The default values in this demo are for the K64F. Here are a few other values for other platforms:

K64F, KL46Z: 0, 5, 5, 0

LPC1768: 5, 10, 10, 15

NUCLEO F411RE: 7, 15, 10, 15

UPDATE 11-29-2016

Thanks to the user Proff for the new measurements!

LPC1768: 3, 11, 10, 11

NUCLEO_F401RE: 3, 12, 9, 12

UPDATE 3-14-2017

Thanks to the user SashaK for the new measurements

NUCELO_F746ZG: 32, 105, 70, 123

If you are curious how to determine these values, see the WS2812 library page below.

Import libraryWS2812

Library for the WS2812 LED Driver. Uses bit banging and nops for precise timing. Number of nops executed are configurable at run time.

.

Files at this revision

API Documentation at this revision

Comitter:
bridadan
Date:
Thu Feb 12 21:55:24 2015 +0000
Parent:
1:e04a0ecefa29
Commit message:
K64F timings in demo

Changed in this revision

WS2812.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r e04a0ecefa29 -r cb82a3dc4031 WS2812.lib
--- a/WS2812.lib	Thu Feb 12 20:20:54 2015 +0000
+++ b/WS2812.lib	Thu Feb 12 21:55:24 2015 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/bridadan/code/WS2812/#aadbf08c62a2
+http://developer.mbed.org/users/bridadan/code/WS2812/#6e647820f587
diff -r e04a0ecefa29 -r cb82a3dc4031 main.cpp
--- a/main.cpp	Thu Feb 12 20:20:54 2015 +0000
+++ b/main.cpp	Thu Feb 12 21:55:24 2015 +0000
@@ -2,15 +2,15 @@
 #include "WS2812.h"
 #include "PixelArray.h"
 
-#define WS2812_BUF 60
+#define WS2812_BUF 150
+#define NUM_COLORS 6
+#define NUM_LEDS_PER_COLOR 10
 
 PixelArray px(WS2812_BUF);
 
-// See the program page for information on the timing numbers (eg: 0, 5, 5, 0)
+// See the program page for information on the timing numbers
 // The given numbers are for the K64F
-WS2812 ws(D9,WS2812_BUF, 0, 5, 5, 0);
-
-DigitalOut led(LED1);
+WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
 
 int main()
 {
@@ -18,29 +18,27 @@
     ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
     
     // set up the colours we want to draw with
-    int colorbuf[6] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
+    int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
 
     // for each of the colours (j) write out 10 of them
     // the pixels are written at the colour*10, plus the colour position
     // all modulus 60 so it wraps around
-    for (int i =0; i<6; i++) {
-        for (int j=0; j<10; j++) {
-            px.Set(((i*10)+j)%60,colorbuf[i]);
-        }
+    for (int i = 0; i < WS2812_BUF; i++) {
+        px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]);
     }
 
     // now all the colours are computed, add a fade effect using intensity scaling
     // compute and write the II value for each pixel
-    for (int j=0; j<60; j++) {
+    for (int j=0; j<WS2812_BUF; j++) {
         // px.SetI(pixel position, II value)
-        px.SetI(j%60, 0xf+(0xf*(j%10)));
+        px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR)));
     }
 
 
     // Now the buffer is written, rotate it
     // by writing it out with an increasing offset
     while (1) {
-        for (int z=59; z >= 0 ; z--) {
+        for (int z=WS2812_BUF; z >= 0 ; z--) {
             ws.write_offsets(px.getBuf(),z,z,z);
             wait(0.075);
         }