Optimised fork of bikeNomad's WS2811 LED control library. Supports KL25Z and KL46Z
Fork of Multi_WS2811 by
Optimised to use far less RAM than the original.
Capable of running up to 8 strings of 240 LEDs each with plenty of RAM to spare on the KL46Z.
Should run at least three strings of 240 LEDs on the KL25Z (RAM limited)
Diff: WS2811.h
- Revision:
- 7:58623ad7f310
- Parent:
- 6:3b5b8a367f40
--- a/WS2811.h Wed Apr 02 12:16:42 2014 +0000 +++ b/WS2811.h Wed Apr 02 13:22:25 2014 +0000 @@ -13,8 +13,8 @@ // Modified by Ned Konz, December 2013. // Using three-phase DMA ala Paul Stoffegren's version. // -// Modified by richard Thompson, Marhc 2014. -// Uses 8-bit DMA transfers instead of 32-bit, uses 1/4 of the RAM. +// Modified by richard Thompson, March 2014. +// Uses 8-bit DMA transfers instead of 32-bit, uses 1/4 of the RAM (static) // Now capable of running 240 LEDs on one pin #ifndef MBED_WS2811_H @@ -29,7 +29,7 @@ extern "C" void DMA0_IRQHandler(); extern "C" void TPM0_IRQHandler(); -/** +/** * WS2811/WS2812/WS2812B * LED Strip controller\n * For FRDM-KL25Z and FRDM-KL46Z @@ -49,22 +49,101 @@ Eight strings:\n 240*8 LEDs: 11520 + (240*3) * 8 = 17,280 bytes + +Example usage: +@code +#include "mbed.h" +#include "WS2811.h" +#include "Colors.h" + +static void showRainbow(WS2811 &strip, float startHue, float sat, float brite, float hueShift) +{ + unsigned nLEDs = strip.numPixels(); + float hue = startHue; + for (unsigned i = 0; i < nLEDs; i++) { + uint8_t r, g, b; + Colors::HSBtoRGB(hue, sat, brite, &r, &g, &b); + strip.setPixelColor(i, r, g, b); + hue += hueShift; + if (hue > 1.0) hue = 0.0; + } + strip.show(); +} + +static void showSolidColor(WS2811 &strip, uint8_t r, uint8_t g, uint8_t b) +{ + unsigned nLEDs = strip.numPixels(); + for (unsigned i = 0; i < nLEDs; i++) { + strip.setPixelColor(i, r, g, b); + } + strip.show(); +} + +int main(void) +{ + WS2811 lightStrip1(nLEDs, 2); + WS2811 lightStrip2(nLEDs, 3); + WS2811 lightStrip3(nLEDs, 4); + + lightStrip1.begin(); + lightStrip2.begin(); + lightStrip3.begin(); + + uint8_t r =0; + uint8_t g =0; + uint8_t b =0; + + bool fadeUp = true; + + float startHue = 0.0; + for (;;) { + startHue += 0.01; + if (startHue > 1.0) startHue = 0.0; + if (fadeUp) { + if (r == 255) fadeUp = false; + else { + ++r; + ++g; + ++b; + } + } else { + if (r == 0) fadeUp = true; + else { + --r; + --g; + --b; + } + } + + // Solid fading white + showSolidColor(lightStrip1, r, g, b); + // Maximum saturation rainbow + showRainbow(lightStrip2, startHue, 1.0, 1.0, 1.0/nLEDs); + // Pastel rainbow + showRainbow(lightStrip3, startHue, 0.5, 1.0, 1.0/nLEDs); + + WS2811::startDMA(); + wait_ms(25); + frames++; + } +} +@endcode */ class WS2811 : public LedStrip { public: /** Set up the LED strip - @param n Number of LEDs on the strip. Must be less than MAX_LEDS_PER_STRIP + @param pixelCount Number of RGB LEDs on the strip. No more than MAX_LEDS_PER_STRIP (240) @param pinNumber Pin number on PORTD. 0-7. */ - WS2811(unsigned n, unsigned pinNumber); + WS2811(uint16_t pixelCount, uint8_t pinNumber); virtual void begin(); virtual void show(); virtual void blank(); - /** Send a level update to all the WS2811 LED strips - * All updates happen in parallel, ensure all (max. 8) strips have complete data before calling this. + /** Send a level update to all the WS2811 LED strips\n + * All updates happen in parallel, ensure all (max 8) strips have complete data before calling this. */ static void startDMA(); @@ -78,17 +157,19 @@ static bool initialized; static uint32_t enabledPins; static volatile bool dma_done; - static void wait_for_dma_done() { while (!dma_done) __WFI(); } + static void wait_for_dma_done() { + while (!dma_done) __WFI(); + } static void writeByte(uint8_t byte, uint32_t mask, uint8_t *dest); static void hw_init(); - static void io_init(); - static void clock_init(); - static void dma_init(); - static void tpm_init(); - static void dma_data_init(); - + static void io_init(); + static void clock_init(); + static void dma_init(); + static void tpm_init(); + static void dma_data_init(); + friend void TPM0_IRQHandler(); };