/ Gemma_M0_NeoPixel_Dress / Gemma_M0_NeoPixel_Dress.ino
Gemma_M0_NeoPixel_Dress.ino
1 // SPDX-FileCopyrightText: 2021 Irete Hamdani for Adafruit Industries 2 // 3 // SPDX-License-Identifier: MIT 4 // 5 #include <FastLED.h> 6 #include <Wire.h> 7 #include "Adafruit_TCS34725.h" 8 9 #define DATA_PIN 1 10 #define LED_TYPE WS2812B 11 #define COLOR_ORDER GRB 12 #define NUM_LEDS 180 // Change this to reflect the number of LEDs you have 13 #define BRIGHTNESS 255 // Set Brightness here 255 14 15 CRGB leds[NUM_LEDS]; 16 17 // color sensor 18 // our RGB -> eye-recognized gamma color 19 byte gammatable[256]; 20 //used to store color sensor received color 21 uint16_t clear, red, green, blue; 22 23 // color sensor 24 Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); 25 26 void setup() { 27 delay(3000); // 3 second delay for recovery 28 29 // tell FastLED about the LED strip configuration 30 FastLED.addLeds<LED_TYPE,DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS) 31 .setCorrection(TypicalLEDStrip) // cpt-city palettes have different color balance 32 .setDither(BRIGHTNESS < 255); 33 34 // set master brightness control 35 FastLED.setBrightness(BRIGHTNESS); 36 37 tcs.begin(); 38 39 // helps convert RGB colors to what humans see 40 for (int i=0; i<256; i++) { 41 float x = i; 42 x /= 255; 43 x = pow(x, 2.5); 44 x *= 255; 45 46 gammatable[i] = x; 47 } 48 49 for (int i=0; i<3; i++){ //this sequence flashes the first pixel three times none/white as a countdown to the color reading. 50 leds[16] = CRGB::Black; 51 FastLED.show(); 52 delay(1000); 53 leds[16] = CRGB::White; 54 FastLED.show(); 55 delay(500); 56 } 57 58 // turn on LED 59 tcs.setInterrupt(false); 60 delay(60); // takes 50ms to read 61 62 tcs.getRawData(&red, &green, &blue, &clear); 63 64 tcs.setInterrupt(true); // turn off LED 65 } 66 67 void loop() 68 { 69 // Figure out some basic hex code for visualization 70 uint32_t sum = red; 71 sum += green; 72 sum += blue; 73 //sum += clear; // clear contains RGB already so no need to re-add it 74 75 float r, g, b; 76 r = red; r /= sum; 77 g = green; g /= sum; 78 b = blue; b /= sum; 79 r *= 256; g *= 256; b *= 256; 80 81 CRGBPalette16 gTargetPalette ( 82 CRGB (gammatable[(int)r], gammatable[(int)g], gammatable[(int)b])); 83 84 colorwaves( leds, NUM_LEDS, gTargetPalette);//gCurrentPalette); 85 86 FastLED.show(); 87 FastLED.delay(20); 88 } 89 90 // This function draws color waves with an ever-changing, 91 // widely-varying set of parameters, using a color palette. 92 void colorwaves( CRGB* ledarray, uint16_t numleds, CRGBPalette16& palette) 93 { 94 static uint16_t sPseudotime = 0; 95 static uint16_t sLastMillis = 0; 96 static uint16_t sHue16 = 0; 97 98 uint8_t sat8 = beatsin88( 87, 220, 250); 99 uint8_t brightdepth = beatsin88( 341, 96, 224); 100 uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256)); 101 uint8_t msmultiplier = beat8(147); //beatsin88(147, 23, 60); - creates a more dynamic pattern [IH] 102 103 uint16_t hue16 = sHue16;//gHue * 256; 104 uint16_t hueinc16 = beatsin88(113, 300, 1500); 105 106 uint16_t ms = millis(); 107 uint16_t deltams = ms - sLastMillis ; 108 sLastMillis = ms; 109 sPseudotime += deltams * msmultiplier; 110 sHue16 += deltams * beatsin88( 400, 5,9); 111 uint16_t brightnesstheta16 = sPseudotime; 112 113 for( uint16_t i = 0 ; i < numleds; i++) { 114 hue16 += hueinc16; 115 uint8_t hue8 = hue16 / 256; 116 uint16_t h16_128 = hue16 >> 7; 117 if( h16_128 & 0x100) { 118 hue8 = 255 - (h16_128 >> 1); 119 } else { 120 hue8 = h16_128 >> 1; 121 } 122 123 brightnesstheta16 += brightnessthetainc16; 124 uint16_t b16 = sin16( brightnesstheta16 ) + 32768; 125 126 uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536; 127 uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536; 128 bri8 += (255 - brightdepth); 129 130 uint8_t index = hue8; 131 //index = triwave8( index); 132 index = scale8( index, 240); 133 134 CRGB newcolor = ColorFromPalette( palette, index, bri8); 135 136 uint16_t pixelnumber = i; 137 pixelnumber = (numleds-1) - pixelnumber; 138 139 nblend( ledarray[pixelnumber], newcolor, 128); 140 } 141 }