//---<include>---------------------------------------------------------------------------------------------------------------------------
//acceleration:
#include "A_acceleration.h"
A_acceleration Accelerometer;
double acceleration;
//NeoPixels
#include <Adafruit_NeoPixel.h>
#define PIN 33
int NUMPIXELS = 144;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//WiFi
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
//---<define_ButtonPINS>-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//normale Taster
#define BTN_MENU 13
#define BTN_ON 4
#define BTN_CH 0
#define BTN_BP 2
#define BTN_MELT 15
//Potis
#define crystalPOTI 35
//---<ctrl_Variables>-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String saberMode = "Lightsaber"; //MP3-Player; Taschenlampe; Lightsaber
String saberState = "SETUP"; //kontrolliert allgemein was es gerade macht
String saberSoundMODE; //kontrolliert was mit den sounds gemacht werden soll ->kein Sound|normaler Sound (evt auch ohne smoothswing machen!)|Musik (wenn 3 MP3-plaer reingehen dann auch gleichzeitig!)
// -> um jeden sound command drum rum
String interruptState;
boolean bladeON = false;
boolean WiFiMODE = true; //!!!!!!!!!!
char lightningParryCtrl = 'f';
char meltCtrl = 'f';
char tipDragCtrl = 'f'; //f bedeutet false, bedeutet, dass der Saberstate vorher nicht melt oder tipDrag war!
//---<system_Interne_Variablen>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//WiFi:
const char* ssid = "vyzecSabers";
const char* password = "HelloThere!";
AsyncWebServer server(80);
//Timer:
unsigned long currentMillis = millis();
unsigned long previousMillis = 0;
unsigned long debounce_currentMillis = millis();
unsigned long debounce_previousMillis = 0;
//Buttons:
/**/int shortPress = 180;
int debounceTime = 150;
String menu_btnState = "high";
String bP_btnState = "high";
String melt_btnState = "high";
int menu_btnCounter = -1;
/**/int menu_btnTime = 1000;
//potentiometer:
int crystal_potiVal;
//DELAY:
int DELAY_VAL = 10;
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-NEOPIXEL->>>=======================================================================================================================================================================================================================
/**/int startLength = 15;
/*!!!*/int L_modifiers_color_R = 250;
/*!!!*/int L_modifiers_color_G = 112;//112;//70
/*!!!*/int L_modifiers_color_B = 0;
int L_modifiers_Color_R = L_modifiers_color_R;
int L_modifiers_Color_G = L_modifiers_color_G;
int L_modifiers_Color_B = L_modifiers_color_B;
/*!!!*/int L_modifiers_blinkColor_R = 255;
/*!!!*/int L_modifiers_blinkColor_G = 170;
/*!!!*/int L_modifiers_blinkColor_B = 130;
/*!!!*/int L_modifiers_meltColor_R = 255;
/*!!!*/int L_modifiers_meltColor_G = 170;
/*!!!*/int L_modifiers_meltColor_B = 130;
volatile int bC_fadeBuffer_R[101]; //bC = blinkColor
volatile int bC_fadeBuffer_G[101]; //Feld fĂĽr Fadestufen zwischen R und blinkColorR
volatile int bC_fadeBuffer_B[101];
//---<driveOut>--------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String driveOut_animation = "default"; //"slowGlow"
/*!!!*/int driveOut_Speed = 8;
/*!!!*/int driveOut_Steps = 2;
//slowGlow:
/*!*/int slowGlow_color_R = 0;//0;
/*!*/int slowGlow_color_G = 0;//0;
/*!*/int slowGlow_color_B = 250;//250;
/*!*/int slowGlow_color_Rx = 0;//0;
/*!*/int slowGlow_color_Gx = 0;
/*!*/int slowGlow_color_Bx = 220;//220;
/**/int startSpeed = 5;
/**/int rdmPixelCount = 3;
//---<driveIn>--------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String driveIn_animation = "default";
/*!!!*/int driveIn_Speed = 8;
/*!!!*/int driveIn_Steps = 2;
//---<crystal>--------------------------------------------------------------------------------------------------------------------------------------------------
//stripes:
/*!!!*/int L_modifiers_blinkColor_R2 = 100; //Farbe der Stripes
/*!!!*/int L_modifiers_blinkColor_G2 = 45;//45;
/*!!!*/int L_modifiers_blinkColor_B2 = 0;
volatile int fadeBuffer_R[101]; //Felder in denen Fade-Stufen zwischen R und R2 z.B gespeichert werden, damit sie nicht immer nue berechnet werden mĂĽssen
volatile int fadeBuffer_G[101];
volatile int fadeBuffer_B[101];
int stripes[180];//x, y, ctrlPin, z
/**/int crystalStripesSetup_x1 = 13;
/**/int crystalStripesSetup_x2 = 13;
/**/int crystalStripesSetup_y1 = 7;
/**/int crystalStripesSetup_y2 = 7;
/**/int crystalStripesSetup_z1 = 12;
/**/int crystalStripesSetup_z2 = 12;
/**/int crystalStripesSetup_additionalStripes = 120;
/*!!!*/int crystal_stripeSpeed = +2;
/**/int crystal_fadeBrightness1 = 180;
/**/int crystal_fadeBrightness2 = 230;
/**/int crystal_wholeFadeSteps = 10;
//whole:
/*!!!*/int stripeBrightness = 255;
int fadeBrightness;
int wholeCounter = 0;
String wholeState = "new";
int fadeSpeed1;
int fadeSpeed2;
//---<blasterProtect>---------------------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String blasterProtect_animation = "default";
/**/int blasterProtect_posMIN =30;
/**/int blasterProtect_posMAX =110;
/**/int blasterProtect_xMIN =5;
/**/int blasterProtect_xMAX =15;
/**/int blasterProtect_yMIN =5;
/**/int blasterProtect_yMAX =15;
/**/int blasterProtect_fadeSteps =3;
/**/int blasterProtect_brightness =100;
/**/boolean blasterProtect_flash = true;
//default:
int bP_ctrlPin;
String bP_displayState = "new";
int bP_Counter = 0;
int bP_x;
int bP_y;
//---<clash>--------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String clash_animation = "clash_precise";
String clashState = "new";
//precise:
/**/int clash_precise_animation = 4;
/**/int clash_precise_groesseMIN = 3;
/**/int clash_precise_groesseMAX = 7;
/**/int clash_precise_fadeSteps = 3;
/**/boolean clash_precise_delay = false;
int clash_precise_size;
//---<clashHold>--------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String clashHold_animation = "default";
/*!!!*/String clashHold_fadeOut_animation = "default";
//default:
/**/int clashHold_default_brightnessMIN = 60;
/**/int clashHold_default_brightnessMAX = 150;
/**/int clashHold_default_pixlBright = 1.5;
/**/int clashHold_default_pixlAnzahl = 15;
//--fadeOut:
//default:
/**/int clashHold_fadeOut_default_Steps = 2;
//---<lightningParry>--------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String lightningParry_animation = "default";
String lightningParryState = "new";
int lightningParry_stripeAnzahl = 0;
int lightningParry_Count = 0;
int lightningParry_data[101];
//kommentar für mich: bei der funktion sobald sie gestartet wird zufällig position und anzahl der einzelnen Streifen anlegen im Feld (-> einsteööbar durch Übergabepararmeter)
//---<tipDrag>---------------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String tipDrag_animation = "default";
/*!!!*/String tipDrag_fadeOut_animation = "default";
/*!!!*/int tipDrag_crossingColor_R = 230;
/*!!!*/int tipDrag_crossingColor_G = 20;
/*!!!*/int tipDrag_crossingColor_B = 0;
String tipDrag_state = "new";
int tipDrag_xLength;
int tipDrag_yLength;
int tipDrag_zLength;
/*!!!*/int tipDrag_x_Length = 15;
/**/int tipDrag_y_Length = 2;
/**/int tipDrag_z_Length = 2;
/**/int tipDrag_fadeIn_Out_Steps = 3;
//default:
int tipDrag_deault_counter = 0;
//---<melt>------------------------------------------------------------------------------------------------------------------------------------------------------------
/*!!!*/String melt_animation = "default";
/*!!!*/String melt_fadeOut_animation = "default";
/*!!!*/int melt_meltColor_R = 255;//255
/*!!!*/int melt_meltColor_G = 60;//180
/*!!!*/int melt_meltColor_B = 0;//120
/*!!!*/int melt_meltColor_R2 = 190;//135
/*!!!*/int melt_meltColor_G2 = 10;//36
/*!!!*/int melt_meltColor_B2 = 0;//0
/*!!!*/int melt_crossingColor_R = 230;
/*!!!*/int melt_crossingColor_G = 20;
/*!!!*/int melt_crossingColor_B = 0;
String melt_state = "new";
int melt_xLength;
int melt_yLength;
int melt_zLength;
/*!!!*/int melt_x_Length = 120; //"geschmolzenes"
/**/int melt_y_Length = 3; //crossingColor-abschnitt (zwischen normaler Klinge und dem "geschmolzenen")
/**/int melt_z_Length = 2; //fade
/**/int melt_fadeIn_Out_Steps = 3;
//default:
int melt_deault_counter = 0;
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-FUNCTIONS [preset]->>>=======================================================================================================================================================================================================================
/*
void saber_driveOut(String animation){}
void saber_driveIn(String animation){}
void crystal(int stripeSpeed, int fadeBrightness1, int fadeBrightness2, int wholeFadeSteps){}
void saber_blasterProtect(String animation, int posMIN, int posMAX, int xMIN, int xMAX, int yMIN, int yMAX, int fadeSteps, int brightness, boolean flash){}
void saber_lightningParry(String animation){}
void saber_clash(String animation){}
void saber_clashHold(String animation, String fadeOut_animation){}
void saber_tipDrag(String animation, String fadeOut_animation){}
void saber_melt(String animation, String fadeOut_animation){}
int calculateColorVal(int xcolorOld, int xcolorNew, int xproportion, int xpropFact){}
void fadeWhole(int newBrightnessMIN, int newBrightnessMAX, int fadeSpeedMIN, int fadeSpeedMAX, int fadeSpeedMIN2, int fadeSpeedMAX2, int Steps, boolean sD){}
void displayStripes(int brightness){}
void moveStripes(int bewegungsfaktor){}
void newStripe(int xctrlPin, int x, int y, int delaySideSpan, float brightness){}
void loadBuffer(char xbufferSelection, int xcolorOld, int xcolorNew, boolean showDebug){}
void loadBufferRGB(int xcolorOldR, int xcolorOldG, int xcolorOldB, int xcolorNewR, int xcolorNewG, int xcolorNewB, boolean sD){}
void crystalStripesSetup(int xa, int xb, int ya, int yb, int za, int zb, int additionalStripes, boolean sD){}
void blasterProtect(int posMIN, int posMAX, int xMIN, int xMAX, int yMIN, int yMAX, int fadeSteps, int brightness, boolean flash, int delaySideSpan){}
void bC_newStripe(int xctrlPin, int x, int y, int delaySideSpan, float brightness){}
void bC_loadBuffer(char xbufferSelection, int xcolorOld, int xcolorNew, boolean showDebug){}
void bC_loadBufferRGB(int xcolorOldR, int xcolorOldG, int xcolorOldB, int xcolorNewR, int xcolorNewG, int xcolorNewB, boolean sD){}
void clash_precise(boolean delaySideSpan, int fadeSteps){}
void clash_precise_XS(int delaySidespan, int fadeSpeps){}
void clash_precise_S(int delaySidespan, int fadeSpeps){}
void clash_precise_M(int delaySidespan, int fadeSpeps){}
void clash_precise_L(int delaySidespan, int fadeSpeps){}
void clash_precise_XL(int delaySidespan, int fadeSpeps){}
void clash_precise_XXL(int delaySidespan, int fadeSpeps){}
void clash_precise_XXXL(int delaySidespan, int fadeSpeps){}
void clashHold_default(int brMIN, int brMAX, float pixlBright, int pixlAnzahl){}
void clashHold_default_fadeOut(int steps){}
void lightningParry_default(int anzahlMIN,int anzahlMAX, int xMIN,int xMAX, int yMIN,int yMAX, int xMinMIN,int xMinMAX, int xMaxMIN,int xMaxMAX){}
void lightningParry_default_displayStripes(int xBrightness){}
void lightningParry_default_fadeOut(int xMinMIN,int xMinMAX, int xMaxMIN,int xMaxMAX){}
void tipDrag_default(int xLength, int yLength, int zLength, int xfadeIn_Out_Steps){}
void tipDrag_default_stop(int xfadeIn_Out_Steps){}
void melt_default(int xLength, int yLength, int zLength, int xfadeIn_Out_Steps){}
void melt_default_stop(int xfadeIn_Out_Steps){}
void driveOut_default(int Speed, int Steps){}
void driveOut_slowGlow(int startLength, int startSpeed, int rdmPixelCount, int Speed, int Steps){}
void slowGlow_rdm_pixels(int startLengthX){}
void driveIn_default(int Speed, int Steps){}
void btnSetup(){}
void interrupt_on(){}
void interrupt_cH(){}
void interrupt_bP(){}
void interrupt_melt(){}
void interrupt_menu(){}
void checkBTNmenu(){}
void checkBTNmenu_counting(){}
void checkBTNblasterProtect(){}
void checkBTNmelt(){}
void lightsaberSetup(){}
void startTimer(){}
unsigned long stopTimer(){}
void debounce_startTimer(){}
unsigned long debounce_stopTimer(){}
*/
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-WIFI-SERVER->>>=======================================================================================================================================================================================================================
//---<HTML>--------------------------------------------------------------------------------------------------------------------------------------------------------
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a class="active" href="/index.html">Home</a>
<a href="/instructions.html">Instructions</a>
<a href="/about.html">About</a>
<a href="/edit.html">Edit</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<h1>vyzecSaber</h1>
<script>
//put post & get requests here!
</script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char instructions_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a class="active" href="/instructions.html">Instructions</a>
<a href="/about.html">About</a>
<a href="/edit.html">Edit</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<section>
<!--=== Links zu den einzelnen Profilen ====================================================================================================================================================================================================================================================================================-->
<a
href="https://www.youtube.com/watch?v=kYtGl1dX5qI&list=RDGMEMQ1dJ7wXfLlqCjwV0xfSNbAVMNFNQEPcgsmA&index=4"
>
<button class="splitBtn">Turorials on YouTube</button></a
>
<div class="dropdown">
<button
class="splitBtn"
style="border-left: 3px solid #0d8bf2"
></button>
<div class="dropdown-content">
<a href="#">How to: getting started</a>
<a href="#">How to: advanced saber settings</a>
<a href="#">How to: repair & change parts</a>
<a href="#">How to: write own code 4 it</a>
</div>
</div>
</section>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char about_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a href="/instructions.html"">Instructions</a>
<a class="active" href="/about.html">About</a>
<a href="/edit.html">Edit</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<h1>The Saber & parts:</h1>
<p>processor: ESP32-DevKit-C</p>
<h2>sensors:</h2>
<p>acceleration: MPU6050</p>
<p>settings: 2x 10k potentiometer</p>
<h2>sound:</h2>
<p>speaker: MPU6050</p>
<p>playing sound: DF-PlayerMini</p>
<h2>hilt:</h2>
<br>
<h1>Time & coder:</h1>
<p>project started: 24.7.2021</p>
<p>project completed: -||-</p>
<br>
<h1>The Code:</h1>
<p></p>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char edit_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a href="/instructions.html">Instructions</a>
<a href="/about.html">About</a>
<a class="active" href="/edit.html">Edit</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<section>
<!--=== Links zu den einzelnen Profilen ====================================================================================================================================================================================================================================================================================-->
<a
href="e_profile1.html"
>
<button class="splitBtn">Profile 1</button></a
>
<div class="dropdown">
<button
class="splitBtn"
style="border-left: 3px solid #0d8bf2"
></button>
<div class="dropdown-content">
<a href="e_profile1_sound.html">Sound</a>
<a href="e_profile1_crystal.html">Crystal</a>
</div>
</div>
</section>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char e_profile1_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a href="/edit.html">>>Edit</a>
<a class = "active" href="/e_profile1.html">Profile 1</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<h2>current Profile-Settings:</h2>
<p>display variables here!</p>
<section>
<!--=== Links zu den einzelnen Einstellungs-Seiten ====================================================================================================================================================================================================================================================================================-->
<a
href="e_profile1_sound.html"
>
<button class="splitBtn">Sound-Settings</button></a
>
</section>
<section>
<!--=== Links zu den einzelnen Einstellungs-Seiten ====================================================================================================================================================================================================================================================================================-->
<a
href="e_profile1_crystal.html"
>
<button class="splitBtn">Crystal-Settings</button></a
>
</section>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char e_profile1_crystal_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a href="/edit.html">>>Edit</a>
<a href="/e_profile1.html">>>Profile 1</a>
<a class = "active" href="/e_profile1_crystal.html">Crystal Settings</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<h2>current Crystal-Settings:</h2>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
const char e_profile1_sound_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Saber-Settings</title>
</head>
<style>
/**/
/*=== topNav ===========================================================================================================================================================================================================================================-->*/
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.topnav {
overflow: hidden;
background-color: #333;
}
.topnav a {
float: left;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.topnav a.active {
background-color: dodgerblue;
color: white;
}
/*=== scrollToTop_btn ========================================================================================================================================================================================================================================================================================*/
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
#scrollToTop_btn {
display: none;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border-color: rgb(30, 165, 255);
border-width: 2px;
border-radius: 17px;
outline: none;
background-color: rgba(30, 143, 255, 0.301);
color: rgb(0, 0, 0);
cursor: pointer;
padding: 15px;
}
#scrollToTop_btn:hover {
background-color: dodgerblue;
}
/*=== splitBtn ========================================================================================================================================================================================================================================================================================*/
.splitBtn {
background-color: #2196f3;
color: white;
padding: 16px;
font-size: 16px;
border: none;
outline: none;
height: 52px;
}
.dropdown {
position: absolute;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.dropdown:hover .dropdown-content {
display: block;
}
.splitBtn:hover,
.dropdown:hover .splitBtn {
background-color: #0b7dda;
}
</style>
<body>
<header>
<!--=== topNav ===========================================================================================================================================================================================================================================-->
<div class="topnav">
<a href="/index.html">Home</a>
<a href="/edit.html">>>Edit</a>
<a href="/e_profile1.html">>>Profile 1</a>
<a class = "active" href="/e_profile1_sound.html">Sound Settings</a>
</div>
</header>
<!--=== scrollToTop_btn ====================================================================================================================================================================================================================================================================================-->
<button onclick="topFunction()" id="scrollToTop_btn" title="Go to top">
Top
</button>
<h2>current Sound-Settings:</h2>
<script></script>
<script>
//to make the website work smoothly
//=== scrollToTop_btn =====================================================================================================================================================================================
var mybutton = document.getElementById("scrollToTop_btn");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
</body>
</html>
)rawliteral";
//---<processor>--------------------------------------------------------------------------------------------------------------------------------------------------------
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-SETUP/ASYNC->>>=====================================================================================================================================================================================================SETUP
void setup() {
Serial.begin(115200);
pixels.begin();pixels.clear();pixels.setBrightness(stripeBrightness);pixels.show();
btnSetup();
Accelerometer.Setup();
pinMode(crystalPOTI, INPUT);
if(saberState == "SETUP" || "editSaber"){
Serial.println("initialize CyberCrystal");
lightsaberSetup();
Serial.println("initialized CyberCrystal");
//SETUP //fĂĽr ALLES
// -> erst technische Komponente wie SD etc etc
// -> dann Variablen deklarieren (-> aktives Profil checken
// -> textfiles aus dem Ordner lesen und so die variablen deklarieren)
// und buffer laden etc etc
}
if(WiFiMODE == true){
//---<<<-WIFI-SERVER->>>---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//WiFi-Einstellungen nur fĂĽrs Lichtschwert geeignet
// WEBSERVER!
// -> bei jeder Variablenänderung Wert direkt in File auf der SD speichern! (jede Variable braucht einzelnes .txt file!!!!)
// -> SAVE/übernehmen Knopf!!! => wenn der gedrückt wird werden die Einstellungen übernommen und buffer etc gefüllt, sofern das editierte als aktiver Körper ausgewählt ist
// -> wenn profil geändert wird Variablen neu deklarieren und buffer laden!
//WiFi:
Serial.println("setUp Webserver..");
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
//---<server.on>-----------------------------------------------------------------------------------------------------------------------------
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html);
});
server.on("/index.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html);
});
server.on("/instructions.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", instructions_html);
});
server.on("/about.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", about_html);
});
server.on("/edit.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", edit_html);
});
server.on("/e_profile1.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", e_profile1_html);
});
server.on("/e_profile1_crystal.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", e_profile1_crystal_html);
});
server.on("/e_profile1_sound.html", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", e_profile1_sound_html);
});
server.begin();
}
Serial.println("Setup completed!");
}
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-LOOP->>>=============================================================================================================================================================================================================LOOP
void loop() {
//while(saberState == "ready"){} //schleife in der Er sich fängt wenn die Klinge aus ist -> hier auch gleich schon edit mode evt ?
//===-Lightsaber-====================================================================================================================================================================================================Lightsaber
while(saberMode == "Lightsaber"){
if(saberState == "driveOut"){
saber_driveOut(driveOut_animation);
//saber_driveOut("slowGlow", sonstige Parameter);sound(); //1x abspielen => saberState = on;
Serial.println("driveOut");
}
if(saberState == "driveIn"){
saber_driveIn(driveIn_animation);
//saber_driveOut("default", sonstige Parameter);sound(); //1x abspielen => saberState = ready;
Serial.println("driveIn");
}
//---<bladeON-Funktionen>-----------------------------------------------------------------------------------------------------
if(bladeON == true){
//---<timed_Interrupts>-----------------------------------------------------------------------------------
checkBTNmenu();
checkBTNmenu_counting();
checkBTNblasterProtect();
checkBTNmelt();
//---<Accelerometer>-----------------------------------------------------------------------------------------------------------
if(saberState != "melt"){
acceleration = Accelerometer.beschleunigungLesen(0.05);
if(Accelerometer.detectClash()>0.3){saberState = "clash"; clashState = "new"; bP_displayState = "new";}//wenn hier bP = "new" steht heiĂźt das, dass die clash precise animation unterbrochen werden kann bP_displayState = "new";
}
if(saberState == "on" || "blasterProtect" || "tipDrag" || "melt" || "menĂĽBTN" || "clash"){// immer dann wenn die Aktion des schwertes nicht die ganze Kling bedeckt
//[if(!sound){sound} //default sounds spielen sobald sie nicht mehr gespielt werden -> aber nur wenn saberState == on!
//[beschleunigung.messen //nicht zu oft!
//crystal
//normales Zeug :D
//Serial.println("on");
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
}
if(saberState == "blasterProtect"){saber_blasterProtect(blasterProtect_animation,
blasterProtect_posMIN,
blasterProtect_posMAX,
blasterProtect_xMIN,
blasterProtect_xMAX,
blasterProtect_yMIN,
blasterProtect_yMAX,
blasterProtect_fadeSteps,
blasterProtect_brightness,
blasterProtect_flash);} //-> hier überall den jeweils benötigten sound 1x spielen!! -> solange der gespielt wird, unabhängig von saber State keinen neuen anfangen!!!!
if(saberState == "lightningParry"){saber_lightningParry(lightningParry_animation); lightningParryCtrl = 't';}
if(saberState == "clash"){saber_clash(clash_animation);}
if(saberState == "clashHold"){saber_clashHold(clashHold_animation, clashHold_fadeOut_animation);}
if(saberState == "tipDrag"){saber_tipDrag(tipDrag_animation, tipDrag_fadeOut_animation); tipDragCtrl = 't';}
if(saberState == "melt"){saber_melt(melt_animation, melt_fadeOut_animation); meltCtrl = 't';}
//um Fehler zusätzlich zu vermeiden:
if(lightningParryCtrl == 't' && saberState != "lightningParry"){
saber_lightningParry(lightningParry_animation);
lightningParryCtrl = 'f';
}
if(meltCtrl == 't' && saberState != "melt"){
saber_melt(melt_animation,melt_fadeOut_animation);
meltCtrl = 'f';
}
if(tipDragCtrl == 't' && saberState != "tipDrag"){
saber_tipDrag(tipDrag_animation, tipDrag_fadeOut_animation);
tipDragCtrl = 'f';
}
//Serial.println(saberState);
pixels.show();
delay(DELAY_VAL);
}
}
//===-Taschenlampe-===================================================================================================================================================================================================Taschenlampe
while(saberMode == "Taschenlampe"){
}
//===-MP3-Player-=====================================================================================================================================================================================================MP3-Player
while(saberMode == "MP3-Player"){
}
}
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-BLADE->>>=====================================================================================================================================================================================================SABER_BLADE
//---<final_Functions>-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------final-Functions
//wechsel von saberState etc durch Interrupts! (auch bei acceleration wegen clash und so :D => Variable als interrupt !)
void saber_driveOut(String animation){
if(animation == "default"){driveOut_default(driveOut_Speed,
driveOut_Steps);}
if(animation == "slowGlow"){driveOut_slowGlow(startLength,
startSpeed,
rdmPixelCount,
driveOut_Speed,
driveOut_Steps);}
saberState = "on";
bladeON = true;
}
void saber_driveIn(String animation){
if(animation == "default"){driveIn_default(driveIn_Speed,
driveIn_Steps);}
saberState = "editSaber";
bladeON = false;
}
void crystal(int stripeSpeed, int fadeBrightness1, int fadeBrightness2, int wholeFadeSteps){
crystal_potiVal = round((float)((float)analogRead(crystalPOTI)/(float)4095)*(float)100);
if(crystal_potiVal != 0){
displayStripes(crystal_potiVal);
fadeWhole(fadeBrightness1-crystal_potiVal,fadeBrightness2-crystal_potiVal, 0,0, 0,0, wholeFadeSteps, false);
moveStripes(stripeSpeed);
}
else{pixels.fill(pixels.Color(L_modifiers_color_R,L_modifiers_color_G,L_modifiers_color_B),0,NUMPIXELS);}
}//macht einfach all das was die Klinge stabil bzw instabil macht (-> durch Poti einstellbar)
void saber_blasterProtect(String animation, int posMIN, int posMAX, int xMIN, int xMAX, int yMIN, int yMAX, int fadeSteps, int brightness, boolean flash){
if(animation == "default"){blasterProtect(posMIN,posMAX, xMIN, xMAX, yMIN, yMAX, fadeSteps, brightness, flash, 0);}
}
void saber_lightningParry(String animation){
if(animation == "default"){
if(digitalRead(BTN_BP) == LOW){
lightningParry_default(4,7, 2,4, 3,5, 10,90, 50,NUMPIXELS);
}else{
lightningParry_default_fadeOut(10,90, 50,NUMPIXELS); saberState = "on";
}
}
}
void saber_clash(String animation){
if(animation == "clash_precise"){clash_precise(clash_precise_delay, clash_precise_fadeSteps);}
}
void saber_clashHold(String animation, String fadeOut_animation){
if(animation == "default"){
if(digitalRead(BTN_CH) == LOW){
clashHold_default(clashHold_default_brightnessMIN,
clashHold_default_brightnessMAX,
clashHold_default_pixlBright,
clashHold_default_pixlAnzahl);
}else{if(fadeOut_animation == "default"){clashHold_default_fadeOut(clashHold_fadeOut_default_Steps);} saberState = "on";}//
}
}
void saber_tipDrag(String animation, String fadeOut_animation){
if(saberState == "tipDrag"){
if(animation == "default"){
if(digitalRead(BTN_MELT) == LOW){
tipDrag_default(tipDrag_x_Length,tipDrag_y_Length,tipDrag_z_Length, tipDrag_fadeIn_Out_Steps);
}
}
}
else{
if(fadeOut_animation == "default"){tipDrag_default_stop(tipDrag_fadeIn_Out_Steps); tipDrag_state="new"; saberState = "on";}
}
}
void saber_melt(String animation, String fadeOut_animation){
if(saberState == "melt"){
if(animation == "default"){
melt_default(melt_x_Length,melt_y_Length,melt_z_Length, melt_fadeIn_Out_Steps);
}
}
else{
if(fadeOut_animation == "default"){melt_default_stop(melt_fadeIn_Out_Steps+1); melt_state="new"; saberState = "on";}
}
}
//---<calculationFunctions>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------calculateFunctions
int calculateColorVal(int xcolorOld, int xcolorNew, int xproportion, int xpropFact){ //old = Basefarbe auf die New angenähert wird. für:[1 = 100% New; 0 = 0% New usw.]
int difference; //z.B 100, 200, 10, 100 -> 10/100 also 10% der neuen Farbe
double proportion;
int newValue;
if(xcolorOld == 0 && xcolorNew == 0){return(0);}else{
proportion = (double)xproportion / (double)xpropFact;
if(proportion <= 0){return(xcolorOld);}else{
difference = xcolorNew - xcolorOld;
newValue = round((double)difference * (double)proportion) + xcolorOld;
//Serial.print("proportion: ");Serial.println(proportion);
//Serial.print("difference: ");Serial.println(difference);
return( newValue);
}
}
}
//---<Crystal>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Crystal
void fadeWhole(int newBrightnessMIN, int newBrightnessMAX, int fadeSpeedMIN, int fadeSpeedMAX, int fadeSpeedMIN2, int fadeSpeedMAX2, int Steps, boolean sD){
if(wholeState == "new"){
fadeBrightness = random(newBrightnessMIN, newBrightnessMAX);
fadeSpeed1 = random(fadeSpeedMIN, fadeSpeedMAX);
fadeSpeed2 = random(fadeSpeedMIN2, fadeSpeedMAX2);
wholeCounter = stripeBrightness;
wholeState = "down";
if(sD==true){Serial.print("new: ");Serial.println(fadeBrightness);}
}
if(wholeState == "down"){
pixels.setBrightness(wholeCounter);
wholeCounter-=Steps;
if(sD==true){Serial.println(wholeCounter);}
if(wholeCounter <= fadeBrightness){wholeState = "up";}
delay(fadeSpeed1);
}
if(wholeState == "up"){
pixels.setBrightness(wholeCounter);
wholeCounter+=Steps;
if(sD==true){Serial.println(wholeCounter);}
if(wholeCounter >= stripeBrightness){wholeState = "new";}
delay(fadeSpeed2);
}
}
void displayStripes(int brightness){
pixels.fill(pixels.Color(L_modifiers_color_R, L_modifiers_color_G, L_modifiers_color_B),0,NUMPIXELS);//displayed alle Streifen
for(int i = 2; i <= 180 && stripes[i] != -1000; i+=4){
newStripe(stripes[i], stripes[i-2], stripes[i-1], 0,brightness);
//delay(0);
}
}
void moveStripes(int bewegungsfaktor){
if(bewegungsfaktor >= 1){
for(int i = 2; i <= 180 && stripes[i] != -1000; i+=4){//verschiebt alle Streifen um bewegungsfaktor nach oben
if(stripes[i] <= NUMPIXELS){stripes[i] += bewegungsfaktor;}
else{
stripes[i] = -(stripes[i-2]+2*stripes[i-1]+stripes[i+1]);//setzt Streifen wieder nach unten/an den Anfang (! nicht an den anfangswert!!!)
}
}//~0ms Dauer bei 0ms delay! (x=5; y=6)
}
if(bewegungsfaktor <= -1){
for(int i = 2; i <= 180 && stripes[i] != -1000; i+=4){//verschiebt alle Streifen um bewegungsfaktor nach oben
if(stripes[i] >= 0-(stripes[i-2]+2*stripes[i-1]+stripes[i+1])){stripes[i] += bewegungsfaktor;}
else{
stripes[i] = NUMPIXELS;//setzt Streifen wieder nach unten/an den Anfang (! nicht an den anfangswert!!!)
}
}//~0ms Dauer bei 0ms delay! (x=5; y=6)
}
}
void newStripe(int xctrlPin, int x, int y, int delaySideSpan, float brightness){
if(brightness > 1){ //warum nicht 0? bug bei brightness 1 D:
int k = 100;
if(brightness !=100){k = brightness;}
int z;
pixels.fill(pixels.Color(fadeBuffer_R[k],fadeBuffer_G[k],fadeBuffer_B[k]),xctrlPin+y,x);
//Serial.println(k);
if(y != 0){
if(delaySideSpan != 0){
for(int i = y; i>=0; i--){
if(brightness == 100){z = round((float)((float)i/(float)y)*(float)100);}else{
z = round(((float)((float)i/(float)y))*(float)brightness);}
if(z <= 0){
pixels.fill(pixels.Color(fadeBuffer_R[z+1],fadeBuffer_G[z+1],fadeBuffer_B[z+1]),xctrlPin+i,1);
pixels.fill(pixels.Color(fadeBuffer_R[z+1],fadeBuffer_G[z+1],fadeBuffer_B[z+1]),xctrlPin+y+x+(y-i),1);
pixels.show();
}else{
pixels.fill(pixels.Color(fadeBuffer_R[z],fadeBuffer_G[z],fadeBuffer_B[z]),xctrlPin+i,1);
pixels.fill(pixels.Color(fadeBuffer_R[z],fadeBuffer_G[z],fadeBuffer_B[z]),xctrlPin+y+x+(y-i),1);
pixels.show();
}
//Serial.print(fadeBuffer_R[z]);Serial.print(" | ");Serial.print(fadeBuffer_G[z]);Serial.print(" | ");Serial.println(fadeBuffer_B[z]);
delay(delaySideSpan);
}
}else{
for(int i = y; i>=0; i--){
if(brightness == 1){z = round((float)((float)i/(float)y)*(float)100);}else{
z = round(((float)((float)i/(float)y))*(float)brightness);}
if(z <= 0){
pixels.fill(pixels.Color(fadeBuffer_R[z+1],fadeBuffer_G[z+1],fadeBuffer_B[z+1]),xctrlPin+i,1);
pixels.fill(pixels.Color(fadeBuffer_R[z+1],fadeBuffer_G[z+1],fadeBuffer_B[z+1]),xctrlPin+y+x+(y-i),1);
}else{
pixels.fill(pixels.Color(fadeBuffer_R[z],fadeBuffer_G[z],fadeBuffer_B[z]),xctrlPin+i,1);
pixels.fill(pixels.Color(fadeBuffer_R[z],fadeBuffer_G[z],fadeBuffer_B[z]),xctrlPin+y+x+(y-i),1);
}
}
}
}
}
}
void loadBuffer(char xbufferSelection, int xcolorOld, int xcolorNew, boolean showDebug){
switch(xbufferSelection){
case 'R':for(int i = 0; i <= 101; i++){
fadeBuffer_R[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" buffVal_R: ");Serial.println(fadeBuffer_R[i]);}
}break;
case 'G':for(int i = 0; i <= 101; i++){
fadeBuffer_G[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" buffVal_G: ");Serial.println(fadeBuffer_G[i]);}
}break;
case 'B':for(int i = 0; i <= 101; i++){
fadeBuffer_B[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" buffVal_B: ");Serial.println(fadeBuffer_B[i]);}
}break;
}
}
void loadBufferRGB(int xcolorOldR, int xcolorOldG, int xcolorOldB, int xcolorNewR, int xcolorNewG, int xcolorNewB, boolean sD){
if(sD == true){Serial.println("loading Buffer...");}
loadBuffer('R', xcolorOldR, xcolorNewR, sD);
loadBuffer('G', xcolorOldG, xcolorNewG, sD);
loadBuffer('B', xcolorOldB, xcolorNewB, sD);
fadeBuffer_R[0]=xcolorOldR;
fadeBuffer_G[0]=xcolorOldG;
fadeBuffer_B[0]=xcolorOldB;
fadeBuffer_R[100]=xcolorNewR;
fadeBuffer_G[100]=xcolorNewG;
fadeBuffer_B[100]=xcolorNewB;
if(sD == true){
Serial.println("<--Buffer loaded!--------->");
Serial.println("Bufferval 100: ");
Serial.println(fadeBuffer_R[100]);
Serial.println(fadeBuffer_G[100]);
Serial.println(fadeBuffer_B[100]);
Serial.println("Bufferval 0: ");
Serial.println(fadeBuffer_R[0]);
Serial.println(fadeBuffer_G[0]);
Serial.println(fadeBuffer_B[0]);
Serial.println("<------------------------->");
}
}
void crystalStripesSetup(int xa, int xb, int ya, int yb, int za, int zb, int additionalStripes, boolean sD){
if(sD == true){Serial.println("setup new Crystal-Stripes...");Serial.println("<--write ctrlPin---------->");}
int zaehler = -2;
int q;
int r;
int s;
for(int i = 0; i <= 180; i+=4){stripes[i] = random(xa, xb);}//definiert x (=Span-)Werte der Streifen
for(int i = 1; i <= 180; i+=4){stripes[i] = random(ya, yb);}//definiert y (=sideSpan-)Werte der Streifen
for(int i = 3; i <= 180; i+=4){stripes[i] = random(za, zb);}//definiert z (=Abstands-)Werte der Streifen
for(int i = 2; i <= 180; i+=4){
zaehler++;
q =stripes[i-2];
r =stripes[i-1];
s =stripes[i+1];
if(zaehler == -1){stripes[i] = -(q+2*r+s);}else{
if(((q+2*r+s)*zaehler)<NUMPIXELS+additionalStripes){stripes[i] = stripes[i-4]+stripes[i-6]+2*stripes[i-5]+stripes[i-3];}//stripes[i] berĂĽcksichtigt hier die Werte des vorhergegangenen Streifens
else{stripes[i] = -1000;};
}
if(sD == true){
Serial.print(zaehler);Serial.print("x= ");Serial.print(stripes[i-2]);Serial.print("y= ");Serial.print(stripes[i-1]);Serial.print("ctrlPin= ");Serial.print(stripes[i]);Serial.print("z= ");Serial.println(stripes[i+1]);
}
}
if(sD == true){Serial.println("<------------------------->");}
}
//---<blasterProtect>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------blasterProtect
void blasterProtect(int posMIN, int posMAX, int xMIN, int xMAX, int yMIN, int yMAX, int fadeSteps, int brightness, boolean flash, int delaySideSpan){
if(bP_displayState == "2"){
int g = brightness - bP_Counter+1;
bC_newStripe(bP_ctrlPin, bP_x, bP_y, 0,g);
bP_Counter+=fadeSteps;
if(bP_Counter >= brightness){bP_displayState = "new"; saberState = "on";} //saberState fĂĽr Interrupt
}
if(bP_displayState == "flash"){
if(flash == true){
bC_newStripe(bP_ctrlPin-bP_y-bP_x, 2*bP_x, 2*bP_y, 0,brightness);pixels.show();
delay(8);
pixels.fill(pixels.Color(L_modifiers_color_R, L_modifiers_color_G, L_modifiers_color_B), 1, NUMPIXELS);
}
bC_newStripe(bP_ctrlPin, bP_x, bP_y, delaySideSpan,brightness);
bP_displayState = "2";
}
if(bP_displayState == "new"){
bP_Counter = 0;
bP_ctrlPin = random(posMIN, posMAX);
bP_x = random(xMIN, xMAX);
bP_y = random(yMIN, yMAX);
bP_displayState = "flash";
}
}
//brightness von 0 - 100 angeben
void bC_newStripe(int xctrlPin, int x, int y, int delaySideSpan, float brightness){
int k = 100;
if(brightness !=100){k = brightness;}
int z;
pixels.fill(pixels.Color(bC_fadeBuffer_R[k],bC_fadeBuffer_G[k],bC_fadeBuffer_B[k]),xctrlPin+y,x);
//Serial.println(k);
if(y != 0){
if(delaySideSpan != 0){
for(int i = y; i>=0; i--){
if(brightness == 100){z = round((float)((float)i/(float)y)*(float)100);}else{
z = round(((float)((float)i/(float)y))*(float)brightness);}
if(z <= 0){
pixels.fill(pixels.Color(bC_fadeBuffer_R[z+1],bC_fadeBuffer_G[z+1],bC_fadeBuffer_B[z+1]),xctrlPin+i,1);
pixels.fill(pixels.Color(bC_fadeBuffer_R[z+1],bC_fadeBuffer_G[z+1],bC_fadeBuffer_B[z+1]),xctrlPin+y+x+(y-i),1);
pixels.show();
}else{
pixels.fill(pixels.Color(bC_fadeBuffer_R[z],bC_fadeBuffer_G[z],bC_fadeBuffer_B[z]),xctrlPin+i,1);
pixels.fill(pixels.Color(bC_fadeBuffer_R[z],bC_fadeBuffer_G[z],bC_fadeBuffer_B[z]),xctrlPin+y+x+(y-i),1);
pixels.show();
}
//Serial.print(cP_fadeBuffer_R[z]);Serial.print(" | ");Serial.print(cP_fadeBuffer_G[z]);Serial.print(" | ");Serial.println(cP_fadeBuffer_B[z]);
delay(delaySideSpan);
}
}else{
for(int i = y; i>=0; i--){
if(brightness == 1){z = round((float)((float)i/(float)y)*(float)100);}else{
z = round(((float)((float)i/(float)y))*(float)brightness);}
if(z <= 0){
pixels.fill(pixels.Color(bC_fadeBuffer_R[z+1],bC_fadeBuffer_G[z+1],bC_fadeBuffer_B[z+1]),xctrlPin+i,1);
pixels.fill(pixels.Color(bC_fadeBuffer_R[z+1],bC_fadeBuffer_G[z+1],bC_fadeBuffer_B[z+1]),xctrlPin+y+x+(y-i),1);
}else{
pixels.fill(pixels.Color(bC_fadeBuffer_R[z],bC_fadeBuffer_G[z],bC_fadeBuffer_B[z]),xctrlPin+i,1);
pixels.fill(pixels.Color(bC_fadeBuffer_R[z],bC_fadeBuffer_G[z],bC_fadeBuffer_B[z]),xctrlPin+y+x+(y-i),1);
}
}
}
}
}
void bC_loadBuffer(char xbufferSelection, int xcolorOld, int xcolorNew, boolean showDebug){
switch(xbufferSelection){
case 'R':for(int i = 0; i <= 101; i++){
bC_fadeBuffer_R[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" bC_buffVal_R: ");Serial.println(bC_fadeBuffer_R[i]);}
}break;
case 'G':for(int i = 0; i <= 101; i++){
bC_fadeBuffer_G[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" bC_buffVal_G: ");Serial.println(bC_fadeBuffer_G[i]);}
}break;
case 'B':for(int i = 0; i <= 101; i++){
bC_fadeBuffer_B[i]= calculateColorVal(xcolorOld, xcolorNew, i, 100);
if(showDebug==true){Serial.print(i);Serial.print(" bC_buffVal_B: ");Serial.println(bC_fadeBuffer_B[i]);}
}break;
}
}
void bC_loadBufferRGB(int xcolorOldR, int xcolorOldG, int xcolorOldB, int xcolorNewR, int xcolorNewG, int xcolorNewB, boolean sD){
if(sD == true){Serial.println("loading bC_Buffer...");}
bC_loadBuffer('R', xcolorOldR, xcolorNewR, sD);
bC_loadBuffer('G', xcolorOldG, xcolorNewG, sD);
bC_loadBuffer('B', xcolorOldB, xcolorNewB, sD);
bC_fadeBuffer_R[0]=xcolorOldR;
bC_fadeBuffer_G[0]=xcolorOldG;
bC_fadeBuffer_B[0]=xcolorOldB;
bC_fadeBuffer_R[100]=xcolorNewR;
bC_fadeBuffer_G[100]=xcolorNewG;
bC_fadeBuffer_B[100]=xcolorNewB;
if(sD == true){
Serial.println("<--bC_Buffer loaded!--------->");
Serial.println("bC_Bufferval 100: ");
Serial.println(bC_fadeBuffer_R[100]);
Serial.println(bC_fadeBuffer_G[100]);
Serial.println(bC_fadeBuffer_B[100]);
Serial.println("bC_Bufferval 0: ");
Serial.println(bC_fadeBuffer_R[0]);
Serial.println(bC_fadeBuffer_G[0]);
Serial.println(bC_fadeBuffer_B[0]);
Serial.println("<---------------------------->");
}
}
//---<clash>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------clash
//precise:
void clash_precise(boolean delaySideSpan, int fadeSteps){//groesse von 1-7 (gibt an ob XS, S, M etc etc)
if(clashState == "new"){
clash_precise_size = random(clash_precise_groesseMIN, clash_precise_groesseMAX);
clashState = "go";
}
if(clashState == "go"){
if(delaySideSpan == false){
if(clash_precise_size == 1){clash_precise_XS(0, fadeSteps);}
if(clash_precise_size == 2){clash_precise_S(0, fadeSteps);}
if(clash_precise_size == 3){clash_precise_M(0, fadeSteps);}
if(clash_precise_size == 4){clash_precise_L(0, fadeSteps);}
if(clash_precise_size == 5){clash_precise_XL(0, fadeSteps);}
if(clash_precise_size == 6){clash_precise_XXL(0, fadeSteps);}
if(clash_precise_size == 7){clash_precise_XXXL(0, fadeSteps);}
}
if(delaySideSpan == true){
if(clash_precise_size == 1){clash_precise_XS(2, fadeSteps);}
if(clash_precise_size == 2){clash_precise_S(2, fadeSteps);}
if(clash_precise_size == 3){clash_precise_M(2, fadeSteps);}
if(clash_precise_size == 4){clash_precise_L(2, fadeSteps);}
if(clash_precise_size == 5){clash_precise_XL(2, fadeSteps);}
if(clash_precise_size == 6){clash_precise_XXL(2, fadeSteps);}
if(clash_precise_size == 7){clash_precise_XXXL(2, fadeSteps);}
}
}
}
void clash_precise_XS(int delaySidespan, int fadeSpeps){
blasterProtect(0,0, 10,10, 10,10, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_S(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 22,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 22, 15,15, 15,15, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_M(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 30,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 30, 20,20, 20,20, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_L(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 37,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 37, 25,25, 25,25, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_XL(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 45,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 45, 30,30, 30,30, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_XXL(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 53,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 53, 35,35, 35,35, fadeSpeps, 100, true, delaySidespan);
}
void clash_precise_XXXL(int delaySidespan, int fadeSpeps){
blasterProtect(round((float)(NUMPIXELS-startLength)/(float)2)+ startLength - 60,round((float)(NUMPIXELS-startLength)/(float)2) + startLength - 60, 40,40, 40,40, fadeSpeps, 100, true, delaySidespan);
}
//---<clashHold>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------clashHold
//default:
void clashHold_default(int brMIN, int brMAX, float pixlBright, int pixlAnzahl){
pixels.fill(pixels.Color(L_modifiers_blinkColor_R,
L_modifiers_blinkColor_G,
L_modifiers_blinkColor_B),0,NUMPIXELS);
for(int i = 0; i <= pixlAnzahl; i++){
pixels.fill(pixels.Color(L_modifiers_blinkColor_R-round((float)50*(float)pixlBright),
L_modifiers_blinkColor_G-round((float)40*(float)pixlBright),
L_modifiers_blinkColor_B-round((float)30*(float)pixlBright)),random(0,NUMPIXELS), random(1,7));
}
fadeWhole(brMIN,brMAX, 0,0, 0,0, 12, false);
pixels.show();
}
//--fadeOut:
//default:
void clashHold_default_fadeOut(int steps){
for(int i = 100; i >= 0; i -= steps){
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
pixels.fill(pixels.Color(bC_fadeBuffer_R[i],
bC_fadeBuffer_G[i],
bC_fadeBuffer_B[i]),0+(100-i),NUMPIXELS-(100-i)+1);
pixels.show();
delay(2);
}
}
//---<lightningParry>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------lightningParry
//default:
void lightningParry_default(int anzahlMIN,int anzahlMAX, int xMIN,int xMAX, int yMIN,int yMAX, int xMinMIN,int xMinMAX, int xMaxMIN,int xMaxMAX){
if(lightningParryState == "new"){
lightningParry_stripeAnzahl = random(anzahlMIN, anzahlMAX);
lightningParry_Count = 0;
for(int i = 0; i < lightningParry_stripeAnzahl*7; i+=7){
lightningParry_data[i] = random(startLength, NUMPIXELS - 10); //position
lightningParry_data[i + 1] = random(xMIN, xMAX); //x
lightningParry_data[i + 2] = random(yMIN, yMAX); //y
lightningParry_data[i + 3] = random(5, 9); //"fadeSpan" --> Speed
lightningParry_data[i + 4] = random(0, 1); // up / down
lightningParry_data[i + 5] = random(xMinMIN, xMinMAX); //MIN
lightningParry_data[i + 6] = random(xMaxMIN, xMaxMAX); //MAX
}
lightningParryState = "start";
}
if(lightningParryState == "start"){
for(int i = 0; i <= lightningParry_stripeAnzahl; i+=3){
//Eckpunkte:
if(lightningParry_data[i*7] < lightningParry_data[i*7 + 5]){lightningParry_data[i*7 + 4] = 1; lightningParry_data[i*7 + 5] = random(xMinMIN, xMinMAX);}
if(lightningParry_data[i*7] > lightningParry_data[i*7 + 6]){lightningParry_data[i*7 + 4] = 0; lightningParry_data[i*7 + 6] = random(xMaxMIN, xMaxMAX);}
if(lightningParry_data[i*7 + 4] == 1){
lightningParry_data[i*7] += lightningParry_data[i*7 + 3];
}else{
lightningParry_data[i*7] -= lightningParry_data[i*7 + 3];
}
}
lightningParry_default_displayStripes(lightningParry_Count);
if(lightningParry_Count < 100){lightningParry_Count+=6;}
else{lightningParryState = "on"; lightningParry_Count = 100;}
}
if(lightningParryState == "on"){
for(int i = 0; i <= lightningParry_stripeAnzahl; i++){
//Eckpunkte:
if(lightningParry_data[i*7] < lightningParry_data[i*7 + 5]){lightningParry_data[i*7 + 4] = 1; lightningParry_data[i*7 + 5] = random(xMinMIN, xMinMAX); Serial.println(lightningParry_data[i*7 + 5]);}
if(lightningParry_data[i*7] > lightningParry_data[i*7 + 6]){lightningParry_data[i*7 + 4] = 0; lightningParry_data[i*7 + 6] = random(xMaxMIN, xMaxMAX); Serial.println(lightningParry_data[i*7 + 6]);}
if(lightningParry_data[i*7 + 4] == 1){
lightningParry_data[i*7] += lightningParry_data[i*7 + 3];
}else{
lightningParry_data[i*7] -= lightningParry_data[i*7 + 3];
}
}
lightningParry_default_displayStripes(100);
}
}
void lightningParry_default_displayStripes(int xBrightness){
for(int i = 0; i < 101 - 7 && lightningParry_data[i] != 0; i +=7){ //Länge
bC_newStripe(lightningParry_data[i],
lightningParry_data[i + 1],
lightningParry_data[i + 2], 0, xBrightness);
}
}
void lightningParry_default_fadeOut(int xMinMIN,int xMinMAX, int xMaxMIN,int xMaxMAX){
for(int z = 100; z > 1; z-=5){
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
for(int i = 0; i <= lightningParry_stripeAnzahl; i++){
//Eckpunkte:
if(lightningParry_data[i*7] < lightningParry_data[i*7 + 5]){lightningParry_data[i*7 + 4] = 1; lightningParry_data[i*7 + 5] = random(xMinMIN, xMinMAX); Serial.println(lightningParry_data[i*7 + 5]);}
if(lightningParry_data[i*7] > lightningParry_data[i*7 + 6]){lightningParry_data[i*7 + 4] = 0; lightningParry_data[i*7 + 6] = random(xMaxMIN, xMaxMAX); Serial.println(lightningParry_data[i*7 + 6]);}
if(lightningParry_data[i*7 + 4] == 1){
lightningParry_data[i*7] += lightningParry_data[i*7 + 3];
}else{
lightningParry_data[i*7] -= lightningParry_data[i*7 + 3];
}
}
lightningParry_default_displayStripes(z);
pixels.show();
delay(DELAY_VAL);
}
lightningParryState = "new";
}
//---<tipDrag>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tipDrag
//default:
void tipDrag_default(int xLength, int yLength, int zLength, int xfadeIn_Out_Steps){
if(tipDrag_state == "new"){
tipDrag_xLength = xLength;
tipDrag_yLength = yLength;
tipDrag_zLength = zLength;
tipDrag_deault_counter = tipDrag_xLength+tipDrag_yLength+2*tipDrag_zLength + 3;//20;
tipDrag_state = "start";
}
if(tipDrag_state == "start"){
if(tipDrag_deault_counter >= 0){
for(int i = 0; i < tipDrag_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,tipDrag_crossingColor_R,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_G,tipDrag_crossingColor_G,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_B,tipDrag_crossingColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength
-tipDrag_zLength+i+ tipDrag_deault_counter,1);
pixels.fill(pixels.Color(calculateColorVal(tipDrag_crossingColor_R,L_modifiers_meltColor_R,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_G,L_modifiers_meltColor_G,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_B,L_modifiers_meltColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength+i+ tipDrag_deault_counter,1);
}
pixels.fill(pixels.Color(tipDrag_crossingColor_R,
tipDrag_crossingColor_G,
tipDrag_crossingColor_B),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength+ tipDrag_deault_counter,tipDrag_yLength);
pixels.fill(pixels.Color(L_modifiers_meltColor_R,
L_modifiers_meltColor_G,
L_modifiers_meltColor_B),NUMPIXELS-tipDrag_xLength+ tipDrag_deault_counter,tipDrag_xLength);
tipDrag_deault_counter-=xfadeIn_Out_Steps;
}else{
tipDrag_state = "on";
//tipDrag_deault_counter=0;
}
}
if(tipDrag_state == "on"){
for(int i = 0; i < tipDrag_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,tipDrag_crossingColor_R,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_G,tipDrag_crossingColor_G,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_B,tipDrag_crossingColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength
-tipDrag_zLength+i,1);
pixels.fill(pixels.Color(calculateColorVal(tipDrag_crossingColor_R,L_modifiers_meltColor_R,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_G,L_modifiers_meltColor_G,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_B,L_modifiers_meltColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength+i,1);
}
pixels.fill(pixels.Color(tipDrag_crossingColor_R,
tipDrag_crossingColor_G,
tipDrag_crossingColor_B),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength,tipDrag_yLength);
pixels.fill(pixels.Color(L_modifiers_meltColor_R,
L_modifiers_meltColor_G,
L_modifiers_meltColor_B),NUMPIXELS-tipDrag_xLength,tipDrag_xLength);
//Funken:
int Tobi = random(0,100);
if(Tobi < 20){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,L_modifiers_meltColor_R,10,100),
calculateColorVal(L_modifiers_color_G,L_modifiers_meltColor_G,10,100),
calculateColorVal(L_modifiers_color_B,L_modifiers_meltColor_B,10,100)),random(0,NUMPIXELS-tipDrag_xLength),random(1,3));}else{
if(Tobi > 50){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,L_modifiers_meltColor_R,100,100),
calculateColorVal(L_modifiers_color_G,L_modifiers_meltColor_G,100,100),
calculateColorVal(L_modifiers_color_B,L_modifiers_meltColor_B,100,100)),random(NUMPIXELS-tipDrag_xLength - 10,NUMPIXELS-tipDrag_xLength),random(1,3));}else{
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,L_modifiers_meltColor_R,60,100),
calculateColorVal(L_modifiers_color_G,L_modifiers_meltColor_G,60,100),
calculateColorVal(L_modifiers_color_B,L_modifiers_meltColor_B,60,100)),random(NUMPIXELS-tipDrag_xLength - 40,NUMPIXELS-tipDrag_xLength),random(1,3));}}
}
}
void tipDrag_default_stop(int xfadeIn_Out_Steps){
for(int a = tipDrag_deault_counter; a <= tipDrag_xLength+tipDrag_yLength+2*tipDrag_zLength; a+=xfadeIn_Out_Steps){//0
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
for(int i = 0; i < tipDrag_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,tipDrag_crossingColor_R,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_G,tipDrag_crossingColor_G,i,tipDrag_zLength),
calculateColorVal(L_modifiers_color_B,tipDrag_crossingColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength
-tipDrag_zLength+i+ a,1);
pixels.fill(pixels.Color(calculateColorVal(tipDrag_crossingColor_R,L_modifiers_meltColor_R,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_G,L_modifiers_meltColor_G,i,tipDrag_zLength),
calculateColorVal(tipDrag_crossingColor_B,L_modifiers_meltColor_B,i,tipDrag_zLength)),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength+i+ a,1);
}
pixels.fill(pixels.Color(tipDrag_crossingColor_R,
tipDrag_crossingColor_G,
tipDrag_crossingColor_B),NUMPIXELS-tipDrag_xLength
-tipDrag_zLength
-tipDrag_yLength+ a,tipDrag_yLength);
pixels.fill(pixels.Color(L_modifiers_meltColor_R,
L_modifiers_meltColor_G,
L_modifiers_meltColor_B),NUMPIXELS-tipDrag_xLength+ a,tipDrag_xLength);
pixels.show();
delay(DELAY_VAL);
}
}
//---<melt>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------melt
//default:
void melt_default(int xLength, int yLength, int zLength, int xfadeIn_Out_Steps){
int q = 3;
if(melt_state == "new"){
melt_xLength = xLength;
melt_yLength = yLength;
melt_zLength = zLength;
melt_deault_counter = melt_xLength+melt_yLength+2*melt_zLength + 3;//20;
melt_state = "start";
}
if(melt_state == "start"){
int angle = round(Accelerometer.getAngle(1,1000));
if(melt_deault_counter >= 0){
int angle = round(Accelerometer.getAngle(1,1000));
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_B,melt_crossingColor_R,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ melt_deault_counter+q,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_G,calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_B,calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360),i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ melt_deault_counter+q,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ melt_deault_counter+q,melt_yLength);
pixels.fill(pixels.Color(calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),
calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),
calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360)),NUMPIXELS-melt_xLength+ melt_deault_counter+q,melt_xLength);
melt_deault_counter-=xfadeIn_Out_Steps;
}else{
melt_state = "on";
//melt_deault_counter=0;
}
}
if(melt_state == "on"){
int angle = round(Accelerometer.getAngle(1,1000));
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R, melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G, melt_crossingColor_G,i,melt_zLength),
calculateColorVal(L_modifiers_color_B, melt_crossingColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ melt_deault_counter+q,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_G,calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_B,calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360),i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ melt_deault_counter+q,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ melt_deault_counter+q,melt_yLength);
pixels.fill(pixels.Color(calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),
calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),
calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360)),NUMPIXELS-melt_xLength+ melt_deault_counter+q,melt_xLength);
//Funken:
int Tobi = random(0,100);
if(Tobi < 20){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,10,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,10,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,10,100)),random(0,NUMPIXELS-melt_xLength),random(1,3));}else{
if(Tobi > 50){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,100,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,100,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,100,100)),random(NUMPIXELS-melt_xLength - 10,NUMPIXELS-melt_xLength),random(1,3));}else{
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,60,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,60,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,60,100)),random(NUMPIXELS-melt_xLength - 40,NUMPIXELS-melt_xLength),random(1,3));}}
//Serial.println(angle);
}
}
void melt_default_stop(int xfadeIn_Out_Steps){
for(int a = melt_deault_counter; a <= melt_xLength+melt_yLength+2*melt_zLength; a+=xfadeIn_Out_Steps){//0
int angle = round(Accelerometer.getAngle(1,1000));
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G,melt_crossingColor_G,i,melt_zLength),
calculateColorVal(L_modifiers_color_B,melt_crossingColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ a,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_G,calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),i,melt_zLength),
calculateColorVal(melt_crossingColor_B,calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360),i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ a,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ a,melt_yLength);
pixels.fill(pixels.Color(calculateColorVal(melt_meltColor_R,melt_meltColor_R2, angle, 360),
calculateColorVal(melt_meltColor_G,melt_meltColor_G2, angle, 360),
calculateColorVal(melt_meltColor_B,melt_meltColor_B2, angle, 360)),NUMPIXELS-melt_xLength+ a,melt_xLength);
pixels.show();
delay(DELAY_VAL);
}
}
/* //ohne durch drehung farbe ändern:
void melt_default(int xLength, int yLength, int zLength, int xfadeIn_Out_Steps){
int q = 3;
if(melt_state == "new"){
melt_xLength = xLength;
melt_yLength = yLength;
melt_zLength = zLength;
melt_deault_counter = melt_xLength+melt_yLength+2*melt_zLength + 3;//20;
melt_state = "start";
}
if(melt_state == "start"){
if(melt_deault_counter >= 0){
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G,melt_crossingColor_G,i,melt_zLength),
calculateColorVal(L_modifiers_color_B,melt_crossingColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ melt_deault_counter+q,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,melt_meltColor_R,i,melt_zLength),
calculateColorVal(melt_crossingColor_G,melt_meltColor_G,i,melt_zLength),
calculateColorVal(melt_crossingColor_B,melt_meltColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ melt_deault_counter+q,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ melt_deault_counter+q,melt_yLength);
pixels.fill(pixels.Color(melt_meltColor_R,
melt_meltColor_G,
melt_meltColor_B),NUMPIXELS-melt_xLength+ melt_deault_counter+q,melt_xLength);
melt_deault_counter-=xfadeIn_Out_Steps;
}else{
melt_state = "on";
//melt_deault_counter=0;
}
}
if(melt_state == "on"){
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G,melt_crossingColor_G,i,melt_zLength),
calculateColorVal(L_modifiers_color_B,melt_crossingColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ melt_deault_counter+q,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,melt_meltColor_R,i,melt_zLength),
calculateColorVal(melt_crossingColor_G,melt_meltColor_G,i,melt_zLength),
calculateColorVal(melt_crossingColor_B,melt_meltColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ melt_deault_counter+q,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ melt_deault_counter+q,melt_yLength);
pixels.fill(pixels.Color(melt_meltColor_R,
melt_meltColor_G,
melt_meltColor_B),NUMPIXELS-melt_xLength+ melt_deault_counter+q,melt_xLength);
//Funken:
int Tobi = random(0,100);
if(Tobi < 20){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,10,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,10,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,10,100)),random(0,NUMPIXELS-melt_xLength),random(1,3));}else{
if(Tobi > 50){pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,100,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,100,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,100,100)),random(NUMPIXELS-melt_xLength - 10,NUMPIXELS-melt_xLength),random(1,3));}else{
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_meltColor_R,60,100),
calculateColorVal(L_modifiers_color_G,melt_meltColor_G,60,100),
calculateColorVal(L_modifiers_color_B,melt_meltColor_B,60,100)),random(NUMPIXELS-melt_xLength - 40,NUMPIXELS-melt_xLength),random(1,3));}}
}
}
void melt_default_stop(int xfadeIn_Out_Steps){
for(int a = melt_deault_counter; a <= melt_xLength+melt_yLength+2*melt_zLength; a+=xfadeIn_Out_Steps){//0
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
for(int i = 0; i < melt_zLength; i++){
pixels.fill(pixels.Color(calculateColorVal(L_modifiers_color_R,melt_crossingColor_R,i,melt_zLength),
calculateColorVal(L_modifiers_color_G,melt_crossingColor_G,i,melt_zLength),
calculateColorVal(L_modifiers_color_B,melt_crossingColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength
-melt_zLength+i+ a,1);
pixels.fill(pixels.Color(calculateColorVal(melt_crossingColor_R,melt_meltColor_R,i,melt_zLength),
calculateColorVal(melt_crossingColor_G,melt_meltColor_G,i,melt_zLength),
calculateColorVal(melt_crossingColor_B,melt_meltColor_B,i,melt_zLength)),NUMPIXELS-melt_xLength
-melt_zLength+i+ a,1);
}
pixels.fill(pixels.Color(melt_crossingColor_R,
melt_crossingColor_G,
melt_crossingColor_B),NUMPIXELS-melt_xLength
-melt_zLength
-melt_yLength+ a,melt_yLength);
pixels.fill(pixels.Color(melt_meltColor_R,
melt_meltColor_G,
melt_meltColor_B),NUMPIXELS-melt_xLength+ a,melt_xLength);
pixels.show();
delay(DELAY_VAL);
}
}
*/
//---<driveOut>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------driveOut
//default:
void driveOut_default(int Speed, int Steps){
for(int i = 0; i <= NUMPIXELS; i+=Steps){
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
pixels.fill(pixels.Color(0,0,0), i, NUMPIXELS-i);
pixels.show();
delay(Speed);
}
}
//slowGlow:
void driveOut_slowGlow(int startLength, int startSpeed, int rdmPixelCount, int Speed, int Steps){
driveOut_Speed;
for(int i = 0; i <= 255; i+=3){
pixels.setBrightness(i);
pixels.fill(pixels.Color(slowGlow_color_R,
slowGlow_color_G,
slowGlow_color_B),0,startLength);
for(int a = 1; a <= rdmPixelCount; a++){
slowGlow_rdm_pixels(startLength);
}
pixels.show();
delay(startSpeed + round((double)i / (double)6));
}
for(int i = 255; i >= 50; i-=4){
pixels.setBrightness(i);
pixels.fill(pixels.Color(slowGlow_color_R,
slowGlow_color_G,
slowGlow_color_B),0,startLength);
for(int a = 1; a <= rdmPixelCount; a++){
slowGlow_rdm_pixels(startLength);
}
pixels.show();
if(startSpeed > 2){delay(startSpeed - 2);}
}
for(int i = 0; i <= NUMPIXELS; i+=Steps){
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
if(i < startLength){
pixels.fill(pixels.Color(slowGlow_color_R,
slowGlow_color_G,
slowGlow_color_B),i,startLength);
}
pixels.fill(pixels.Color(0,0,0), i, NUMPIXELS-i);
pixels.show();
delay(Speed);
}
}
void slowGlow_rdm_pixels(int startLengthX){
int a = random(5,50);
int b = random(7,53);
int c = random(9,55);
int x = slowGlow_color_Rx;
int y = slowGlow_color_Gx;
int z = slowGlow_color_Bx;
if(slowGlow_color_Rx - a > 0){x = slowGlow_color_Rx - a;}
if(slowGlow_color_Gx - b > 0){y = slowGlow_color_Gx - b;}
if(slowGlow_color_Bx - c > 0){z = slowGlow_color_Bx - c;}
pixels.fill(pixels.Color(x,y,z),random(1,startLengthX),random(1,3));
}
//---<driveIn>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------driveIn
//default:
void driveIn_default(int Speed, int Steps){
for(int i = NUMPIXELS; i >= 0; i-=Steps){
crystal(crystal_stripeSpeed,
crystal_fadeBrightness1,
crystal_fadeBrightness2,
crystal_wholeFadeSteps);
pixels.fill(pixels.Color(0,0,0), i, NUMPIXELS-i);
pixels.show();
delay(Speed);
}
}
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-BUTTONS->>>=======================================================================================================================================================================================================BUTTONS
void btnSetup(){
pinMode(BTN_MENU, INPUT_PULLUP);
pinMode(BTN_ON, INPUT_PULLUP);
pinMode(BTN_CH, INPUT_PULLUP);
pinMode(BTN_BP, INPUT_PULLUP);
pinMode(BTN_MELT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BTN_MENU), interrupt_menu, FALLING); //LOW, HIGH, CHANGE, FALLING, RISING => 2:06 https://www.youtube.com/watch?v=PcqiKy_rb24&list=PLP0aj0TqeBaeJaech7jdZMYyGYEsvIoKI&index=35
attachInterrupt(digitalPinToInterrupt(BTN_ON), interrupt_on, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_CH), interrupt_cH, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_BP), interrupt_bP, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_MELT), interrupt_melt, FALLING);
}
//---<INTERRUPTS>-------------------------------------------------------------------------------------------------------------
void interrupt_on(){
if(bladeON == true && debounce_stopTimer() > 500){saberState = "driveIn"; debounce_startTimer();}else{
if(bladeON == false && debounce_stopTimer() > 500){saberState = "driveOut"; debounce_startTimer();}}
}
void interrupt_cH(){
if(debounce_stopTimer() > debounceTime){
debounce_startTimer();
if(bladeON== true){saberState = "clashHold";}
startTimer();
}
}
void interrupt_bP(){
if(debounce_stopTimer() > debounceTime){
debounce_startTimer();
if(bladeON== true){interruptState = "blasterProtect";}
startTimer();
}
}
void interrupt_melt(){
if(debounce_stopTimer() > debounceTime){
debounce_startTimer();
if(bladeON== true){interruptState = "melt";}
startTimer();
}
}
void interrupt_menu(){
if(debounce_stopTimer() > debounceTime){
debounce_startTimer();
if(bladeON== true){interruptState = "menĂĽ";}
startTimer();
}
}
//---<timedBUTTONS>-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void checkBTNmenu(){
if(interruptState == "menĂĽ" || menu_btnState == "low"){
if(stopTimer() > shortPress && digitalRead(BTN_MENU) == LOW){if(interruptState != "default"){Serial.println("M_HOLD"); menu_btnCounter = -1; saberState = "menĂĽBTN"; interruptState = "default"; menu_btnState = "low";}}else
if(stopTimer() < shortPress && digitalRead(BTN_MENU) == HIGH && menu_btnState == "high"){Serial.println("M_SHORT"); interruptState = "default";}
if(digitalRead(BTN_MENU) == HIGH && menu_btnState == "low"){
switch(menu_btnCounter){
case 1: Serial.println("höhö du hast ne 1... achievement get!");
//WiFiMODE = true;
break;
case 2: Serial.println("du hast ne 2 :)");
break;
case 3: Serial.println("nur ne 3 :/");
break;
case 4: Serial.println("ne 4 :(");
break;
case 5: Serial.println("was war denn da los... eine 5 ?!");
break;
case 6: Serial.println("Das gibt ne 6 noich");
break;
case 7: Serial.println("7 :)");
break;
case 8: Serial.println("8 :)");
break;
case 9: Serial.println("9 :)");
break;
case 10: Serial.println("highground 10 :)");
break;
}
debounce_startTimer();menu_btnState = "high"; interruptState = "default"; Serial.println("stopped Countin V2"); Serial.println(saberState);
}
}
}
void checkBTNmenu_counting(){//menu_btnCounter gibt an wie lange der menĂĽ knopf schon gedrĂĽckt wurde (-> Blinken beim alten Lichtshwert)
if(menu_btnCounter == -1 && saberState == "menĂĽBTN" && digitalRead(BTN_MENU) == LOW){menu_btnCounter++; startTimer(); Serial.println("start Timer"); Serial.println(menu_btnCounter);}
else if(saberState == "menĂĽBTN" && stopTimer() > menu_btnTime && digitalRead(BTN_MENU) == LOW){startTimer(); menu_btnCounter++; Serial.println(menu_btnCounter); pixels.fill(pixels.Color(255,210,150), 0, NUMPIXELS); pixels.show(); delay(100);}
if(saberState == "menĂĽBTN" && digitalRead(BTN_MENU) == HIGH){}//saberState = "on";}
}
void checkBTNblasterProtect(){
if(interruptState == "blasterProtect" || bP_btnState == "low"){
if(stopTimer() > shortPress && digitalRead(BTN_BP) == LOW){if(interruptState != "default"){saberState = "lightningParry"; interruptState = "default"; bP_btnState = "low";}}else
if(stopTimer() < shortPress && digitalRead(BTN_BP) == HIGH && bP_btnState == "high"){saberState = "blasterProtect"; interruptState = "default"; bP_displayState = "new";}
if(digitalRead(BTN_BP) == HIGH && bP_btnState == "low"){debounce_startTimer();bP_btnState = "high"; saberState = "on"; interruptState = "default";}
}
}
void checkBTNmelt(){
if(interruptState == "melt" || melt_btnState == "low"){
if(stopTimer() > shortPress && digitalRead(BTN_MELT) == LOW){if(interruptState != "default"){saberState = "tipDrag"; interruptState = "default"; melt_btnState = "low";}}else
if(stopTimer() < shortPress && digitalRead(BTN_MELT) == HIGH && melt_btnState == "high"){if(saberState == "melt"){saberState = "on";}else{saberState = "melt";} interruptState = "default";}
if(digitalRead(BTN_MELT) == HIGH && melt_btnState == "low"){debounce_startTimer(); melt_btnState = "high"; saberState = "on"; interruptState = "default";}
}
}
//_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
//===<<<-ESP32-Functions->>>========================================================================================================================================================================================ESP32-Functions
void lightsaberSetup(){
pixels.setBrightness(stripeBrightness);
//stripes:
loadBufferRGB(L_modifiers_color_R,
L_modifiers_color_G,
L_modifiers_color_B,
L_modifiers_blinkColor_R2,
L_modifiers_blinkColor_G2,
L_modifiers_blinkColor_B2, false);
crystalStripesSetup(crystalStripesSetup_x1,
crystalStripesSetup_x2,
crystalStripesSetup_y1,
crystalStripesSetup_y2,
crystalStripesSetup_z1,
crystalStripesSetup_z2,
crystalStripesSetup_additionalStripes,false);
crystal_potiVal = round((float)((float)analogRead(crystalPOTI)/(float)4095)*(float)100);
//bC:
bC_loadBufferRGB(L_modifiers_color_R,
L_modifiers_color_G,
L_modifiers_color_B,
L_modifiers_blinkColor_R,
L_modifiers_blinkColor_G,
L_modifiers_blinkColor_B, false);
}
void startTimer(){
currentMillis = millis();
previousMillis = currentMillis;
//if(sD == true){Serial.println("Start Timer");}
}
unsigned long stopTimer(){
currentMillis = millis();
//if(sD == true){Serial.print("Stopped Timer at:");Serial.println(currentMillis - previousMillis);}
return(currentMillis - previousMillis);
}
void debounce_startTimer(){
debounce_currentMillis = millis();
debounce_previousMillis = debounce_currentMillis;
//if(sD == true){Serial.println("Start Timer");}
}
unsigned long debounce_stopTimer(){
debounce_currentMillis = millis();
//if(sD == true){Serial.print("Stopped Timer at:");Serial.println(currentMillis - previousMillis);}
return(debounce_currentMillis - debounce_previousMillis);
}