#include #include #include #include #include "Adafruit_BLE.h" #include "Adafruit_BluefruitLE_SPI.h" #include "Adafruit_BluefruitLE_UART.h" #if SOFTWARE_SERIAL_AVAILABLE #include #endif #include "BluefruitConfig.h" #define REQUIRE_SERIAL true #define BT_SCAN_MS 200 #define MIN_FIRMWARE "0.7.0" #define FACTORYRESET true #define DIM_FACTOR 80 Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST); void bluetooth_setup(){ if ( !ble.begin(VERBOSE_MODE) ) { Serial.println(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?")); while(1); // halt } if ( FACTORYRESET ) { if ( ! ble.factoryReset() ){ Serial.println(F("Couldn't factory reset")); while(1); // halt } } if ( !ble.isVersionAtLeast(MIN_FIRMWARE) ){ Serial.print(F("Callback requires at least")); Serial.println(F(MIN_FIRMWARE)); while(1); // halt } pinMode(BLUEFRUIT_SPI_IRQ, INPUT_PULLUP); //ble.echo(false); // disable command echo //ble.verbose(false); // disable debug info ble.sendCommandCheckOK(F("AT+GAPDEVNAME=Suit LEDs")); // Change name displayed in bluetooth scans //ble.info(); ble.setConnectCallback(on_connect); ble.setDisconnectCallback(on_disconnect); ble.setBleUartRxCallback(BleUartRX); ble.setMode(BLUEFRUIT_MODE_DATA); } void on_connect(void){ Serial.println(F("Bluetooth Connected")); } void on_disconnect(void){ Serial.println(F("Bluetooth Disconnected")); } void BleUartRX(char data[], uint16_t len){ Serial.print( F("[RX] " ) ); Serial.write(data, len); if (data[0] == 's' && len > 1){ setWait(data, len); } Serial.println(); } uint32_t pack_color(uint8_t r, uint8_t g, uint8_t b) { return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; } uint32_t pack_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { return ((uint32_t)w << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; } class Strip { private: uint8_t pin; uint8_t num_pixels; unsigned long last; uint8_t offset; Adafruit_NeoPixel pixel; public: uint16_t wait; Strip(uint8_t led_pin, uint8_t strip_len) { pin = led_pin; num_pixels = strip_len; wait = 0; last = millis(); offset = 0; pixel = Adafruit_NeoPixel(num_pixels, pin, NEO_GRBW + NEO_KHZ800); } public: void off(){ Serial.println(F("off()")); pixel.begin(); for(uint8_t i=0; i num_pixels - 1){ loc = index + offset - num_pixels; } else { loc = offset + index; } pixel.setPixelColor( loc, pack_color(r/DIM_FACTOR, g/DIM_FACTOR, b/DIM_FACTOR) ); if (index < 24){ // red -> yellow shifting g += 10; } else if (index < 48){ // yellow -> green shifting if (index == 24){ g = 255; } r -= 10; } else if (index < 72){ // green -> cyan shifting if (index == 48){ r = 0; } b += 10; } else if (index < 96){ // cyan -> blue shifting if (index == 72){ b = 255; } g -= 10; } else if (index < 120){ // blue -> magenta shifting if (index == 96){ g = 0; } r += 10; } else { // magenta -> red shifting if (index == 120){ r = 255; } b -= 10; } } pixel.show(); } public: void update(){ unsigned long now = millis(); if (now - wait > last){ last = now; rainbow(); offset += 1; if (offset == num_pixels){ offset = 0; } } } }; volatile Strip strip = Strip(6, 144); void setWait(char data[], uint16_t len){ String wait = ""; for (uint16_t index=1; index= 0 && wait_int < 10000){ strip.wait = wait_int; } } void setup(void) { strip.off(); if (REQUIRE_SERIAL){ while (!Serial); Serial.begin(115200); } bluetooth_setup(); Serial.println(F("Ready")); } void loop(void) { ble.update(BT_SCAN_MS); strip.update(); }