From 909b0dfadedf2c8e9e286c06282afa471ac19948 Mon Sep 17 00:00:00 2001 From: Mary Date: Wed, 11 Dec 2024 23:51:16 +0100 Subject: [PATCH 01/10] Reactive LEDs with fade-in and out, SDVX colors atm --- ChunithmIO/ChunithmIO.ino | 83 ++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/ChunithmIO/ChunithmIO.ino b/ChunithmIO/ChunithmIO.ino index 65631d5..dcbb49f 100644 --- a/ChunithmIO/ChunithmIO.ino +++ b/ChunithmIO/ChunithmIO.ino @@ -6,72 +6,111 @@ CRGB left_leds[NUM_LEDS]; CRGB right_leds[NUM_LEDS]; - +CRGB left_color = CRGB(0,0x7F,0x4F); +CRGB right_color = CRGB(0x7F,0,0x4F); +CRGB left_color_dead = CRGB(0,0x1F,0x0F); +CRGB right_color_dead = CRGB(0x1F,0,0x0F); +bool leDebug = false; void setup() { Keyboard.begin(); FastLED.addLeds(left_leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.addLeds(right_leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(64); delay(1000); - fill_solid(left_leds, NUM_LEDS, CRGB(0x7F,0,0x23)); - fill_solid(right_leds, NUM_LEDS, CRGB(0x7F,0,0x23)); +// fill_solid(right_leds, NUM_LEDS, CRGB(0x7F,0,0x23)); +// fill_solid(left_leds, NUM_LEDS, CRGB(0,0x7F,0x7F)); FastLED.show(); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); - pinMode(11, INPUT_PULLUP); - pinMode(12, INPUT_PULLUP); - pinMode(13, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); + pinMode(15, INPUT_PULLUP); + pinMode(16, INPUT_PULLUP); delay(1000); } void loop() { + // --- input --- if (digitalRead(8) == HIGH) { - Keyboard.press('a'); + if (!leDebug) {Keyboard.press('a');} } else { - Keyboard.release('a'); + if (!leDebug) {Keyboard.release('a');} } - if (digitalRead(11) == HIGH) + if (digitalRead(14) == HIGH) { - Keyboard.press('b'); + if (!leDebug) Keyboard.press('b'); } else { - Keyboard.release('b'); + if (!leDebug) Keyboard.release('b'); } if (digitalRead(9) == HIGH) - { - Keyboard.press('c'); + { + if (!leDebug) Keyboard.press('c'); } else { - Keyboard.release('c'); + if (!leDebug) Keyboard.release('c'); } - if (digitalRead(12) == HIGH) + if (digitalRead(15) == HIGH) { - Keyboard.press('d'); + if (!leDebug) Keyboard.press('d'); } else { - Keyboard.release('d'); + if (!leDebug) Keyboard.release('d'); } if (digitalRead(10) == HIGH) { - Keyboard.press('e'); + if (!leDebug) Keyboard.press('e'); } else { - Keyboard.release('e'); + if (!leDebug) Keyboard.release('e'); } - if (digitalRead(13) == HIGH) + if (digitalRead(16) == HIGH) { - Keyboard.press('f'); + if (!leDebug) Keyboard.press('f'); } else { - Keyboard.release('f'); + if (!leDebug) Keyboard.release('f'); } + +// -- LEDs shenanigans --- + if (digitalRead(8) == HIGH or digitalRead(14) == HIGH){ + left_leds[2] = left_color; + right_leds[2] = right_color; + FastLED.show(); + } + else{ + left_leds[2] = left_color_dead; + right_leds[2] = right_color_dead; + FastLED.show(); + } + + if (digitalRead(9) == HIGH or digitalRead(15) == HIGH){ + left_leds[1] = left_color; + right_leds[1] = right_color; + FastLED.show(); + } + else{ + left_leds[1] = left_color_dead; + right_leds[1] = right_color_dead; + FastLED.show(); + } + + if (digitalRead(10) == HIGH or digitalRead(16) == HIGH){ + left_leds[0] = left_color; + right_leds[0] = right_color; + FastLED.show(); + } + else{ + left_leds[0] = left_color_dead; + right_leds[0] = right_color_dead; + FastLED.show(); + } } From 9c7dd8d14f1870b5501991998a43ed8454d834e6 Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:24:02 +0100 Subject: [PATCH 02/10] Updated readme with lightning, keyboard output and some random generic info, and some formatting --- README.md | 90 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index a261580..9aca691 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,81 @@ -# ChunithmIO +# ChunithmIO Lightning Model -Use a Chunithm control panel on PC +Use a Chunithm control panel on PC! -# Overview +This fork adds reactive lightning to the air towers, and in the future maybe some on-boot preset settings selection. -The Chunithm panel is made of air towers and a touch slider. +Oh and the pinout is slightly changed from the upstream, to work with a Pro Micro board. -## Air towers +## Overview -The air towers are made of 6 photo interrupters and 2 led strips which can be interfaced with an arduino. See `ChunithmIO` for a firmware example which turns them into a keyboard device. +The Chunithm panel is made of air towers and a ground slider. +3 +### Air towers -## Touch slider +The air towers are made of 6 photo interrupters and 2 led strips which can be interfaced with an Arduino. See `ChunithmIO` for a firmware example which turns them into a keyboard device. -The touch slider is an rs232 device and can be connected directly to the PC for native use. This repo contains a python script to help verify correct wiring. See `slidertest` folder readme for more info. +In this example, each sensor responds 1:1 to a key, i.e. when covered, the key is pressed, and when uncovered, the key is released. Going from the bottom to the top the keys are `a`, `b`, `c`, `d`, `e`, `f`. Their keycodes are as follows -# Advanced usage +``` +ir1=0x41 +ir2=0x42 +ir3=0x43 +ir4=0x44 +ir5=0x45 +ir6=0x46 +``` -A better featured PCB is in the works allowing custom light effects, use of the touch slider as an HID compliant touchpad for use with android games, etc... more info coming soon. +As each tower has 3 sensors and 3 emitters, so if you switch sides when wiring them up, the keys will get shuffled into the following order: `b`, `a`, `d`, `c`, `f`, `e`. -# pinout +### Ground Slider -Diagrams coming soon. +The Ground Slider is an RS232 device and can be connected directly to the PC for native use. This repo contains a python script to help verify correct wiring. See `slidertest` folder readme for more info. +It's the best to keep the slider connected to a `COM1` port. -## slider +## Pinout -### YLP-03V (connects into an YLR-03V) +If you are this deep, you will surely be fine without diagrams. Especially since everything is pretty self-explanatory and all pin holes in JST plugs are clearly **numbered**. -This is the power input connector. Goes to a 12V wall PSU. +### Ground Slider -- Yellow is +12V. Goes to wall PSU +12V. -- Black is GND. Goes to wall PSU GND. -- Green is EARTH. Can be left disconnected. +#### YLP-03V (connects into an YLR-03V) -### SMR-04V (connects into an SMP-04V) +This is the power input connector. Goes to a 12V source. You will most likely use a dedicated 12V wall adapter, but you can get creative here (e.g. get a Molex plug or a PD charger and trigger). + +- yellow - +12V +- black - GND +- green - earth (can be left disconnected) + +#### SMR-04V (connects into an SMP-04V) This is the serial input/output connector. Goes to your RS232 adapter. -- White is RX (db9 pin 2) -- Red is TX (db9 pin 3) -- Black is GND (db9 pin 5) +- white (RX) - DB9 pin 2 +- red (TX) - DB9 pin 3 +- black (GND) - DB9 pin 5 + +### Air towers + +#### YLP-15V (connects into an YLR-15V) -## air tower +This is the air strings (sensors) connector. -### YLP-15V (connects into an YLR-15V) +- 1 (red) - to Arduino +5V (may be marked `RAW` on the PCB), +- 2 to 7 (stripped grey) - to the other tower pins 2 to 7, +- 8 to 10 (stripped white) - to the Arduino GPIO 8, 9, and 10 (left tower) or 14, 15, and 16 (right tower), +- 11 and 12 (black) - to Arduino GND, +- 15 (green) - earth (can be left disconnected) -This is the air strings connector +#### YLP-06V (connects into an YLR-06V) -- 1 RED: to arduino +5V. -- 2 to 7 stripped grey: to the other tower pins 2 to 7. -- 8 to 10 stripped white: to the arduino gpio 8 9 10 (left tower) or 11 12 13 (right tower). -- 11 12 black: to arduino GND. -- 15 green: Can be left disconnected. +This is the LED strip connector. Needs a 12V source. Yes, **another 12V** line. But it can be connected in parallel with slider's 12V supply (keeping in mind the wire gauge and the rated power of your 12V source). -### YLP-06V (connects into an YLR-06V) +- yellow - +12V +- striped white - LED data - goes to Arduino GPIO 5 (blue - left tower) or 6 (orange - right tower). +- black GND - goes to power supply GND and Arduino GND (but they are probably common ground anyway) -This is the ledstrip connector. Needs a 12V wall PSU. +The LEDs are WS2811 in RGB order, with 9 LEDs per strip. They are, however, wired such that each WS2811 ID controls a group of 3 actual LEDs, so it's not possible to control each one separately. It comes out to 2 sensors per group of 3 LEDs. -- Yellow is +12V. Goes to wall PSU +12V. -- White with stripes is LED data. Goes to arduino gpio 5 (left tower) or 6 (right tower). -- Black is GND. Goes to wall PSU GND and arduino GND. +## Power considerations -Leds are ws2811 in RGB order, with 9 leds per strip. +According to rough calculations done on the Cons&Stuff Discord server, all LEDs in the whole panel assembly (slider + towers) could draw as much as 18W. However, such situation is highly unlikely, with 15W being suggested to have a reasonable margin already. And on top of that, people's experiences show that a 12W PSUs are fine. \ No newline at end of file From 252eecbd9443648dc51aae75bd21b576429b1824 Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:25:31 +0100 Subject: [PATCH 03/10] Removed commented-out lines, because this is git after all --- ChunithmIO/ChunithmIO.ino | 2 -- 1 file changed, 2 deletions(-) diff --git a/ChunithmIO/ChunithmIO.ino b/ChunithmIO/ChunithmIO.ino index dcbb49f..15abbab 100644 --- a/ChunithmIO/ChunithmIO.ino +++ b/ChunithmIO/ChunithmIO.ino @@ -17,8 +17,6 @@ void setup() { FastLED.addLeds(right_leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(64); delay(1000); -// fill_solid(right_leds, NUM_LEDS, CRGB(0x7F,0,0x23)); -// fill_solid(left_leds, NUM_LEDS, CRGB(0,0x7F,0x7F)); FastLED.show(); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); From 14996bcba87de44077f42504a1dc88dbd505a5a2 Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:26:57 +0100 Subject: [PATCH 04/10] Minimal readme update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9aca691..ec4aa8b 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ The Chunithm panel is made of air towers and a ground slider. 3 ### Air towers -The air towers are made of 6 photo interrupters and 2 led strips which can be interfaced with an Arduino. See `ChunithmIO` for a firmware example which turns them into a keyboard device. +The air towers are made of 6 photo interrupters and 2 LED strips which can be interfaced with an Arduino. See `ChunithmIO` for a firmware example which turns them into a keyboard device. -In this example, each sensor responds 1:1 to a key, i.e. when covered, the key is pressed, and when uncovered, the key is released. Going from the bottom to the top the keys are `a`, `b`, `c`, `d`, `e`, `f`. Their keycodes are as follows +In this example, each IR sensor responds 1:1 to a key, i.e. when covered, the key is pressed, and when uncovered, the key is released. Going from the bottom to the top the keys are `a`, `b`, `c`, `d`, `e`, `f`. Their keycodes are as follows ``` ir1=0x41 From 177ccc3a1f85e698e2f093a4f6b03fed9a84c444 Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:27:18 +0100 Subject: [PATCH 05/10] -3 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec4aa8b..d5095a2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Oh and the pinout is slightly changed from the upstream, to work with a Pro Micr ## Overview The Chunithm panel is made of air towers and a ground slider. -3 + ### Air towers The air towers are made of 6 photo interrupters and 2 LED strips which can be interfaced with an Arduino. See `ChunithmIO` for a firmware example which turns them into a keyboard device. From bb1119852efb0081d0f7e6aa7aaa847d231cdb5b Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:34:26 +0100 Subject: [PATCH 06/10] Added fade-in and fade-out of the lights (they got missing before the first commit) --- ChunithmIO/ChunithmIO.ino | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ChunithmIO/ChunithmIO.ino b/ChunithmIO/ChunithmIO.ino index 15abbab..27ec03c 100644 --- a/ChunithmIO/ChunithmIO.ino +++ b/ChunithmIO/ChunithmIO.ino @@ -8,8 +8,10 @@ CRGB left_leds[NUM_LEDS]; CRGB right_leds[NUM_LEDS]; CRGB left_color = CRGB(0,0x7F,0x4F); CRGB right_color = CRGB(0x7F,0,0x4F); -CRGB left_color_dead = CRGB(0,0x1F,0x0F); +CRGB left_color_dead = CRGB(0,0x03,0x0F); CRGB right_color_dead = CRGB(0x1F,0,0x0F); +int light_up_speed = 10; +int light_down_speed = 2; bool leDebug = false; void setup() { Keyboard.begin(); @@ -28,7 +30,6 @@ void setup() { } void loop() { - // --- input --- if (digitalRead(8) == HIGH) { if (!leDebug) {Keyboard.press('a');} @@ -46,7 +47,7 @@ void loop() { if (!leDebug) Keyboard.release('b'); } if (digitalRead(9) == HIGH) - { + { if (!leDebug) Keyboard.press('c'); } else @@ -78,37 +79,36 @@ void loop() { if (!leDebug) Keyboard.release('f'); } -// -- LEDs shenanigans --- if (digitalRead(8) == HIGH or digitalRead(14) == HIGH){ - left_leds[2] = left_color; - right_leds[2] = right_color; + left_leds[2] = CRGB(constrain(left_leds[2].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[2].b+light_up_speed,left_color_dead.b,left_color.b)); + right_leds[2] = CRGB(constrain(right_leds[2].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[2].b+light_up_speed,right_color_dead.b,right_color.b)); FastLED.show(); } else{ - left_leds[2] = left_color_dead; - right_leds[2] = right_color_dead; + left_leds[2] = CRGB(constrain(left_leds[2].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[2].b-light_down_speed,left_color_dead.b,left_color.b)); + right_leds[2] = CRGB(constrain(right_leds[2].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[2].b-light_down_speed,right_color_dead.b,right_color.b)); FastLED.show(); } if (digitalRead(9) == HIGH or digitalRead(15) == HIGH){ - left_leds[1] = left_color; - right_leds[1] = right_color; + left_leds[1] = CRGB(constrain(left_leds[1].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[1].b+light_up_speed,left_color_dead.b,left_color.b)); + right_leds[1] = CRGB(constrain(right_leds[1].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[1].b+light_up_speed,right_color_dead.b,right_color.b)); FastLED.show(); } else{ - left_leds[1] = left_color_dead; - right_leds[1] = right_color_dead; + left_leds[1] = CRGB(constrain(left_leds[1].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[1].b-light_down_speed,left_color_dead.b,left_color.b)); + right_leds[1] = CRGB(constrain(right_leds[1].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[1].b-light_down_speed,right_color_dead.b,right_color.b)); FastLED.show(); } if (digitalRead(10) == HIGH or digitalRead(16) == HIGH){ - left_leds[0] = left_color; - right_leds[0] = right_color; + left_leds[0] = CRGB(constrain(left_leds[0].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[0].b+light_up_speed,left_color_dead.b,left_color.b)); + right_leds[0] = CRGB(constrain(right_leds[0].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[0].b+light_up_speed,right_color_dead.b,right_color.b)); FastLED.show(); } else{ - left_leds[0] = left_color_dead; - right_leds[0] = right_color_dead; + left_leds[0] = CRGB(constrain(left_leds[0].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[0].b-light_down_speed,left_color_dead.b,left_color.b)); + right_leds[0] = CRGB(constrain(right_leds[0].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[0].b-light_down_speed,right_color_dead.b,right_color.b)); FastLED.show(); } } From 27795fedaa4ad30ea97b5361eec1c77908924141 Mon Sep 17 00:00:00 2001 From: Mary Date: Thu, 12 Dec 2024 01:42:04 +0100 Subject: [PATCH 07/10] the --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d5095a2..a67129e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ As each tower has 3 sensors and 3 emitters, so if you switch sides when wiring t ### Ground Slider The Ground Slider is an RS232 device and can be connected directly to the PC for native use. This repo contains a python script to help verify correct wiring. See `slidertest` folder readme for more info. -It's the best to keep the slider connected to a `COM1` port. +It's the best to keep the slider connected to the `COM1` port. ## Pinout From b9d1662a57941518a9f6abfee837c83fef6f82e8 Mon Sep 17 00:00:00 2001 From: Mary Date: Fri, 13 Dec 2024 22:25:14 +0100 Subject: [PATCH 08/10] Added FastLED version information --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a67129e..29b00a9 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ This fork adds reactive lightning to the air towers, and in the future maybe som Oh and the pinout is slightly changed from the upstream, to work with a Pro Micro board. +> [!WARNING] +> Due to the LED code here being so simple, you **must** have a relatively recent version of the FastLED library installed, otherwise, your air tower LEDs will flicker. I'm not sure which would be the minimum required, but **3.9.4** is proven to work. + ## Overview The Chunithm panel is made of air towers and a ground slider. From 2c75345d4067342f1e127e3747d4340b554c34ca Mon Sep 17 00:00:00 2001 From: Mary Date: Wed, 18 Dec 2024 02:20:48 +0100 Subject: [PATCH 09/10] Added persistent light presets and reaction modes Proper docs and cleanup will come later --- ChunithmIO/ChunithmIO.ino | 291 +++++++++++++++++++++++++++----------- 1 file changed, 208 insertions(+), 83 deletions(-) diff --git a/ChunithmIO/ChunithmIO.ino b/ChunithmIO/ChunithmIO.ino index 27ec03c..2e9780b 100644 --- a/ChunithmIO/ChunithmIO.ino +++ b/ChunithmIO/ChunithmIO.ino @@ -1,114 +1,239 @@ #include #include -#define LEFT_PIN 5 -#define RIGHT_PIN 6 -#define NUM_LEDS 3 +#include + +#define LEFT_PIN 5 +#define RIGHT_PIN 6 +#define NUM_LEDS 3 CRGB left_leds[NUM_LEDS]; CRGB right_leds[NUM_LEDS]; -CRGB left_color = CRGB(0,0x7F,0x4F); -CRGB right_color = CRGB(0x7F,0,0x4F); -CRGB left_color_dead = CRGB(0,0x03,0x0F); -CRGB right_color_dead = CRGB(0x1F,0,0x0F); +CRGB left_color = CRGB::Blue; +CRGB right_color = CRGB::Red; +float dead_color_ratio = 0.15; +CRGB left_color_dead = CRGB::Black; +CRGB right_color_dead = CRGB::Black; int light_up_speed = 10; -int light_down_speed = 2; +int light_down_speed = 3; +byte led_mode = 0; +byte bg_mode = 1; bool leDebug = false; + +void setBackgroundToRatiod() { + CHSV tmp_left_color_dead; + CHSV tmp_right_color_dead; + + tmp_left_color_dead = rgb2hsv_approximate(left_color); + tmp_left_color_dead.v = tmp_left_color_dead.v * dead_color_ratio; + left_color_dead = hsv2rgb_spectrum(tmp_left_color_dead); + + tmp_right_color_dead = rgb2hsv_approximate(right_color); + tmp_right_color_dead.v = tmp_right_color_dead.v * dead_color_ratio; + right_color_dead = hsv2rgb_spectrum(tmp_right_color_dead); +} + +void setBackgroundToBlack() { + left_color_dead = CRGB::Black; + right_color_dead = CRGB::Black; +} + +void setBackgroundToStatic() { + left_color_dead = left_color; + right_color_dead = right_color; +} + +void setLedsToCustom() { +} +void choosePreset(byte predef_led_mode); + void setup() { - Keyboard.begin(); - FastLED.addLeds(left_leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); - FastLED.addLeds(right_leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); - FastLED.setBrightness(64); - delay(1000); - FastLED.show(); - pinMode(8, INPUT_PULLUP); - pinMode(9, INPUT_PULLUP); - pinMode(10, INPUT_PULLUP); - pinMode(14, INPUT_PULLUP); - pinMode(15, INPUT_PULLUP); - pinMode(16, INPUT_PULLUP); - delay(1000); + Keyboard.begin(); + //"service" button + pinMode(3, INPUT_PULLUP); + //sensors + pinMode(8, INPUT_PULLUP); + pinMode(9, INPUT_PULLUP); + pinMode(10, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); + pinMode(15, INPUT_PULLUP); + pinMode(16, INPUT_PULLUP); + + FastLED.addLeds(left_leds, NUM_LEDS).setCorrection(TypicalLEDStrip); + FastLED.addLeds(right_leds, NUM_LEDS).setCorrection(TypicalLEDStrip); + FastLED.setBrightness(96); + delay(1000); + fill_solid(left_leds, NUM_LEDS, CRGB::Red); + fill_solid(right_leds, NUM_LEDS, CRGB::Red); + FastLED.show(); + delay(1000); + fill_solid(left_leds, NUM_LEDS, CRGB::Lime); + fill_solid(right_leds, NUM_LEDS, CRGB::Lime); + FastLED.show(); + delay(1000); + fill_solid(left_leds, NUM_LEDS, CRGB::Blue); + fill_solid(right_leds, NUM_LEDS, CRGB::Blue); + FastLED.show(); + delay(1000); + if (digitalRead(3) == LOW) { + leDebug = !leDebug; + } + EEPROM.get(1, bg_mode); + EEPROM.get(2, led_mode); + choosePreset(led_mode); } -void loop() { - if (digitalRead(8) == HIGH) - { - if (!leDebug) {Keyboard.press('a');} +void choosePreset(byte predef_led_mode = 255) { + if (predef_led_mode == 255) { + led_mode = 0; + if (digitalRead(8)) { bitSet(led_mode, 0); } + if (digitalRead(14)) { bitSet(led_mode, 1); } + if (digitalRead(9)) { bitSet(led_mode, 2); } } - else - { - if (!leDebug) {Keyboard.release('a');} + else{ + led_mode = predef_led_mode; } - if (digitalRead(14) == HIGH) - { - if (!leDebug) Keyboard.press('b'); + + if (digitalRead(10) && !digitalRead(16)) { + bg_mode = 0; + } + if (!digitalRead(10) && digitalRead(16)) { + bg_mode = 1; + } + if (digitalRead(10) && digitalRead(16)) { + bg_mode = 2; + } + + switch (led_mode) { + default: + case 0: + // basic + left_color = CRGB::White; + right_color = CRGB::White; + break; + case 1: + // beat saber + left_color = CRGB::Red; + right_color = CRGB::Blue; + break; + case 2: + // sound voltex + left_color = CRGB::DarkMagenta; + right_color = CRGB::Aqua; + break; + case 3: + // paprykarz + left_color = CRGB::Yellow; + right_color = CRGB::Red; + break; + case 4: + // something reddish + left_color = CRGB::MediumVioletRed; + right_color = CRGB::MediumVioletRed; + break; + case 5: + // something greenish + left_color = CRGB::Lime; + right_color = CRGB::Lime; + break; + case 6: + // something blue-ish + left_color = CRGB::DeepSkyBlue; + right_color = CRGB::DeepSkyBlue; + break; + case 7: + // nothing + left_color = CRGB::Black; + right_color = CRGB::Black; + break; + } + switch (bg_mode) { + default: + case 1: + setBackgroundToRatiod(); + break; + case 0: + setBackgroundToBlack(); + break; + case 2: + setBackgroundToStatic(); + break; + } + updateLeds(); +} + +void updateLeds() { + if (digitalRead(8) == HIGH or digitalRead(14) == HIGH) { + left_leds[2] = CRGB(constrain(left_leds[2].r + light_up_speed, left_color_dead.r, left_color.r), constrain(left_leds[2].g + light_up_speed, left_color_dead.g, left_color.g), constrain(left_leds[2].b + light_up_speed, left_color_dead.b, left_color.b)); + right_leds[2] = CRGB(constrain(right_leds[2].r + light_up_speed, right_color_dead.r, right_color.r), constrain(right_leds[2].g + light_up_speed, right_color_dead.g, right_color.g), constrain(right_leds[2].b + light_up_speed, right_color_dead.b, right_color.b)); + FastLED.show(); + } else { + left_leds[2] = CRGB(constrain(left_leds[2].r - light_down_speed, left_color_dead.r, left_color.r), constrain(left_leds[2].g - light_down_speed, left_color_dead.g, left_color.g), constrain(left_leds[2].b - light_down_speed, left_color_dead.b, left_color.b)); + right_leds[2] = CRGB(constrain(right_leds[2].r - light_down_speed, right_color_dead.r, right_color.r), constrain(right_leds[2].g - light_down_speed, right_color_dead.g, right_color.g), constrain(right_leds[2].b - light_down_speed, right_color_dead.b, right_color.b)); + FastLED.show(); + } + + if (digitalRead(9) == HIGH or digitalRead(15) == HIGH) { + left_leds[1] = CRGB(constrain(left_leds[1].r + light_up_speed, left_color_dead.r, left_color.r), constrain(left_leds[1].g + light_up_speed, left_color_dead.g, left_color.g), constrain(left_leds[1].b + light_up_speed, left_color_dead.b, left_color.b)); + right_leds[1] = CRGB(constrain(right_leds[1].r + light_up_speed, right_color_dead.r, right_color.r), constrain(right_leds[1].g + light_up_speed, right_color_dead.g, right_color.g), constrain(right_leds[1].b + light_up_speed, right_color_dead.b, right_color.b)); + FastLED.show(); + } else { + left_leds[1] = CRGB(constrain(left_leds[1].r - light_down_speed, left_color_dead.r, left_color.r), constrain(left_leds[1].g - light_down_speed, left_color_dead.g, left_color.g), constrain(left_leds[1].b - light_down_speed, left_color_dead.b, left_color.b)); + right_leds[1] = CRGB(constrain(right_leds[1].r - light_down_speed, right_color_dead.r, right_color.r), constrain(right_leds[1].g - light_down_speed, right_color_dead.g, right_color.g), constrain(right_leds[1].b - light_down_speed, right_color_dead.b, right_color.b)); + FastLED.show(); } - else - { + + if (digitalRead(10) == HIGH or digitalRead(16) == HIGH) { + left_leds[0] = CRGB(constrain(left_leds[0].r + light_up_speed, left_color_dead.r, left_color.r), constrain(left_leds[0].g + light_up_speed, left_color_dead.g, left_color.g), constrain(left_leds[0].b + light_up_speed, left_color_dead.b, left_color.b)); + right_leds[0] = CRGB(constrain(right_leds[0].r + light_up_speed, right_color_dead.r, right_color.r), constrain(right_leds[0].g + light_up_speed, right_color_dead.g, right_color.g), constrain(right_leds[0].b + light_up_speed, right_color_dead.b, right_color.b)); + FastLED.show(); + } else { + left_leds[0] = CRGB(constrain(left_leds[0].r - light_down_speed, left_color_dead.r, left_color.r), constrain(left_leds[0].g - light_down_speed, left_color_dead.g, left_color.g), constrain(left_leds[0].b - light_down_speed, left_color_dead.b, left_color.b)); + right_leds[0] = CRGB(constrain(right_leds[0].r - light_down_speed, right_color_dead.r, right_color.r), constrain(right_leds[0].g - light_down_speed, right_color_dead.g, right_color.g), constrain(right_leds[0].b - light_down_speed, right_color_dead.b, right_color.b)); + FastLED.show(); + } +} + + +void loop() { + if (digitalRead(8) == HIGH) { + if (!leDebug) { Keyboard.press('a'); } + } else { + if (!leDebug) { Keyboard.release('a'); } + } + if (digitalRead(14) == HIGH) { + if (!leDebug) Keyboard.press('b'); + } else { if (!leDebug) Keyboard.release('b'); } - if (digitalRead(9) == HIGH) - { + if (digitalRead(9) == HIGH) { if (!leDebug) Keyboard.press('c'); - } - else - { + } else { if (!leDebug) Keyboard.release('c'); } - if (digitalRead(15) == HIGH) - { + if (digitalRead(15) == HIGH) { if (!leDebug) Keyboard.press('d'); - } - else - { + } else { if (!leDebug) Keyboard.release('d'); } - if (digitalRead(10) == HIGH) - { + if (digitalRead(10) == HIGH) { if (!leDebug) Keyboard.press('e'); - } - else - { + } else { if (!leDebug) Keyboard.release('e'); } - if (digitalRead(16) == HIGH) - { + if (digitalRead(16) == HIGH) { if (!leDebug) Keyboard.press('f'); - } - else - { + } else { if (!leDebug) Keyboard.release('f'); - } - - if (digitalRead(8) == HIGH or digitalRead(14) == HIGH){ - left_leds[2] = CRGB(constrain(left_leds[2].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[2].b+light_up_speed,left_color_dead.b,left_color.b)); - right_leds[2] = CRGB(constrain(right_leds[2].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[2].b+light_up_speed,right_color_dead.b,right_color.b)); - FastLED.show(); - } - else{ - left_leds[2] = CRGB(constrain(left_leds[2].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[2].b-light_down_speed,left_color_dead.b,left_color.b)); - right_leds[2] = CRGB(constrain(right_leds[2].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[2].b-light_down_speed,right_color_dead.b,right_color.b)); - FastLED.show(); } - if (digitalRead(9) == HIGH or digitalRead(15) == HIGH){ - left_leds[1] = CRGB(constrain(left_leds[1].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[1].b+light_up_speed,left_color_dead.b,left_color.b)); - right_leds[1] = CRGB(constrain(right_leds[1].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[1].b+light_up_speed,right_color_dead.b,right_color.b)); - FastLED.show(); - } - else{ - left_leds[1] = CRGB(constrain(left_leds[1].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[1].b-light_down_speed,left_color_dead.b,left_color.b)); - right_leds[1] = CRGB(constrain(right_leds[1].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[1].b-light_down_speed,right_color_dead.b,right_color.b)); - FastLED.show(); - } - if (digitalRead(10) == HIGH or digitalRead(16) == HIGH){ - left_leds[0] = CRGB(constrain(left_leds[0].r+light_up_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[0].b+light_up_speed,left_color_dead.b,left_color.b)); - right_leds[0] = CRGB(constrain(right_leds[0].r+light_up_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[0].b+light_up_speed,right_color_dead.b,right_color.b)); - FastLED.show(); - } - else{ - left_leds[0] = CRGB(constrain(left_leds[0].r-light_down_speed,left_color_dead.r,left_color.r), left_color_dead.g, constrain(left_leds[0].b-light_down_speed,left_color_dead.b,left_color.b)); - right_leds[0] = CRGB(constrain(right_leds[0].r-light_down_speed,right_color_dead.r,right_color.r), right_color_dead.g, constrain(right_leds[0].b-light_down_speed,right_color_dead.b,right_color.b)); - FastLED.show(); + updateLeds(); + + while (digitalRead(3) == LOW) { + while (digitalRead(3) == LOW) { + choosePreset(); + } + EEPROM.put(1, bg_mode); + EEPROM.put(2, led_mode); } } From c1fce46bf072f955c1684af6cf1dfcde008a03d9 Mon Sep 17 00:00:00 2001 From: Mary Date: Wed, 18 Dec 2024 02:23:28 +0100 Subject: [PATCH 10/10] Fixed sdvx light preset (swapped left and right) --- ChunithmIO/ChunithmIO.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChunithmIO/ChunithmIO.ino b/ChunithmIO/ChunithmIO.ino index 2e9780b..72ac4bc 100644 --- a/ChunithmIO/ChunithmIO.ino +++ b/ChunithmIO/ChunithmIO.ino @@ -117,8 +117,8 @@ void choosePreset(byte predef_led_mode = 255) { break; case 2: // sound voltex - left_color = CRGB::DarkMagenta; - right_color = CRGB::Aqua; + left_color = CRGB::Aqua; + right_color = CRGB::DarkMagenta; break; case 3: // paprykarz