Initial git track
commit
acbcee3820
@ -0,0 +1,462 @@
|
||||
#define BUTTON 1
|
||||
#define RED 9
|
||||
#define GREEN 11
|
||||
#define BLUE 13
|
||||
#define LIGHT A0
|
||||
|
||||
//#include <FastLED.h>
|
||||
void setup() {
|
||||
// put your setup code here, to run once:
|
||||
pinMode(RED, INPUT);
|
||||
pinMode(GREEN, INPUT);
|
||||
pinMode(BLUE, INPUT);
|
||||
pinMode(LIGHT, INPUT);
|
||||
pinMode(BUTTON, INPUT);
|
||||
if(digitalRead(BUTTON) == 1) {
|
||||
delay(500); // go to bootloader?
|
||||
}
|
||||
}
|
||||
//bool enable_light = true;
|
||||
void loop() {
|
||||
processInput(); // sets modes and sets up next steps
|
||||
//huetorgb(); // convert from set hue to RGB
|
||||
|
||||
render(); // output to RGB led based on mode and other settings
|
||||
/*bool change_wait = false;
|
||||
if(digitalRead(BUTTON) == 1) {
|
||||
if(enable_light) {
|
||||
enable_light = false;
|
||||
} else {
|
||||
enable_light = true;
|
||||
}
|
||||
change_wait = true;
|
||||
}
|
||||
float sensor_voltage = analogRead(LIGHT) * 5 / 1024.0;
|
||||
// turn lamp on
|
||||
if (sensor_voltage <= 2.5 && enable_light) {
|
||||
pinMode(RED, OUTPUT);
|
||||
pinMode(GREEN, OUTPUT);
|
||||
pinMode(BLUE, OUTPUT);
|
||||
analogWrite(RED, 0xFF);
|
||||
analogWrite(GREEN, 0x90);
|
||||
analogWrite(BLUE, 0x90); */
|
||||
/*for(int i = 0; i < 256; i++) {
|
||||
CRGB color = CHSV(0,0,0);
|
||||
hsv2rgb_rainbow(CHSV(i, 255, 255), color);
|
||||
analogWrite(RED, color.r);
|
||||
analogWrite(GREEN, color.g);
|
||||
analogWrite(BLUE, color.b);
|
||||
}
|
||||
} else { // turn lamp off
|
||||
pinMode(RED, INPUT);
|
||||
pinMode(GREEN, INPUT);
|
||||
pinMode(BLUE, INPUT);
|
||||
}
|
||||
analogWrite(RED, 0xFF);
|
||||
delay(1000);
|
||||
analogWrite(GREEN, 0xFF);
|
||||
delay(1000);
|
||||
analogWrite(BLUE, 0xFF);
|
||||
delay(1000);*/
|
||||
/*delay(50);
|
||||
if(change_wait) {
|
||||
delay(450);
|
||||
}*/
|
||||
}
|
||||
|
||||
int mode = 0;
|
||||
int setmode = 0;
|
||||
// Mode list
|
||||
#define NIGHTLIGHT 0
|
||||
#define MANUALLIGHT 1
|
||||
#define RGBSMOOTH 2
|
||||
#define RGBDEFINED 3
|
||||
#define SETCOLOR 4
|
||||
#define DYNAMICLIGHT 5
|
||||
#define SETTINGSMAIN 6
|
||||
#define SETTINGSMODE 7
|
||||
#define SETTINGSTEMP 8
|
||||
#define SETTINGSCOLOR 9
|
||||
|
||||
int nextsetting = SETTINGSMODE;
|
||||
int yellowness = 0; // for modes 0,1,5, color temperature
|
||||
int red = 0xFF; // for mode 4
|
||||
int green = 0x90;
|
||||
int blue = 0x90;
|
||||
int hue = 0;
|
||||
int sethue = 0;
|
||||
int flickeroffset = 0;
|
||||
bool enabled = true;
|
||||
|
||||
bool oldpress;
|
||||
bool oldpresstime;
|
||||
int sensor = 0;
|
||||
void processInput() {
|
||||
bool press = digitalRead(BUTTON);
|
||||
if (press != oldpress) {
|
||||
// state change
|
||||
if (press) { // suddenly pressed
|
||||
oldpresstime = millis(); // start timer
|
||||
} else {
|
||||
// button just let go, let's do something
|
||||
if (millis() - oldpresstime < 750) {
|
||||
// short press
|
||||
shortpress();
|
||||
} // we don't need to check for longpress because that is handled below
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (press && millis() - oldpresstime > 750) {
|
||||
// button held, but not let go yet
|
||||
longpress();
|
||||
oldpresstime = millis(); // reset timer
|
||||
}
|
||||
}
|
||||
oldpress = press;
|
||||
sensor = (analogRead(LIGHT) * 100) / 1024;
|
||||
}
|
||||
|
||||
void toggle() {
|
||||
if(enabled) {
|
||||
enabled = false;
|
||||
} else {
|
||||
enabled = true;
|
||||
}
|
||||
}
|
||||
void shortpress() {
|
||||
switch(mode) {
|
||||
case NIGHTLIGHT:
|
||||
toggle();
|
||||
break;
|
||||
case MANUALLIGHT:
|
||||
toggle();
|
||||
break;
|
||||
case RGBSMOOTH:
|
||||
toggle();
|
||||
break;
|
||||
case RGBDEFINED:
|
||||
toggle();
|
||||
break;
|
||||
case SETCOLOR:
|
||||
toggle();
|
||||
break;
|
||||
case DYNAMICLIGHT:
|
||||
toggle();
|
||||
break;
|
||||
case SETTINGSMAIN:
|
||||
nextsetting++;
|
||||
if(nextsetting > SETTINGSCOLOR) {
|
||||
nextsetting = SETTINGSMAIN; // 'exit'
|
||||
}
|
||||
flickeroffset = millis() % 750;
|
||||
break;
|
||||
case SETTINGSMODE:
|
||||
nextsetting++;
|
||||
if(nextsetting > DYNAMICLIGHT) {
|
||||
nextsetting = NIGHTLIGHT;
|
||||
}
|
||||
flickeroffset = millis() % 750;
|
||||
break;
|
||||
case SETTINGSTEMP:
|
||||
yellowness += 8;
|
||||
if (yellowness > 128) {
|
||||
yellowness = 0;
|
||||
}
|
||||
break;
|
||||
case SETTINGSCOLOR:
|
||||
hue += 15;
|
||||
if (hue > 255) {
|
||||
hue = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
mode = 0; // in case of impossible mode, return to mode 0
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void longpress() {
|
||||
switch(mode) {
|
||||
case NIGHTLIGHT:
|
||||
mode = SETTINGSMAIN;
|
||||
break;
|
||||
case MANUALLIGHT:
|
||||
mode = SETTINGSMAIN;
|
||||
nextsetting = SETTINGSMODE;
|
||||
break;
|
||||
case RGBSMOOTH:
|
||||
mode = SETTINGSMAIN;
|
||||
nextsetting = SETTINGSMODE;
|
||||
break;
|
||||
case RGBDEFINED:
|
||||
mode = SETTINGSMAIN;
|
||||
nextsetting = SETTINGSMODE;
|
||||
break;
|
||||
case SETCOLOR:
|
||||
mode = SETTINGSMAIN;
|
||||
nextsetting = SETTINGSMODE;
|
||||
break;
|
||||
case DYNAMICLIGHT:
|
||||
mode = SETTINGSMAIN;
|
||||
nextsetting = SETTINGSMODE;
|
||||
break;
|
||||
case SETTINGSMAIN:
|
||||
if(nextsetting == SETTINGSMAIN) {
|
||||
mode = setmode; // exit settings requested, return to set mode
|
||||
} else {
|
||||
mode = nextsetting; // set new mode to the highlighted settings page
|
||||
if (mode == SETTINGSMODE) { // if it's the set mode page, then nextsetting needs to be prepared
|
||||
nextsetting = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SETTINGSMODE:
|
||||
setmode = nextsetting; // save set mode
|
||||
mode = setmode; // and go to it
|
||||
break;
|
||||
case SETTINGSTEMP:
|
||||
// yellowness already set directly
|
||||
mode = setmode; // so we just leave
|
||||
break;
|
||||
case SETTINGSCOLOR:
|
||||
// color already set directly
|
||||
mode = setmode; // so we just leave
|
||||
sethue = hue;
|
||||
break;
|
||||
default:
|
||||
mode = 0; // in case of impossible mode, return to mode 0
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void huetorgb(int tmphue, int tmpsat, int tmpval) {
|
||||
// this is the algorithm to convert from RGB to HSV
|
||||
byte redlight;
|
||||
byte greenlight;
|
||||
byte bluelight;
|
||||
byte h = tmphue;
|
||||
byte s = tmpsat;
|
||||
byte v = tmpval;
|
||||
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;
|
||||
}
|
||||
red = redlight;
|
||||
blue = bluelight;
|
||||
green = greenlight;
|
||||
}
|
||||
//analogWrite(RED, 0xFE);
|
||||
//analogWrite(GREEN, 0x30);
|
||||
//analogWrite(BLUE, 0x10);
|
||||
|
||||
void turnon(int tmpred, int tmpgreen, int tmpblue) {
|
||||
pinMode(RED, OUTPUT);
|
||||
pinMode(GREEN, OUTPUT);
|
||||
pinMode(BLUE, OUTPUT);
|
||||
analogWrite(RED, tmpred);
|
||||
analogWrite(GREEN, tmpgreen);
|
||||
analogWrite(BLUE, tmpblue);
|
||||
}
|
||||
|
||||
void flicker(int tmpred, int tmpgreen, int tmpblue) {
|
||||
if ((millis() + flickeroffset) % 750 > 700) {
|
||||
turnoff();
|
||||
} else {
|
||||
turnon(tmpred, tmpgreen, tmpblue);
|
||||
}
|
||||
}
|
||||
void turnoff() {
|
||||
pinMode(RED, INPUT); // the red pin is also used for programming, so there has to be a state when the pin is set to input
|
||||
pinMode(GREEN, INPUT); // so we make the pins input when the light is off
|
||||
pinMode(BLUE, INPUT);
|
||||
}
|
||||
|
||||
void temperaturize() {
|
||||
|
||||
}
|
||||
|
||||
void render() {
|
||||
switch(mode) {
|
||||
case NIGHTLIGHT:
|
||||
if(enabled) {
|
||||
if(sensor > 50) {
|
||||
huetorgb(35, yellowness, 255); // 35: yellow
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
turnon(red, green, blue);
|
||||
}
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case MANUALLIGHT:
|
||||
if(enabled) {
|
||||
huetorgb(35, yellowness, 255); // 35: yellow
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
turnon(red, green, blue);
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case RGBSMOOTH:
|
||||
if(enabled) {
|
||||
hue ++;
|
||||
if(hue > 255) {
|
||||
hue = 0;
|
||||
}
|
||||
huetorgb(hue, 255, 255);
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
turnon(red, green, blue);
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case RGBDEFINED:
|
||||
if(enabled) {
|
||||
hue ++;
|
||||
if(hue > 255) {
|
||||
hue = 0;
|
||||
}
|
||||
int tmphue = (hue % 25) * 10;
|
||||
huetorgb(tmphue, 255, 255);
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
turnon(red, green, blue);
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case SETCOLOR:
|
||||
if(enabled) {
|
||||
huetorgb(sethue, 255, 255);
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
turnon(red, green, blue);
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case DYNAMICLIGHT:
|
||||
if(enabled) {
|
||||
float brightness = 1.0 - sensor / 100.0;
|
||||
huetorgb(35, yellowness, 255); // 35: yellow
|
||||
red *= brightness;
|
||||
green *= brightness;
|
||||
blue *= brightness;
|
||||
turnon(red, green, blue);
|
||||
} else {
|
||||
turnoff();
|
||||
}
|
||||
break;
|
||||
case SETTINGSMAIN:
|
||||
switch(nextsetting) { // colorize based on selected setting
|
||||
case SETTINGSMODE:
|
||||
flicker(255, 0, 0);
|
||||
break;
|
||||
case SETTINGSTEMP:
|
||||
flicker(0, 255, 0);
|
||||
break;
|
||||
case SETTINGSCOLOR:
|
||||
flicker(0, 0, 255);
|
||||
break;
|
||||
case SETTINGSMAIN:
|
||||
flicker(255, 150, 150);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SETTINGSMODE:
|
||||
switch(nextsetting) { // animate / colorize based on selected mode
|
||||
case NIGHTLIGHT:
|
||||
flicker(255, 150, 150);
|
||||
break;
|
||||
case MANUALLIGHT:
|
||||
flicker(0, 255, 0);
|
||||
break;
|
||||
case RGBSMOOTH:
|
||||
hue += 5;
|
||||
if(hue > 255) {
|
||||
hue = 0;
|
||||
}
|
||||
huetorgb(hue, 255, 255);
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
flicker(red, green, blue);
|
||||
break;
|
||||
case RGBDEFINED:
|
||||
hue += 2;
|
||||
if(hue > 255) {
|
||||
hue = 0;
|
||||
}
|
||||
int tmphue = (hue % 25) * 10;
|
||||
huetorgb(tmphue, 255, 255);
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
flicker(red, green, blue);
|
||||
break;
|
||||
case SETCOLOR:
|
||||
flicker(255, 0, 0);
|
||||
break;
|
||||
case DYNAMICLIGHT:
|
||||
float brightness = 1.0 - (millis() % 1000) / 1000.0;
|
||||
huetorgb(35, yellowness, 255); // 35: yellow
|
||||
red *= brightness;
|
||||
green *= brightness;
|
||||
blue *= brightness;
|
||||
turnon(red, green, blue);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SETTINGSTEMP:
|
||||
huetorgb(35, yellowness, 255); // 35: yellow
|
||||
if (green > 200) green -= 100; // color correction
|
||||
if (blue > 200) blue -= 100;
|
||||
flicker(red, green, blue);
|
||||
break;
|
||||
case SETTINGSCOLOR:
|
||||
huetorgb(hue, 255, 255);
|
||||
flicker(red, green, blue);
|
||||
break;
|
||||
default:
|
||||
mode = 0; // in case of impossible mode, return to mode 0
|
||||
break;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue