Implement color wiper
This commit is contained in:
parent
8b3b1ee58b
commit
3f4430a0d9
84
src/src.ino
84
src/src.ino
|
@ -19,9 +19,14 @@
|
||||||
MAX1704 fuelGauge;
|
MAX1704 fuelGauge;
|
||||||
float charge_percent;
|
float charge_percent;
|
||||||
uint8_t brightness;
|
uint8_t brightness;
|
||||||
uint16_t color;
|
uint16_t raw_color;
|
||||||
|
uint8_t color;
|
||||||
bool always_on = false;
|
bool always_on = false;
|
||||||
Adafruit_NeoPixel neopix = Adafruit_NeoPixel(NEO_PIX_NUM, NEO_PIN, NEO_GRB + NEO_KHZ800);
|
Adafruit_NeoPixel neopix = Adafruit_NeoPixel(NEO_PIX_NUM, NEO_PIN, NEO_GRB + NEO_KHZ800);
|
||||||
|
uint8_t rgb[3]; // index 0 = red / index 1 = green / index 2 = blue
|
||||||
|
|
||||||
|
// Various function definitions
|
||||||
|
uint8_t* hsvToRgb(int h, double s, double v); // See end of file for implementation
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
|
@ -61,13 +66,18 @@ void setup() {
|
||||||
void loop() {
|
void loop() {
|
||||||
// Read various values needed
|
// Read various values needed
|
||||||
charge_percent = fuelGauge.stateOfCharge(); // Battery level
|
charge_percent = fuelGauge.stateOfCharge(); // Battery level
|
||||||
brightness = map(analogRead(POT_BRIGHT_PIN), 0, 1023, 0, 255); // Brightness (0-1023) mapped to 0-255
|
brightness = map(analogRead(POT_BRIGHT_PIN), 0, 1024, 0, 255); // Brightness (0-1023) mapped to 0-255
|
||||||
color = analogRead(POT_COLOR_PIN); // Color (0-1023 mapped to color wheel)
|
raw_color = analogRead(POT_COLOR_PIN); // Color (0-1024)
|
||||||
always_on = (digitalRead(BUTTON_CAP_TOGGLE) == HIGH); // Toggle button pressed == ALWAYS ON
|
always_on = (digitalRead(BUTTON_CAP_TOGGLE) == HIGH); // Toggle button pressed == ALWAYS ON
|
||||||
|
|
||||||
|
// Convert raw color value to position on a circle and then use the circle position to figure out color on a color wheel
|
||||||
|
color = map(raw_color, 0, 1024, 0, 360);
|
||||||
|
hsvToRgb(color, 1, 1); // set rgb byte array
|
||||||
|
|
||||||
// NeoPixel related
|
// NeoPixel related
|
||||||
neopix.setPixelColor(0, neopix.Color(255, 255, 255)); // White
|
for (uint8_t i=0; i<NEO_PIX_NUM; i++) {
|
||||||
neopix.setPixelColor(1, neopix.Color(0, 0, 255)); // Blue
|
neopix.setPixelColor(i, neopix.Color(rgb[0], rgb[1], rgb[2]));
|
||||||
|
}
|
||||||
neopix.show();
|
neopix.show();
|
||||||
neopix.setBrightness(brightness);
|
neopix.setBrightness(brightness);
|
||||||
|
|
||||||
|
@ -79,9 +89,71 @@ void loop() {
|
||||||
Serial.println(brightness);
|
Serial.println(brightness);
|
||||||
Serial.print("Color: ");
|
Serial.print("Color: ");
|
||||||
Serial.println(color);
|
Serial.println(color);
|
||||||
|
Serial.print("Red: ");
|
||||||
|
Serial.println(rgb[0]);
|
||||||
|
Serial.print("Green: ");
|
||||||
|
Serial.println(rgb[1]);
|
||||||
|
Serial.print("Blue: ");
|
||||||
|
Serial.println(rgb[2]);
|
||||||
Serial.print("Always on: ");
|
Serial.print("Always on: ");
|
||||||
Serial.println(always_on);
|
Serial.println(always_on);
|
||||||
Serial.println("----------");
|
Serial.println("----------");
|
||||||
delay(1000);
|
delay(250);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert degrees on a circle to color values
|
||||||
|
// http://www.skylark-software.com/2011/01/arduino-notebook-rgb-led-and-color_21.html
|
||||||
|
uint8_t* hsvToRgb(int h, double s, double v) {
|
||||||
|
// Make sure our arguments stay in-range
|
||||||
|
h = max(0, min(360, h));
|
||||||
|
s = max(0, min(1.0, s));
|
||||||
|
v = max(0, min(1.0, v));
|
||||||
|
if(s == 0) {
|
||||||
|
// Achromatic (grey)
|
||||||
|
rgb[0] = rgb[1] = rgb[2] = round(v * 255);
|
||||||
|
return rgb;
|
||||||
|
}
|
||||||
|
double hs = h / 60.0; // sector 0 to 5
|
||||||
|
int i = floor(hs);
|
||||||
|
double f = hs - i; // factorial part of h
|
||||||
|
double p = v * (1 - s);
|
||||||
|
double q = v * (1 - s * f);
|
||||||
|
double t = v * (1 - s * (1 - f));
|
||||||
|
double r, g, b;
|
||||||
|
switch(i) {
|
||||||
|
case 0:
|
||||||
|
r = v;
|
||||||
|
g = t;
|
||||||
|
b = p;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
r = q;
|
||||||
|
g = v;
|
||||||
|
b = p;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
r = p;
|
||||||
|
g = v;
|
||||||
|
b = t;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
r = p;
|
||||||
|
g = q;
|
||||||
|
b = v;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
r = t;
|
||||||
|
g = p;
|
||||||
|
b = v;
|
||||||
|
break;
|
||||||
|
default: // case 5:
|
||||||
|
r = v;
|
||||||
|
g = p;
|
||||||
|
b = q;
|
||||||
|
}
|
||||||
|
rgb[0] = round(r * 255.0);
|
||||||
|
rgb[1] = round(g * 255.0);
|
||||||
|
rgb[2] = round(b * 255.0);
|
||||||
|
return rgb;
|
||||||
|
}
|
||||||
|
|
Reference in a new issue