Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Multi_WS2811 by
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();
};
