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.

.

Committer:
bridadan
Date:
Thu Feb 12 21:55:24 2015 +0000
Revision:
2:cb82a3dc4031
Parent:
1:e04a0ecefa29
K64F timings in demo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bridadan 0:12cb6f0c2788 1 #include "mbed.h"
bridadan 0:12cb6f0c2788 2 #include "WS2812.h"
bridadan 0:12cb6f0c2788 3 #include "PixelArray.h"
bridadan 0:12cb6f0c2788 4
bridadan 2:cb82a3dc4031 5 #define WS2812_BUF 150
bridadan 2:cb82a3dc4031 6 #define NUM_COLORS 6
bridadan 2:cb82a3dc4031 7 #define NUM_LEDS_PER_COLOR 10
bridadan 0:12cb6f0c2788 8
bridadan 0:12cb6f0c2788 9 PixelArray px(WS2812_BUF);
bridadan 0:12cb6f0c2788 10
bridadan 2:cb82a3dc4031 11 // See the program page for information on the timing numbers
bridadan 1:e04a0ecefa29 12 // The given numbers are for the K64F
bridadan 2:cb82a3dc4031 13 WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
bridadan 0:12cb6f0c2788 14
bridadan 0:12cb6f0c2788 15 int main()
bridadan 0:12cb6f0c2788 16 {
bridadan 0:12cb6f0c2788 17
bridadan 1:e04a0ecefa29 18 ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
bridadan 0:12cb6f0c2788 19
bridadan 0:12cb6f0c2788 20 // set up the colours we want to draw with
bridadan 2:cb82a3dc4031 21 int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
bridadan 0:12cb6f0c2788 22
bridadan 0:12cb6f0c2788 23 // for each of the colours (j) write out 10 of them
bridadan 0:12cb6f0c2788 24 // the pixels are written at the colour*10, plus the colour position
bridadan 0:12cb6f0c2788 25 // all modulus 60 so it wraps around
bridadan 2:cb82a3dc4031 26 for (int i = 0; i < WS2812_BUF; i++) {
bridadan 2:cb82a3dc4031 27 px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]);
bridadan 0:12cb6f0c2788 28 }
bridadan 0:12cb6f0c2788 29
bridadan 0:12cb6f0c2788 30 // now all the colours are computed, add a fade effect using intensity scaling
bridadan 0:12cb6f0c2788 31 // compute and write the II value for each pixel
bridadan 2:cb82a3dc4031 32 for (int j=0; j<WS2812_BUF; j++) {
bridadan 0:12cb6f0c2788 33 // px.SetI(pixel position, II value)
bridadan 2:cb82a3dc4031 34 px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR)));
bridadan 0:12cb6f0c2788 35 }
bridadan 0:12cb6f0c2788 36
bridadan 0:12cb6f0c2788 37
bridadan 0:12cb6f0c2788 38 // Now the buffer is written, rotate it
bridadan 0:12cb6f0c2788 39 // by writing it out with an increasing offset
bridadan 0:12cb6f0c2788 40 while (1) {
bridadan 2:cb82a3dc4031 41 for (int z=WS2812_BUF; z >= 0 ; z--) {
bridadan 0:12cb6f0c2788 42 ws.write_offsets(px.getBuf(),z,z,z);
bridadan 0:12cb6f0c2788 43 wait(0.075);
bridadan 0:12cb6f0c2788 44 }
bridadan 0:12cb6f0c2788 45 }
bridadan 0:12cb6f0c2788 46
bridadan 0:12cb6f0c2788 47 }