// Library free version, using HSV --> RGB code not by me //#include < FastLED.h > int light = 0; int oldavg = 0; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { int ss = 20; // sample size for light sensor int average = 0; for (int x = 0; x < ss; x++) { // mapping to correct values average += map(analogRead(0), 0, 1023, 0, 127); delay(3); } average /= ss; //Serial.println(analogRead(0)); //Serial.println(average); if (oldavg == 0) { oldavg = average; } if (abs(oldavg - average) > 1) { Serial.print("Goal: "); Serial.println(average); digitalWrite(13, HIGH); while (oldavg < average) { oldavg += 2; setColor(oldavg); } while (oldavg > average) { oldavg -= 2; setColor(oldavg); } digitalWrite(13, LOW); } } void setColor(int hue) { byte RedLight; byte GreenLight; byte BlueLight; // this is the algorithm to convert from RGB to HSV byte h = hue; byte s = 255; byte v = 60; h = (h * 192) / 256; // 0..191 unsigned int i = h / 32; // We want a value of 0 thru 5 unsigned int f = (h % 32) * 8; // 'fractional' part of 'i' 0..248 in jumps unsigned int sInv = 255 - s; // 0 -> 0xff, 0xff -> 0 unsigned int fInv = 255 - f; // 0 -> 0xff, 0xff -> 0 byte pv = v * sInv / 256; // pv will be in range 0 - 255 byte qv = v * (256 - s * f / 256) / 256; byte tv = v * (256 - s * fInv / 256) / 256; switch (i) { case 0: RedLight = v; GreenLight = tv; BlueLight = pv; break; case 1: RedLight = qv; GreenLight = v; BlueLight = pv; break; case 2: RedLight = pv; GreenLight = v; BlueLight = tv; break; case 3: RedLight = pv; GreenLight = qv; BlueLight = v; break; case 4: RedLight = tv; GreenLight = pv; BlueLight = v; break; case 5: RedLight = v; GreenLight = pv; BlueLight = qv; break; } //CRGB& color = CHSV(average, 255, 255); Serial.print("Hue: "); Serial.print(hue); Serial.print(", RGB : "); Serial.print(RedLight); Serial.print(", "); Serial.print(GreenLight); Serial.print(", "); Serial.println(BlueLight); analogWrite(9, RedLight); analogWrite(10, GreenLight); analogWrite(11, BlueLight); }