1
0
Files
suit-leds-arduino/neopixel-keiran.ino
2019-03-15 23:23:31 -04:00

176 lines
4.1 KiB
C++

#include <string.h>
#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_NeoPixel.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#if SOFTWARE_SERIAL_AVAILABLE
#include <SoftwareSerial.h>
#endif
#include "BluefruitConfig.h"
#define BT_SCAN_MS 200
#define MINIMUM_FIRMWARE_VERSION "0.7.0"
#define FACTORYRESET_ENABLE 1
#define DIM_FACTOR 50
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_ENABLE ) {
if ( ! ble.factoryReset() ){
Serial.println(F("Couldn't factory reset"));
while(1); // halt
}
}
if ( !ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) ){
Serial.print(F("Callback requires at least"));
Serial.println(F(MINIMUM_FIRMWARE_VERSION));
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("[BLE UART RX] " ) );
Serial.write(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;
uint16_t wait;
unsigned long last;
uint8_t offset;
Adafruit_NeoPixel pixel;
public:
Strip(uint8_t led_pin, uint8_t strip_len, uint16_t wait_ms) {
pin = led_pin;
num_pixels = strip_len;
wait = wait_ms;
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; i++){
pixel.setPixelColor(i, pack_color(0,0,0));
}
pixel.show();
}
private:
void rainbow(){
uint8_t r = 255;
uint8_t g = 0;
uint8_t b = 0;
pixel.begin();
for (uint8_t index=0; index<num_pixels; index++){
uint8_t loc;
if (offset + index > 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;
}
}
}
};
Strip strip = Strip(6, 144, 100);
void setup(void) {
//strip.off()
while (!Serial); // required for Flora & Micro
Serial.begin(115200);
bluetooth_setup();
Serial.println(F("Ready"));
}
void loop(void) {
ble.update(BT_SCAN_MS);
strip.update();
}