diff --git a/RiTCh_Lightshow.ino b/RiTCh_Lightshow.ino index c7dbd6c..1e89bf0 100644 --- a/RiTCh_Lightshow.ino +++ b/RiTCh_Lightshow.ino @@ -29,15 +29,22 @@ #define BUTTON_LONG_PRESS 1000 #define MIN_TIME_SWITCH_PRESSED 50 +#define POTI_DEAD_ZONE 3 #define LED_NORMAL_BRIGHTNESS 180 #define LED_PLAY_BRIGHTNESS 20 #define DMX_MAX_CHANNEL 512 #define MAX_VOL_LEVEL 30 #define MAX_DMX_LEVEL 255 #define MAX_DMX_SPOTS 2 +#define DMX_FOG_MACHINE_ADDRESS 100 + +#define DMX_BRIGHTNESS 0 +#define DMX_FADE_TIME 1 +#define DMX_HOLD_TIME 2 +#define DMX_FOG_LEVEL 3 #define MIN_DMX_FADE_TIME 1 -#define MAX_DMX_FADE_TIME 3 +#define MAX_DMX_FADE_TIME 10 #define MIN_DMX_HOLD_TIME 5 #define MAX_DMX_HOLD_TIME 15 @@ -61,6 +68,14 @@ uint32_t button_time[4] = { 0, 0, 0, 0 }; uint8_t poti_level[4] = { 0, 0, 0, 0 }; uint8_t brightness = LED_NORMAL_BRIGHTNESS; +enum { + NORMAL, + WHITE, + OFF +}; +bool fog_state = false; +uint8_t light_state = NORMAL; + typedef struct { uint8_t dmx_type = 4; uint16_t address = 0; @@ -115,7 +130,7 @@ void level_check(void) { for (i = 0; i < 4; i++) { poti_lvl = map(analogRead(poti_pin_by_number(i)), 15, 1023, 0, 255); - if (poti_lvl != poti_level[i]) { + if (poti_lvl < poti_level[i] - POTI_DEAD_ZONE || poti_lvl > poti_level[i] + POTI_DEAD_ZONE) { poti_level[i] = poti_lvl; #ifdef DEBUG Serial.print(F("Poti[")); @@ -133,6 +148,11 @@ void show_led(void) { } void worker(void) { + // DMX auto Fade + + if (light_state != NORMAL) + return; + for (uint8_t s = 0; s < MAX_DMX_SPOTS; s++) { uint8_t diff_counter = 0; @@ -145,7 +165,8 @@ void worker(void) { } if (diff_counter != 0) { // start hold timer - spot[s].steps = random(MIN_DMX_HOLD_TIME, MIN_DMX_HOLD_TIME + ((MAX_DMX_HOLD_TIME - MIN_DMX_HOLD_TIME) * poti_level[2] / 255.0)) * 1000 / WORKER_SCHED; + int8_t start = MIN_DMX_FADE_TIME + MIN_DMX_FADE_TIME * poti_level[1] / 255.0 * 4; + spot[s].steps = random(start, start + ((MAX_DMX_HOLD_TIME - start) * poti_level[DMX_HOLD_TIME] / 255.0)) * 1000 / WORKER_SCHED; #ifdef DEBUG Serial.print(F("Spot ")); Serial.print(s, DEC); @@ -157,9 +178,10 @@ void worker(void) { // new random values RGBConverter color_converter; uint8_t rgb[3]; + int8_t start = MIN_DMX_FADE_TIME + MIN_DMX_FADE_TIME * poti_level[1] / 255.0 * 4; - spot[s].steps = random(MIN_DMX_FADE_TIME, MIN_DMX_FADE_TIME + ((MAX_DMX_FADE_TIME - MIN_DMX_FADE_TIME) * poti_level[1] / 255.0)) * 1000 / WORKER_SCHED; - color_converter.hsvToRgb(random(0, 1024) / 1024.0, random(0, 1024) / 1024.0, random(128, 255) / 255.0, rgb); + spot[s].steps = random(start, start + ((MAX_DMX_FADE_TIME - start) * poti_level[DMX_FADE_TIME] / 255.0)) * 1000 / WORKER_SCHED; + color_converter.hsvToRgb(random(0, 1024) / 1024.0, 1.0, 1.0, rgb); for (uint8_t i = 0; i < 3; i++) spot[s].diff[i] = (rgb[i] - spot[s].values[i]) / spot[s].steps; spot[s].diff[3] = (random(0, 128) - spot[3].values[3]) / 255.0; @@ -174,7 +196,7 @@ void worker(void) { } else { for (uint8_t i = 0; i < spot[s].dmx_type; i++) { spot[s].values[i] += spot[s].diff[i]; - DmxSimple.write(spot[s].address + i, uint8_t(spot[s].values[i] * poti_level[0] / 255.0 + 0.5)); + DmxSimple.write(spot[s].address + i, uint8_t(spot[s].values[i] * poti_level[DMX_BRIGHTNESS] / 255.0 + 0.5)); #ifdef DEBUG /* Serial.print(F("Spot ")); Serial.print(s, DEC); @@ -191,6 +213,28 @@ void worker(void) { } spot[s].steps--; } + + // Fog machine + if (fog_state == true) { + DmxSimple.write(DMX_FOG_MACHINE_ADDRESS, poti_level[DMX_FOG_LEVEL]); + } else { + DmxSimple.write(DMX_FOG_MACHINE_ADDRESS, 0); + } +} + +void test_worker(void) { + uint8_t start = MIN_DMX_FADE_TIME + MIN_DMX_FADE_TIME * poti_level[1] / 255.0 * 4; + uint8_t fade_time = random(start, start + ((MAX_DMX_FADE_TIME - start) * poti_level[1] / 255.0)); + Serial.print("start:"); + Serial.println(start, DEC); + Serial.print("MAX_DMX_FADE_TIME"); + Serial.println(MAX_DMX_FADE_TIME, DEC); + Serial.print("POTI1:"); + Serial.println(poti_level[1], DEC); + Serial.print("POTI1/255:"); + Serial.println(poti_level[1] / 255.0, 3); + Serial.print("Fade-Time:"); + Serial.println(fade_time, DEC); } //-------------------------------------------------------------------------------- @@ -198,25 +242,105 @@ void worker(void) { //-------------------------------------------------------------------------------- void do_level(uint8_t p) { #ifdef DEBUG - Serial.print(F("LEVEL ")); - Serial.println(p); + Serial.print(F("POTI ")); + Serial.print(p); + Serial.print(F(": ")); + Serial.println(poti_level[p]); #endif - DmxSimple.write(1 + p, poti_level[p]); + switch (p) { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: +#ifdef DEBUG + Serial.print(F("Fog: ")); + Serial.print(poti_level[DMX_FOG_LEVEL] / 255.0 * 100.0); + Serial.println(F("%")); +#endif + break; + } } void do_button_long(uint8_t b) { #ifdef DEBUG - Serial.print(F("LONG ")); + Serial.print(F("BUTTON ")); + Serial.print(b); + Serial.println(F(" LONG")); #endif - Serial.println(b); + + switch (b) { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + } } void do_button_short(uint8_t b) { #ifdef DEBUG - Serial.print(F("SHORT ")); + Serial.print(F("BUTTON ")); + Serial.print(b); + Serial.println(F(" SHORT")); #endif - Serial.println(b); + + switch (b) { + case 0: + if (light_state == OFF || light_state == WHITE) { +#ifdef DEBUG + Serial.println(F("Light: NORMAL")); +#endif + light_state = NORMAL; + } else { +#ifdef DEBUG + Serial.println(F("Light: OFF")); +#endif + light_state = OFF; + } + break; + case 1: + if (light_state == OFF || light_state == NORMAL) { +#ifdef DEBUG + Serial.println(F("Light: WHITE")); +#endif + light_state = WHITE; + for (uint8_t s = 0; s < MAX_DMX_SPOTS; s++) { + for (uint8_t i = 0; i < spot[s].dmx_type; i++) + DmxSimple.write(spot[s].address + i, 255); + } + } else { +#ifdef DEBUG + Serial.println(F("Light: OFF")); +#endif + light_state = OFF; + } + break; + case 2: + break; + case 3: + fog_state = !fog_state; +#ifdef DEBUG + if (fog_state) + Serial.println(F("Fog: ON")); + else + Serial.println(F("Fog: OFF")); +#endif + break; + } + + if (light_state == OFF) { + for (uint8_t s = 0; s < MAX_DMX_SPOTS; s++) { + for (uint8_t i = 0; i < spot[s].dmx_type; i++) + DmxSimple.write(spot[s].address + i, 0); + } + } } uint32_t button(byte button_nr) { @@ -288,11 +412,14 @@ void setup() { Serial.begin(9600); #endif + /* #ifdef __AVR_ATmega32U4__ while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } #endif +*/ + #ifdef DEBUG Serial.println(F("")); #endif @@ -360,6 +487,7 @@ void setup() { sched.addJob(level_check, LEVEL_CHECK_SCHED); sched.addJob(worker, WORKER_SCHED); sched.addJob(show_led, LED_SCHED); + //sched.addJob(test_worker, 1000); #ifdef DEBUG Serial.println(F("")); #endif