A library for SPI control of adafruit's neopixel ring and addressable LEDs.
Dependents: TI_NEOPIXEL_SPI_SAMPLE
TI_NEOPIXEL_SPI.cpp
- Committer:
- tichise
- Date:
- 2020-01-02
- Revision:
- 4:70bc3528e07e
- Parent:
- 3:f0859c280204
File content as of revision 4:70bc3528e07e:
#include "TI_NEOPIXEL_SPI.h" #include "mbed.h" TI_NEOPIXEL_SPI::TI_NEOPIXEL_SPI(PinName input) : _neoPixel(input) { } void TI_NEOPIXEL_SPI::switchLightOff(int count) { Pixel pixels[count]; for (int i = 0; i < count; i++) { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } _neoPixel.send(pixels, count); } void TI_NEOPIXEL_SPI::switchLightOn(int count, int startCount, int endCount, rgbColor rgbColor) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (startCount <= i && i < endCount) { pixels[i].r = rgbColor.red; pixels[i].g = rgbColor.green; pixels[i].b = rgbColor.blue; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); } void TI_NEOPIXEL_SPI::changeColor(int count, int startCount, int endCount, rgbColor rgbColor) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (startCount <= i && i < endCount) { pixels[i].r = rgbColor.red; pixels[i].g = rgbColor.green; pixels[i].b = rgbColor.blue; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); } void TI_NEOPIXEL_SPI::changePointColor(int count, int topIndex, int endIndex, rgbColor topColor, rgbColor bottomColor) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (i == topIndex) { pixels[i].r = topColor.red; pixels[i].g = topColor.green; pixels[i].b = topColor.blue; } else if (i == endIndex) { pixels[i].r = bottomColor.red; pixels[i].g = bottomColor.green; pixels[i].b = bottomColor.blue; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); } void TI_NEOPIXEL_SPI::circle(int count, int startCount, int endCount, rgbColor rgbColor) { for (int j = 0; j < count; j++) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (i <= j) { if (startCount <= i && i < endCount) { pixels[i].r = rgbColor.red; pixels[i].g = rgbColor.green; pixels[i].b = rgbColor.blue; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); if (startCount <= j && j < endCount) { if (count == 16) { wait(0.05); } else { wait(0.015); } } } } void TI_NEOPIXEL_SPI::chase(int count, int bufferCount, rgbColor c1, rgbColor c2) { int virtualCount = count + bufferCount; Pixel pixels[virtualCount]; for (int j = 0; j < virtualCount; j++) { pixels[j].r = c2.red; pixels[j].g = c2.green; pixels[j].b = c2.blue; } for (int j = 0; j < count; j++) { pixels[j].r = c1.red; pixels[j].g = c1.green; pixels[j].b = c1.blue; pixels[j - bufferCount].r = c2.red; pixels[j - bufferCount].g = c2.green; pixels[j - bufferCount].b = c2.blue; _neoPixel.send(pixels, virtualCount); if (count == 16) { wait(0.05); } else { wait(0.015); } } } void TI_NEOPIXEL_SPI::chase2(int count, int bufferCount, rgbColor c1, rgbColor c2) { for (int j = 0; j < count; j++) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (i <= j) { pixels[i].r = c1.red; pixels[i].g = c1.green; pixels[i].b = c1.blue; // LEDを節約 pixels[i - bufferCount].r = c2.red; pixels[i - bufferCount].g = c2.green; pixels[i - bufferCount].b = c2.blue; } else { pixels[i].r = c2.red; pixels[i].g = c2.green; pixels[i].b = c2.blue; } } _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.015); } } } void TI_NEOPIXEL_SPI::chaseReverse(int count, int bufferCount, rgbColor c1, rgbColor c2) { printf("chaseReverse \n"); Pixel pixels[count]; for (int j = 0; j <= count; j++) { pixels[j].r = c2.red; pixels[j].g = c2.green; pixels[j].b = c2.blue; } _neoPixel.send(pixels, count); for (int j = 0; j <= count; j++) { if (0 <= (count - j)) { pixels[count - j].r = c1.red; pixels[count - j].g = c1.green; pixels[count - j].b = c1.blue; } if (bufferCount <= j) { pixels[count + bufferCount - j].r = c2.red; pixels[count + bufferCount - j].g = c2.green; pixels[count + bufferCount - j].b = c2.blue; } _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.015); } } } void TI_NEOPIXEL_SPI::chaseRainbow(int count, int bufferCount) { for (int j = 0; j < count; j++) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (i <= j) { uint8_t phase = 256 / count * i; rgbColor rgbColor = convertHsvToRgb(phase / 256.0, 1.0, 1.0); pixels[i].r = rgbColor.red; pixels[i].g = rgbColor.green; pixels[i].b = rgbColor.blue; // LEDを節約 pixels[i - bufferCount].r = 0; pixels[i - bufferCount].g = 0; pixels[i - bufferCount].b = 0; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.015); } } } void TI_NEOPIXEL_SPI::circleRainbow(int count) { for (int j = 0; j < count; j++) { Pixel pixels[count]; for (int i = 0; i < count; i++) { if (i <= j) { uint8_t phase = 256 / count * i; rgbColor rgbColor = convertHsvToRgb(phase / 256.0, 1.0, 1.0); pixels[i].r = rgbColor.red; pixels[i].g = rgbColor.green; pixels[i].b = rgbColor.blue; } else { pixels[i].r = 0; pixels[i].g = 0; pixels[i].b = 0; } } _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.015); } } } void TI_NEOPIXEL_SPI::moon(int count, int startIndex, int stopIndex, rgbColor c1, rgbColor c2) { Pixel pixels[count]; for (int j = 0; j < count; j++) { if (0 <= j && j <= count) { pixels[j].r = c2.red; pixels[j].g = c2.green; pixels[j].b = c2.blue; } } int loopCount = (stopIndex - startIndex) / 2; int middlePoint = startIndex + loopCount; for (int i = 0; i <= loopCount - 1; i++) { pixels[middlePoint + i].r = c1.red; pixels[middlePoint + i].g = c1.green; pixels[middlePoint + i].b = c1.blue; pixels[middlePoint - i].r = c1.red; pixels[middlePoint - i].g = c1.green; pixels[middlePoint - i].b = c1.blue; _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.04); } } for (int i = 0; i <= loopCount - 1; i++) { pixels[startIndex + i].r = c2.red; pixels[startIndex + i].g = c2.green; pixels[startIndex + i].b = c2.blue; pixels[stopIndex - i].r = c2.red; pixels[stopIndex - i].g = c2.green; pixels[stopIndex - i].b = c2.blue; _neoPixel.send(pixels, count); if (count == 16) { wait(0.05); } else { wait(0.04); } } } rgbColor TI_NEOPIXEL_SPI::convertHsvToRgb(float h, float s, float v) { int i = floor(h * 6); float f = h * 6 - i; float p = v * (1 - s); float q = v * (1 - f * s); float t = v * (1 - (1 - f) * s); float r = 0, g = 0, b = 0; switch (i % 6) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } return (rgbColor){r * 255, g * 255, b * 255}; }