NeoPixelとは
WS2812 LED stripだ
結線
電源の他に、DataはP0につなぐ。
コード
コードは参考1から利用
https://github.com/smartynov/iotfun/tree/master/arduino/deco_lights
WS2812は8個内蔵だから、下記のように変更する
#define PIN 0
#define NUMPIXELS 8
また64個内蔵の場合、BRIGHTNESS を弱めて、下記のように変更する。
#include <Adafruit_NeoPixel.h> // set to pin connected to data input of WS8212 (NeoPixel) strip #define PINGND 0 #define PIN 1 #define PINVCC 2 // any pin with analog input (used to initialize random number generator) #define RNDPIN 2 // number of LEDs (NeoPixels) in your strip // (please note that you need 3 bytes of RAM available for each pixel) #define NUMPIXELS 64 // max LED brightness (1 to 255) – start with low values! // (please note that high brightness requires a LOT of power) #define BRIGHTNESS 32 // increase to get narrow spots, decrease to get wider spots #define FOCUS 65 // decrease to speed up, increase to slow down (it's not a delay actually) #define DELAY 4000 // set to 1 to display FPS rate #define DEBUG 0 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // we have 3 color spots (reg, green, blue) oscillating along the strip with different speeds float spdr, spdg, spdb; float offset; #if DEBUG // track fps rate long nextms = 0; int pfps = 0, fps = 0; #endif // the real exponent function is too slow, so I created an approximation (only for x < 0) float myexp(float x) { return (1.0/(1.0-(0.634-1.344*x)*x)); } void setup() { pinMode(PINVCC, OUTPUT); digitalWrite(PINVCC, HIGH); pinMode(PINGND, OUTPUT); digitalWrite(PINGND, LOW); // initialize pseudo-random number generator with some random value randomSeed(analogRead(RNDPIN)); // assign random speed to each spot spdr = 1.0 + random(200) / 100.0; spdg = 1.0 + random(200) / 100.0; spdb = 1.0 + random(200) / 100.0; // set random offset so spots start in random locations offset = random(10000) / 100.0; // initialize LED strip strip.begin(); strip.show(); } void loop() { // use real time to recalculate position of each color spot long ms = millis(); // scale time to float value float m = offset + (float)ms/DELAY; // add some non-linearity m = m - 42.5*cos(m/552.0) - 6.5*cos(m/142.0); // recalculate position of each spot (measured on a scale of 0 to 1) float posr = 0.5 + 0.55*sin(m*spdr); float posg = 0.5 + 0.55*sin(m*spdg); float posb = 0.5 + 0.55*sin(m*spdb); // now iterate over each pixel and calculate it's color for (int i=0; i<NUMPIXELS; i++) { // pixel position on a scale from 0.0 to 1.0 float ppos = (float)i / NUMPIXELS; // distance from this pixel to the center of each color spot float dr = ppos-posr; float dg = ppos-posg; float db = ppos-posb; // set each color component from 0 to max BRIGHTNESS, according to Gaussian distribution strip.setPixelColor(i, constrain(BRIGHTNESS*myexp(-FOCUS*dr*dr),0,BRIGHTNESS), constrain(BRIGHTNESS*myexp(-FOCUS*dg*dg),0,BRIGHTNESS), constrain(BRIGHTNESS*myexp(-FOCUS*db*db),0,BRIGHTNESS) ); } #if DEBUG // keep track of FPS rate fps++; if (ms>nextms) { // 1 second passed – reset counter nextms = ms + 1000; pfps = fps; fps = 0; } // show FPS rate by setting one pixel to white strip.setPixelColor(pfps,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS); #endif // send data to LED strip strip.show(); }
参考
- https://www.instructables.com/id/USB-NeoPixel-Deco-Lights-via-Digispark-ATtiny85/