change structure continued
This commit is contained in:
@ -0,0 +1,177 @@
|
||||
// NeoPixel test program showing use of the WHITE channel for RGBW
|
||||
// pixels only (won't look correct on regular RGB NeoPixel strips).
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#ifdef __AVR__
|
||||
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
|
||||
#endif
|
||||
|
||||
// Which pin on the Arduino is connected to the NeoPixels?
|
||||
// On a Trinket or Gemma we suggest changing this to 1:
|
||||
#define LED_PIN 6
|
||||
|
||||
// How many NeoPixels are attached to the Arduino?
|
||||
#define LED_COUNT 60
|
||||
|
||||
// NeoPixel brightness, 0 (min) to 255 (max)
|
||||
#define BRIGHTNESS 50
|
||||
|
||||
// Declare our NeoPixel strip object:
|
||||
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);
|
||||
// Argument 1 = Number of pixels in NeoPixel strip
|
||||
// Argument 2 = Arduino pin number (most are valid)
|
||||
// Argument 3 = Pixel type flags, add together as needed:
|
||||
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
||||
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
||||
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
||||
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
||||
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
||||
|
||||
void setup() {
|
||||
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
|
||||
// Any other board, you can remove this part (but no harm leaving it):
|
||||
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
|
||||
clock_prescale_set(clock_div_1);
|
||||
#endif
|
||||
// END of Trinket-specific code.
|
||||
|
||||
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
||||
strip.show(); // Turn OFF all pixels ASAP
|
||||
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Fill along the length of the strip in various colors...
|
||||
colorWipe(strip.Color(255, 0, 0) , 50); // Red
|
||||
colorWipe(strip.Color( 0, 255, 0) , 50); // Green
|
||||
colorWipe(strip.Color( 0, 0, 255) , 50); // Blue
|
||||
colorWipe(strip.Color( 0, 0, 0, 255), 50); // True white (not RGB white)
|
||||
|
||||
whiteOverRainbow(75, 5);
|
||||
|
||||
pulseWhite(5);
|
||||
|
||||
rainbowFade2White(3, 3, 1);
|
||||
}
|
||||
|
||||
// Fill strip pixels one after another with a color. Strip is NOT cleared
|
||||
// first; anything there will be covered pixel by pixel. Pass in color
|
||||
// (as a single 'packed' 32-bit value, which you can get by calling
|
||||
// strip.Color(red, green, blue) as shown in the loop() function above),
|
||||
// and a delay time (in milliseconds) between pixels.
|
||||
void colorWipe(uint32_t color, int wait) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
|
||||
strip.show(); // Update strip to match
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
void whiteOverRainbow(int whiteSpeed, int whiteLength) {
|
||||
|
||||
if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;
|
||||
|
||||
int head = whiteLength - 1;
|
||||
int tail = 0;
|
||||
int loops = 3;
|
||||
int loopNum = 0;
|
||||
uint32_t lastTime = millis();
|
||||
uint32_t firstPixelHue = 0;
|
||||
|
||||
for(;;) { // Repeat forever (or until a 'break' or 'return')
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
if(((i >= tail) && (i <= head)) || // If between head & tail...
|
||||
((tail > head) && ((i >= tail) || (i <= head)))) {
|
||||
strip.setPixelColor(i, strip.Color(0, 0, 0, 255)); // Set white
|
||||
} else { // else set rainbow
|
||||
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
||||
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
|
||||
}
|
||||
}
|
||||
|
||||
strip.show(); // Update strip with new contents
|
||||
// There's no delay here, it just runs full-tilt until the timer and
|
||||
// counter combination below runs out.
|
||||
|
||||
firstPixelHue += 40; // Advance just a little along the color wheel
|
||||
|
||||
if((millis() - lastTime) > whiteSpeed) { // Time to update head/tail?
|
||||
if(++head >= strip.numPixels()) { // Advance head, wrap around
|
||||
head = 0;
|
||||
if(++loopNum >= loops) return;
|
||||
}
|
||||
if(++tail >= strip.numPixels()) { // Advance tail, wrap around
|
||||
tail = 0;
|
||||
}
|
||||
lastTime = millis(); // Save time of last movement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void pulseWhite(uint8_t wait) {
|
||||
for(int j=0; j<256; j++) { // Ramp up from 0 to 255
|
||||
// Fill entire strip with white at gamma-corrected brightness level 'j':
|
||||
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
|
||||
strip.show();
|
||||
delay(wait);
|
||||
}
|
||||
|
||||
for(int j=255; j>=0; j--) { // Ramp down from 255 to 0
|
||||
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
|
||||
strip.show();
|
||||
delay(wait);
|
||||
}
|
||||
}
|
||||
|
||||
void rainbowFade2White(int wait, int rainbowLoops, int whiteLoops) {
|
||||
int fadeVal=0, fadeMax=100;
|
||||
|
||||
// Hue of first pixel runs 'rainbowLoops' complete loops through the color
|
||||
// wheel. Color wheel has a range of 65536 but it's OK if we roll over, so
|
||||
// just count from 0 to rainbowLoops*65536, using steps of 256 so we
|
||||
// advance around the wheel at a decent clip.
|
||||
for(uint32_t firstPixelHue = 0; firstPixelHue < rainbowLoops*65536;
|
||||
firstPixelHue += 256) {
|
||||
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
|
||||
// Offset pixel hue by an amount to make one full revolution of the
|
||||
// color wheel (range of 65536) along the length of the strip
|
||||
// (strip.numPixels() steps):
|
||||
uint32_t pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
||||
|
||||
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
|
||||
// optionally add saturation and value (brightness) (each 0 to 255).
|
||||
// Here we're using just the three-argument variant, though the
|
||||
// second value (saturation) is a constant 255.
|
||||
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue, 255,
|
||||
255 * fadeVal / fadeMax)));
|
||||
}
|
||||
|
||||
strip.show();
|
||||
delay(wait);
|
||||
|
||||
if(firstPixelHue < 65536) { // First loop,
|
||||
if(fadeVal < fadeMax) fadeVal++; // fade in
|
||||
} else if(firstPixelHue >= ((rainbowLoops-1) * 65536)) { // Last loop,
|
||||
if(fadeVal > 0) fadeVal--; // fade out
|
||||
} else {
|
||||
fadeVal = fadeMax; // Interim loop, make sure fade is at max
|
||||
}
|
||||
}
|
||||
|
||||
for(int k=0; k<whiteLoops; k++) {
|
||||
for(int j=0; j<256; j++) { // Ramp up 0 to 255
|
||||
// Fill entire strip with white at gamma-corrected brightness level 'j':
|
||||
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
|
||||
strip.show();
|
||||
}
|
||||
delay(1000); // Pause 1 second
|
||||
for(int j=255; j>=0; j--) { // Ramp down 255 to 0
|
||||
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
|
||||
strip.show();
|
||||
}
|
||||
}
|
||||
|
||||
delay(500); // Pause 1/2 second
|
||||
}
|
133
libraries/Adafruit_NeoPixel/examples/StrandtestBLE/BLESerial.cpp
Normal file
133
libraries/Adafruit_NeoPixel/examples/StrandtestBLE/BLESerial.cpp
Normal file
@ -0,0 +1,133 @@
|
||||
#include "BLESerial.h"
|
||||
|
||||
// #define BLE_SERIAL_DEBUG
|
||||
|
||||
BLESerial* BLESerial::_instance = NULL;
|
||||
|
||||
BLESerial::BLESerial(unsigned char req, unsigned char rdy, unsigned char rst) :
|
||||
BLEPeripheral(req, rdy, rst)
|
||||
{
|
||||
this->_txCount = 0;
|
||||
this->_rxHead = this->_rxTail = 0;
|
||||
this->_flushed = 0;
|
||||
BLESerial::_instance = this;
|
||||
|
||||
addAttribute(this->_uartService);
|
||||
addAttribute(this->_uartNameDescriptor);
|
||||
setAdvertisedServiceUuid(this->_uartService.uuid());
|
||||
addAttribute(this->_rxCharacteristic);
|
||||
addAttribute(this->_rxNameDescriptor);
|
||||
this->_rxCharacteristic.setEventHandler(BLEWritten, BLESerial::_received);
|
||||
addAttribute(this->_txCharacteristic);
|
||||
addAttribute(this->_txNameDescriptor);
|
||||
}
|
||||
|
||||
void BLESerial::begin(...) {
|
||||
BLEPeripheral::begin();
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.println(F("BLESerial::begin()"));
|
||||
#endif
|
||||
}
|
||||
|
||||
void BLESerial::poll() {
|
||||
if (millis() < this->_flushed + 100) {
|
||||
BLEPeripheral::poll();
|
||||
} else {
|
||||
flush();
|
||||
}
|
||||
}
|
||||
|
||||
void BLESerial::end() {
|
||||
this->_rxCharacteristic.setEventHandler(BLEWritten, NULL);
|
||||
this->_rxHead = this->_rxTail = 0;
|
||||
flush();
|
||||
BLEPeripheral::disconnect();
|
||||
}
|
||||
|
||||
int BLESerial::available(void) {
|
||||
BLEPeripheral::poll();
|
||||
int retval = (this->_rxHead - this->_rxTail + sizeof(this->_rxBuffer)) % sizeof(this->_rxBuffer);
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::available() = "));
|
||||
Serial.println(retval);
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
|
||||
int BLESerial::peek(void) {
|
||||
BLEPeripheral::poll();
|
||||
if (this->_rxTail == this->_rxHead) return -1;
|
||||
uint8_t byte = this->_rxBuffer[this->_rxTail];
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::peek() = "));
|
||||
Serial.print((char) byte);
|
||||
Serial.print(F(" 0x"));
|
||||
Serial.println(byte, HEX);
|
||||
#endif
|
||||
return byte;
|
||||
}
|
||||
|
||||
int BLESerial::read(void) {
|
||||
BLEPeripheral::poll();
|
||||
if (this->_rxTail == this->_rxHead) return -1;
|
||||
this->_rxTail = (this->_rxTail + 1) % sizeof(this->_rxBuffer);
|
||||
uint8_t byte = this->_rxBuffer[this->_rxTail];
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::read() = "));
|
||||
Serial.print((char) byte);
|
||||
Serial.print(F(" 0x"));
|
||||
Serial.println(byte, HEX);
|
||||
#endif
|
||||
return byte;
|
||||
}
|
||||
|
||||
void BLESerial::flush(void) {
|
||||
if (this->_txCount == 0) return;
|
||||
this->_txCharacteristic.setValue(this->_txBuffer, this->_txCount);
|
||||
this->_flushed = millis();
|
||||
this->_txCount = 0;
|
||||
BLEPeripheral::poll();
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.println(F("BLESerial::flush()"));
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t BLESerial::write(uint8_t byte) {
|
||||
BLEPeripheral::poll();
|
||||
if (this->_txCharacteristic.subscribed() == false) return 0;
|
||||
this->_txBuffer[this->_txCount++] = byte;
|
||||
if (this->_txCount == sizeof(this->_txBuffer)) flush();
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::write("));
|
||||
Serial.print((char) byte);
|
||||
Serial.print(F(" 0x"));
|
||||
Serial.print(byte, HEX);
|
||||
Serial.println(F(") = 1"));
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
BLESerial::operator bool() {
|
||||
bool retval = BLEPeripheral::connected();
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::operator bool() = "));
|
||||
Serial.println(retval);
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
|
||||
void BLESerial::_received(const uint8_t* data, size_t size) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
this->_rxHead = (this->_rxHead + 1) % sizeof(this->_rxBuffer);
|
||||
this->_rxBuffer[this->_rxHead] = data[i];
|
||||
}
|
||||
#ifdef BLE_SERIAL_DEBUG
|
||||
Serial.print(F("BLESerial::received("));
|
||||
for (int i = 0; i < size; i++) Serial.print((char) data[i]);
|
||||
Serial.println(F(")"));
|
||||
#endif
|
||||
}
|
||||
|
||||
void BLESerial::_received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic) {
|
||||
BLESerial::_instance->_received(rxCharacteristic.value(), rxCharacteristic.valueLength());
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
#ifndef _BLE_SERIAL_H_
|
||||
#define _BLE_SERIAL_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <BLEPeripheral.h>
|
||||
|
||||
class BLESerial : public BLEPeripheral, public Stream
|
||||
{
|
||||
public:
|
||||
BLESerial(unsigned char req, unsigned char rdy, unsigned char rst);
|
||||
|
||||
void begin(...);
|
||||
void poll();
|
||||
void end();
|
||||
|
||||
virtual int available(void);
|
||||
virtual int peek(void);
|
||||
virtual int read(void);
|
||||
virtual void flush(void);
|
||||
virtual size_t write(uint8_t byte);
|
||||
using Print::write;
|
||||
virtual operator bool();
|
||||
|
||||
private:
|
||||
unsigned long _flushed;
|
||||
static BLESerial* _instance;
|
||||
|
||||
size_t _rxHead;
|
||||
size_t _rxTail;
|
||||
size_t _rxCount() const;
|
||||
uint8_t _rxBuffer[BLE_ATTRIBUTE_MAX_VALUE_LENGTH];
|
||||
size_t _txCount;
|
||||
uint8_t _txBuffer[BLE_ATTRIBUTE_MAX_VALUE_LENGTH];
|
||||
|
||||
BLEService _uartService = BLEService("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
|
||||
BLEDescriptor _uartNameDescriptor = BLEDescriptor("2901", "UART");
|
||||
BLECharacteristic _rxCharacteristic = BLECharacteristic("6E400002-B5A3-F393-E0A9-E50E24DCCA9E", BLEWriteWithoutResponse, BLE_ATTRIBUTE_MAX_VALUE_LENGTH);
|
||||
BLEDescriptor _rxNameDescriptor = BLEDescriptor("2901", "RX - Receive Data (Write)");
|
||||
BLECharacteristic _txCharacteristic = BLECharacteristic("6E400003-B5A3-F393-E0A9-E50E24DCCA9E", BLENotify, BLE_ATTRIBUTE_MAX_VALUE_LENGTH);
|
||||
BLEDescriptor _txNameDescriptor = BLEDescriptor("2901", "TX - Transfer Data (Notify)");
|
||||
|
||||
void _received(const uint8_t* data, size_t size);
|
||||
static void _received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic);
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,192 @@
|
||||
/****************************************************************************
|
||||
* This example was developed by the Hackerspace San Salvador to demonstrate
|
||||
* the simultaneous use of the NeoPixel library and the Bluetooth SoftDevice.
|
||||
* To compile this example you'll need to add support for the NRF52 based
|
||||
* following the instructions at:
|
||||
* https://github.com/sandeepmistry/arduino-nRF5
|
||||
* Or adding the following URL to the board manager URLs on Arduino preferences:
|
||||
* https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json
|
||||
* Then you can install the BLEPeripheral library avaiable at:
|
||||
* https://github.com/sandeepmistry/arduino-BLEPeripheral
|
||||
* To test it, compile this example and use the UART module from the nRF
|
||||
* Toolbox App for Android. Edit the interface and send the characters
|
||||
* 'a' to 'i' to switch the animation.
|
||||
* There is a delay because this example blocks the thread of execution but
|
||||
* the change will be shown after the current animation ends. (This might
|
||||
* take a couple of seconds)
|
||||
* For more info write us at: info _at- teubi.co
|
||||
*/
|
||||
#include <SPI.h>
|
||||
#include <BLEPeripheral.h>
|
||||
#include "BLESerial.h"
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
|
||||
#define PIN 15 // Pin where NeoPixels are connected
|
||||
|
||||
// Declare our NeoPixel strip object:
|
||||
Adafruit_NeoPixel strip(64, PIN, NEO_GRB + NEO_KHZ800);
|
||||
// Argument 1 = Number of pixels in NeoPixel strip
|
||||
// Argument 2 = Arduino pin number (most are valid)
|
||||
// Argument 3 = Pixel type flags, add together as needed:
|
||||
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
||||
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
||||
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
||||
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
||||
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
||||
|
||||
// NEOPIXEL BEST PRACTICES for most reliable operation:
|
||||
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
|
||||
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
|
||||
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
|
||||
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
|
||||
// connect GROUND (-) first, then +, then data.
|
||||
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
|
||||
// a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
|
||||
// (Skipping these may work OK on your workbench but can fail in the field)
|
||||
|
||||
// define pins (varies per shield/board)
|
||||
#define BLE_REQ 10
|
||||
#define BLE_RDY 2
|
||||
#define BLE_RST 9
|
||||
|
||||
// create ble serial instance, see pinouts above
|
||||
BLESerial BLESerial(BLE_REQ, BLE_RDY, BLE_RST);
|
||||
|
||||
uint8_t current_state = 0;
|
||||
uint8_t rgb_values[3];
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.println("Hello World!");
|
||||
// custom services and characteristics can be added as well
|
||||
BLESerial.setLocalName("UART_HS");
|
||||
BLESerial.begin();
|
||||
|
||||
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
||||
strip.show(); // Turn OFF all pixels ASAP
|
||||
|
||||
//pinMode(PIN, OUTPUT);
|
||||
//digitalWrite(PIN, LOW);
|
||||
|
||||
current_state = 'a';
|
||||
}
|
||||
|
||||
void loop() {
|
||||
while(BLESerial.available()) {
|
||||
uint8_t character = BLESerial.read();
|
||||
switch(character) {
|
||||
case 'a':
|
||||
case 'b':
|
||||
case 'c':
|
||||
case 'd':
|
||||
case 'e':
|
||||
case 'f':
|
||||
case 'g':
|
||||
case 'h':
|
||||
current_state = character;
|
||||
break;
|
||||
};
|
||||
}
|
||||
switch(current_state) {
|
||||
case 'a':
|
||||
colorWipe(strip.Color(255, 0, 0), 20); // Red
|
||||
break;
|
||||
case 'b':
|
||||
colorWipe(strip.Color( 0, 255, 0), 20); // Green
|
||||
break;
|
||||
case 'c':
|
||||
colorWipe(strip.Color( 0, 0, 255), 20); // Blue
|
||||
break;
|
||||
case 'd':
|
||||
theaterChase(strip.Color(255, 0, 0), 20); // Red
|
||||
break;
|
||||
case 'e':
|
||||
theaterChase(strip.Color( 0, 255, 0), 20); // Green
|
||||
break;
|
||||
case 'f':
|
||||
theaterChase(strip.Color(255, 0, 255), 20); // Cyan
|
||||
break;
|
||||
case 'g':
|
||||
rainbow(10);
|
||||
break;
|
||||
case 'h':
|
||||
theaterChaseRainbow(20);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Fill strip pixels one after another with a color. Strip is NOT cleared
|
||||
// first; anything there will be covered pixel by pixel. Pass in color
|
||||
// (as a single 'packed' 32-bit value, which you can get by calling
|
||||
// strip.Color(red, green, blue) as shown in the loop() function above),
|
||||
// and a delay time (in milliseconds) between pixels.
|
||||
void colorWipe(uint32_t color, int wait) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
|
||||
strip.show(); // Update strip to match
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
|
||||
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
|
||||
// between frames.
|
||||
void theaterChase(uint32_t color, int wait) {
|
||||
for(int a=0; a<10; a++) { // Repeat 10 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in steps of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
|
||||
void rainbow(int wait) {
|
||||
// Hue of first pixel runs 5 complete loops through the color wheel.
|
||||
// Color wheel has a range of 65536 but it's OK if we roll over, so
|
||||
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
|
||||
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
|
||||
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
// Offset pixel hue by an amount to make one full revolution of the
|
||||
// color wheel (range of 65536) along the length of the strip
|
||||
// (strip.numPixels() steps):
|
||||
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
||||
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
|
||||
// optionally add saturation and value (brightness) (each 0 to 255).
|
||||
// Here we're using just the single-argument hue variant. The result
|
||||
// is passed through strip.gamma32() to provide 'truer' colors
|
||||
// before assigning to each pixel:
|
||||
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
|
||||
void theaterChaseRainbow(int wait) {
|
||||
int firstPixelHue = 0; // First pixel starts at red (hue 0)
|
||||
for(int a=0; a<30; a++) { // Repeat 30 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in increments of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
// hue of pixel 'c' is offset by an amount to make one full
|
||||
// revolution of the color wheel (range 65536) along the length
|
||||
// of the strip (strip.numPixels() steps):
|
||||
int hue = firstPixelHue + c * 65536L / strip.numPixels();
|
||||
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,164 @@
|
||||
// Simple demonstration on using an input device to trigger changes on your
|
||||
// NeoPixels. Wire a momentary push button to connect from ground to a
|
||||
// digital IO pin. When the button is pressed it will change to a new pixel
|
||||
// animation. Initial state has all pixels off -- press the button once to
|
||||
// start the first animation. As written, the button does not interrupt an
|
||||
// animation in-progress, it works only when idle.
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#ifdef __AVR__
|
||||
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
|
||||
#endif
|
||||
|
||||
// Digital IO pin connected to the button. This will be driven with a
|
||||
// pull-up resistor so the switch pulls the pin to ground momentarily.
|
||||
// On a high -> low transition the button press logic will execute.
|
||||
#define BUTTON_PIN 2
|
||||
|
||||
#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.
|
||||
|
||||
#define PIXEL_COUNT 16 // Number of NeoPixels
|
||||
|
||||
// Declare our NeoPixel strip object:
|
||||
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
|
||||
// Argument 1 = Number of pixels in NeoPixel strip
|
||||
// Argument 2 = Arduino pin number (most are valid)
|
||||
// Argument 3 = Pixel type flags, add together as needed:
|
||||
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
||||
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
||||
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
||||
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
||||
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
||||
|
||||
boolean oldState = HIGH;
|
||||
int mode = 0; // Currently-active animation mode, 0-9
|
||||
|
||||
void setup() {
|
||||
pinMode(BUTTON_PIN, INPUT_PULLUP);
|
||||
strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
|
||||
strip.show(); // Initialize all pixels to 'off'
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Get current button state.
|
||||
boolean newState = digitalRead(BUTTON_PIN);
|
||||
|
||||
// Check if state changed from high to low (button press).
|
||||
if((newState == LOW) && (oldState == HIGH)) {
|
||||
// Short delay to debounce button.
|
||||
delay(20);
|
||||
// Check if button is still low after debounce.
|
||||
newState = digitalRead(BUTTON_PIN);
|
||||
if(newState == LOW) { // Yes, still low
|
||||
if(++mode > 8) mode = 0; // Advance to next mode, wrap around after #8
|
||||
switch(mode) { // Start the new animation...
|
||||
case 0:
|
||||
colorWipe(strip.Color( 0, 0, 0), 50); // Black/off
|
||||
break;
|
||||
case 1:
|
||||
colorWipe(strip.Color(255, 0, 0), 50); // Red
|
||||
break;
|
||||
case 2:
|
||||
colorWipe(strip.Color( 0, 255, 0), 50); // Green
|
||||
break;
|
||||
case 3:
|
||||
colorWipe(strip.Color( 0, 0, 255), 50); // Blue
|
||||
break;
|
||||
case 4:
|
||||
theaterChase(strip.Color(127, 127, 127), 50); // White
|
||||
break;
|
||||
case 5:
|
||||
theaterChase(strip.Color(127, 0, 0), 50); // Red
|
||||
break;
|
||||
case 6:
|
||||
theaterChase(strip.Color( 0, 0, 127), 50); // Blue
|
||||
break;
|
||||
case 7:
|
||||
rainbow(10);
|
||||
break;
|
||||
case 8:
|
||||
theaterChaseRainbow(50);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set the last-read button state to the old state.
|
||||
oldState = newState;
|
||||
}
|
||||
|
||||
// Fill strip pixels one after another with a color. Strip is NOT cleared
|
||||
// first; anything there will be covered pixel by pixel. Pass in color
|
||||
// (as a single 'packed' 32-bit value, which you can get by calling
|
||||
// strip.Color(red, green, blue) as shown in the loop() function above),
|
||||
// and a delay time (in milliseconds) between pixels.
|
||||
void colorWipe(uint32_t color, int wait) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
|
||||
strip.show(); // Update strip to match
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
|
||||
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
|
||||
// between frames.
|
||||
void theaterChase(uint32_t color, int wait) {
|
||||
for(int a=0; a<10; a++) { // Repeat 10 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in steps of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
|
||||
void rainbow(int wait) {
|
||||
// Hue of first pixel runs 3 complete loops through the color wheel.
|
||||
// Color wheel has a range of 65536 but it's OK if we roll over, so
|
||||
// just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
|
||||
// means we'll make 3*65536/256 = 768 passes through this outer loop:
|
||||
for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
// Offset pixel hue by an amount to make one full revolution of the
|
||||
// color wheel (range of 65536) along the length of the strip
|
||||
// (strip.numPixels() steps):
|
||||
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
||||
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
|
||||
// optionally add saturation and value (brightness) (each 0 to 255).
|
||||
// Here we're using just the single-argument hue variant. The result
|
||||
// is passed through strip.gamma32() to provide 'truer' colors
|
||||
// before assigning to each pixel:
|
||||
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
|
||||
void theaterChaseRainbow(int wait) {
|
||||
int firstPixelHue = 0; // First pixel starts at red (hue 0)
|
||||
for(int a=0; a<30; a++) { // Repeat 30 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in increments of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
// hue of pixel 'c' is offset by an amount to make one full
|
||||
// revolution of the color wheel (range 65536) along the length
|
||||
// of the strip (strip.numPixels() steps):
|
||||
int hue = firstPixelHue + c * 65536L / strip.numPixels();
|
||||
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
|
||||
}
|
||||
}
|
||||
}
|
50
libraries/Adafruit_NeoPixel/examples/simple/simple.ino
Normal file
50
libraries/Adafruit_NeoPixel/examples/simple/simple.ino
Normal file
@ -0,0 +1,50 @@
|
||||
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
|
||||
// Released under the GPLv3 license to match the rest of the
|
||||
// Adafruit NeoPixel library
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#ifdef __AVR__
|
||||
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
|
||||
#endif
|
||||
|
||||
// Which pin on the Arduino is connected to the NeoPixels?
|
||||
#define PIN 6 // On Trinket or Gemma, suggest changing this to 1
|
||||
|
||||
// How many NeoPixels are attached to the Arduino?
|
||||
#define NUMPIXELS 16 // Popular NeoPixel ring size
|
||||
|
||||
// When setting up the NeoPixel library, we tell it how many pixels,
|
||||
// and which pin to use to send signals. Note that for older NeoPixel
|
||||
// strips you might need to change the third parameter -- see the
|
||||
// strandtest example for more information on possible values.
|
||||
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
|
||||
|
||||
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
|
||||
|
||||
void setup() {
|
||||
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
|
||||
// Any other board, you can remove this part (but no harm leaving it):
|
||||
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
|
||||
clock_prescale_set(clock_div_1);
|
||||
#endif
|
||||
// END of Trinket-specific code.
|
||||
|
||||
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
||||
}
|
||||
|
||||
void loop() {
|
||||
pixels.clear(); // Set all pixel colors to 'off'
|
||||
|
||||
// The first NeoPixel in a strand is #0, second is 1, all the way up
|
||||
// to the count of pixels minus one.
|
||||
for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
|
||||
|
||||
// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
|
||||
// Here we're using a moderately bright green color:
|
||||
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
|
||||
|
||||
pixels.show(); // Send the updated pixel colors to the hardware.
|
||||
|
||||
delay(DELAYVAL); // Pause before next pass through loop
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
|
||||
// Released under the GPLv3 license to match the rest of the
|
||||
// Adafruit NeoPixel library
|
||||
// This sketch shows use of the "new" operator with Adafruit_NeoPixel.
|
||||
// It's helpful if you don't know NeoPixel settings at compile time or
|
||||
// just want to store this settings in EEPROM or a file on an SD card.
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#ifdef __AVR__
|
||||
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
|
||||
#endif
|
||||
|
||||
// Which pin on the Arduino is connected to the NeoPixels?
|
||||
int pin = 6; // On Trinket or Gemma, suggest changing this to 1
|
||||
|
||||
// How many NeoPixels are attached to the Arduino?
|
||||
int numPixels = 16; // Popular NeoPixel ring size
|
||||
|
||||
// NeoPixel color format & data rate. See the strandtest example for
|
||||
// information on possible values.
|
||||
int pixelFormat = NEO_GRB + NEO_KHZ800;
|
||||
|
||||
// Rather than declaring the whole NeoPixel object here, we just create
|
||||
// a pointer for one, which we'll then allocate later...
|
||||
Adafruit_NeoPixel *pixels;
|
||||
|
||||
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
|
||||
|
||||
void setup() {
|
||||
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
|
||||
// Any other board, you can remove this part (but no harm leaving it):
|
||||
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
|
||||
clock_prescale_set(clock_div_1);
|
||||
#endif
|
||||
// END of Trinket-specific code.
|
||||
|
||||
// Right about here is where we could read 'pin', 'numPixels' and/or
|
||||
// 'pixelFormat' from EEPROM or a file on SD or whatever. This is a simple
|
||||
// example and doesn't do that -- those variables are just set to fixed
|
||||
// values at the top of this code -- but this is where it would happen.
|
||||
|
||||
// Then create a new NeoPixel object dynamically with these values:
|
||||
pixels = new Adafruit_NeoPixel(numPixels, pin, pixelFormat);
|
||||
|
||||
// Going forward from here, code works almost identically to any other
|
||||
// NeoPixel example, but instead of the dot operator on function calls
|
||||
// (e.g. pixels.begin()), we instead use pointer indirection (->) like so:
|
||||
pixels->begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
||||
// You'll see more of this in the loop() function below.
|
||||
}
|
||||
|
||||
void loop() {
|
||||
pixels->clear(); // Set all pixel colors to 'off'
|
||||
|
||||
// The first NeoPixel in a strand is #0, second is 1, all the way up
|
||||
// to the count of pixels minus one.
|
||||
for(int i=0; i<numPixels; i++) { // For each pixel...
|
||||
|
||||
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
|
||||
// Here we're using a moderately bright green color:
|
||||
pixels->setPixelColor(i, pixels->Color(0, 150, 0));
|
||||
|
||||
pixels->show(); // Send the updated pixel colors to the hardware.
|
||||
|
||||
delay(DELAYVAL); // Pause before next pass through loop
|
||||
}
|
||||
}
|
147
libraries/Adafruit_NeoPixel/examples/strandtest/strandtest.ino
Normal file
147
libraries/Adafruit_NeoPixel/examples/strandtest/strandtest.ino
Normal file
@ -0,0 +1,147 @@
|
||||
// A basic everyday NeoPixel strip test program.
|
||||
|
||||
// NEOPIXEL BEST PRACTICES for most reliable operation:
|
||||
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
|
||||
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
|
||||
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
|
||||
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
|
||||
// connect GROUND (-) first, then +, then data.
|
||||
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
|
||||
// a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
|
||||
// (Skipping these may work OK on your workbench but can fail in the field)
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#ifdef __AVR__
|
||||
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
|
||||
#endif
|
||||
|
||||
// Which pin on the Arduino is connected to the NeoPixels?
|
||||
// On a Trinket or Gemma we suggest changing this to 1:
|
||||
#define LED_PIN 6
|
||||
|
||||
// How many NeoPixels are attached to the Arduino?
|
||||
#define LED_COUNT 60
|
||||
|
||||
// Declare our NeoPixel strip object:
|
||||
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
|
||||
// Argument 1 = Number of pixels in NeoPixel strip
|
||||
// Argument 2 = Arduino pin number (most are valid)
|
||||
// Argument 3 = Pixel type flags, add together as needed:
|
||||
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
||||
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
||||
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
||||
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
||||
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
||||
|
||||
|
||||
// setup() function -- runs once at startup --------------------------------
|
||||
|
||||
void setup() {
|
||||
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
|
||||
// Any other board, you can remove this part (but no harm leaving it):
|
||||
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
|
||||
clock_prescale_set(clock_div_1);
|
||||
#endif
|
||||
// END of Trinket-specific code.
|
||||
|
||||
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
||||
strip.show(); // Turn OFF all pixels ASAP
|
||||
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
|
||||
}
|
||||
|
||||
|
||||
// loop() function -- runs repeatedly as long as board is on ---------------
|
||||
|
||||
void loop() {
|
||||
// Fill along the length of the strip in various colors...
|
||||
colorWipe(strip.Color(255, 0, 0), 50); // Red
|
||||
colorWipe(strip.Color( 0, 255, 0), 50); // Green
|
||||
colorWipe(strip.Color( 0, 0, 255), 50); // Blue
|
||||
|
||||
// Do a theater marquee effect in various colors...
|
||||
theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
|
||||
theaterChase(strip.Color(127, 0, 0), 50); // Red, half brightness
|
||||
theaterChase(strip.Color( 0, 0, 127), 50); // Blue, half brightness
|
||||
|
||||
rainbow(10); // Flowing rainbow cycle along the whole strip
|
||||
theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
|
||||
}
|
||||
|
||||
|
||||
// Some functions of our own for creating animated effects -----------------
|
||||
|
||||
// Fill strip pixels one after another with a color. Strip is NOT cleared
|
||||
// first; anything there will be covered pixel by pixel. Pass in color
|
||||
// (as a single 'packed' 32-bit value, which you can get by calling
|
||||
// strip.Color(red, green, blue) as shown in the loop() function above),
|
||||
// and a delay time (in milliseconds) between pixels.
|
||||
void colorWipe(uint32_t color, int wait) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
|
||||
strip.show(); // Update strip to match
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
|
||||
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
|
||||
// between frames.
|
||||
void theaterChase(uint32_t color, int wait) {
|
||||
for(int a=0; a<10; a++) { // Repeat 10 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in steps of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
|
||||
void rainbow(int wait) {
|
||||
// Hue of first pixel runs 5 complete loops through the color wheel.
|
||||
// Color wheel has a range of 65536 but it's OK if we roll over, so
|
||||
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
|
||||
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
|
||||
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
|
||||
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
|
||||
// Offset pixel hue by an amount to make one full revolution of the
|
||||
// color wheel (range of 65536) along the length of the strip
|
||||
// (strip.numPixels() steps):
|
||||
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
||||
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
|
||||
// optionally add saturation and value (brightness) (each 0 to 255).
|
||||
// Here we're using just the single-argument hue variant. The result
|
||||
// is passed through strip.gamma32() to provide 'truer' colors
|
||||
// before assigning to each pixel:
|
||||
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
}
|
||||
}
|
||||
|
||||
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
|
||||
void theaterChaseRainbow(int wait) {
|
||||
int firstPixelHue = 0; // First pixel starts at red (hue 0)
|
||||
for(int a=0; a<30; a++) { // Repeat 30 times...
|
||||
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
||||
strip.clear(); // Set all pixels in RAM to 0 (off)
|
||||
// 'c' counts up from 'b' to end of strip in increments of 3...
|
||||
for(int c=b; c<strip.numPixels(); c += 3) {
|
||||
// hue of pixel 'c' is offset by an amount to make one full
|
||||
// revolution of the color wheel (range 65536) along the length
|
||||
// of the strip (strip.numPixels() steps):
|
||||
int hue = firstPixelHue + c * 65536L / strip.numPixels();
|
||||
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
|
||||
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
||||
}
|
||||
strip.show(); // Update strip with new contents
|
||||
delay(wait); // Pause for a moment
|
||||
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user