diff --git a/TableSoccer_Ledstrip/TableSoccer_Ledstrip.ino b/TableSoccer_Ledstrip/TableSoccer_Ledstrip.ino new file mode 100644 index 0000000..80561c9 --- /dev/null +++ b/TableSoccer_Ledstrip/TableSoccer_Ledstrip.ino @@ -0,0 +1,390 @@ +#include +#include +#include +#include +#ifdef __AVR__ +#include +#endif + +// Which pin on the NodeMCU is connected to the NeoPixels? +// On a Trinket or Gemma we suggest changing this to 1 +#define PIN 14 + +// How many NeoPixels are attached to the Arduino? +#define NUMPIXELS 31 + +Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); + +int blueToSave = 0; +int redToSave = 0; + +bool flagIncoming = false; +bool shootout = false; + +int color = 0; + +int flag[3][3]; + +int stillToSleep; + +HomieNode nodeGoal("goals", "goals"); +HomieNode nodeFlag("flag", "flag"); + +//animate Flag +void animateFlag(){ + if(color == 3){ + pixels.setPixelColor(15, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.show(); + for(int count = 1; count <= 15; ++count){ + delay(75); + pixels.setPixelColor(15 - count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.show(); + } + for(int count = 16; count > 5; --count){ + delay(75); + pixels.setPixelColor(15 - count, pixels.Color(flag[2][0],flag[2][1] ,flag[2][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } + } + else if(color == 2){ + for(int count = 16; count > 0; --count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + delay(75); + } + pixels.setPixelColor(15, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } + else if(color == 1){ + for(int count = 16; count > 0; --count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + delay(75); + } + pixels.setPixelColor(15, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } +} + +//Show Flag +void setFlagInstantly(){ + if(color == 3){ + pixels.setPixelColor(15, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + for(int count = 1; count <= 15; ++count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + } + for(int count = 16; count > 5; --count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[2][0],flag[2][1] ,flag[2][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + } + pixels.show(); + } + else if(color == 2){ + for(int count = 16; count > 0; --count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[1][0],flag[1][1] ,flag[1][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + } + pixels.setPixelColor(15, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } + else if(color == 1){ + for(int count = 16; count > 0; --count){ + pixels.setPixelColor(15 - count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + } + pixels.setPixelColor(15, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } +} + + +//animate Winning +void animateWin(boolean blue) { + if (blue) { + for (int count = 14; count <= 30; count++) { + pixels.setPixelColor(count, pixels.Color(0, 0, 255)); + pixels.show(); + delay(150); + } + for (int count = 1; count <= 13; count += 2) { + pixels.setPixelColor(count, pixels.Color(0, 0, 255)); + pixels.show(); + delay(150); + } + } + else { + pixels.setPixelColor(15, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + for(int count = 1; count <= 15; ++count){ + delay(75); + pixels.setPixelColor(15 - count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.setPixelColor(15 + count, pixels.Color(flag[0][0],flag[0][1] ,flag[0][2])); + pixels.show(); + } + } +} + +//animate new points +void animateLastPoint(boolean blue, int whichPoint) { + if (blue) { + for(int count = 14;count >= (whichPoint - 1); count--){ + if(count == 13){ + pixels.setPixelColor(14, pixels.Color(0, 150, 0)); + } + else if(count != 14){ + pixels.setPixelColor((count + 1), pixels.Color(0, 0, 0)); + } + if((whichPoint % 2) == 1){ + pixels.setPixelColor(count, pixels.Color(0, 0, 255)); + } + else{ + pixels.setPixelColor(count, pixels.Color(255, 255, 255)); + } + pixels.show(); + delay(100); + } + } + else{ + for(int count = 16; count <= (30 - whichPoint + 1); count++){ + if(count == 17){ + pixels.setPixelColor(16, pixels.Color(0, 150, 0)); + } + else if(count != 16){ + pixels.setPixelColor((count - 1), pixels.Color(0, 0, 0)); + } + if ((whichPoint % 2) == 1) { + pixels.setPixelColor(count, pixels.Color(255, 0, 0)); + } + else { + pixels.setPixelColor(count, pixels.Color(255, 96, 0)); + } + pixels.show(); + delay(100); + } + } +} + +//handle Led Strip update +void handleLedStipUpdate(int red, int blue, String toUpdate) { + pixels.setPixelColor(15, pixels.Color(0, 150, 0)); + pixels.show(); + + int blue0 = blue - blueToSave; + int red0 = red - redToSave; + + blueToSave = blue; + redToSave = red; + + if(blueToSave > redToSave){ + pixels.setPixelColor(15, pixels.Color(0, 0, 255)); + } + else if(blueToSave < redToSave){ + pixels.setPixelColor(15, pixels.Color(255, 0, 0)); + } + else{ + pixels.setPixelColor(15, pixels.Color(0, 150, 0)); + } + pixels.show(); + + if(toUpdate.equals("blue") || toUpdate.equals("red")){ + + if (blue > 14) { + blue = 14; + } + if (blue0 >= 1) { + for (int count = 0; count < (blue - 1); count++) { + if ((count % 2) == 0) { + pixels.setPixelColor(count, pixels.Color(0, 0, 255)); + } + else { + pixels.setPixelColor(count, pixels.Color(255, 255, 255)); + } + pixels.show(); + } + animateLastPoint(true, blue); + } + else { + for (int count = 0; count < blue; count++) { + if ((count % 2) == 0) { + pixels.setPixelColor(count, pixels.Color(0, 0, 255)); + } + else { + pixels.setPixelColor(count, pixels.Color(255, 255, 255)); + } + pixels.show(); + } + } + if (blue == 13) { + pixels.setPixelColor(14, pixels.Color(40, 40, 40)); + pixels.show(); + } + else if (blue < 13) { + pixels.setPixelColor(14, pixels.Color(0, 150, 0)); + pixels.show(); + } + if (blue != 14) { + for (int count = blue; count < 14; count++) { + pixels.setPixelColor(count, pixels.Color(0, 0, 0)); + pixels.show(); + } + } + else { + animateWin(true); + } + + + if (red > 14) { + red = 14; + } + if (red0 >= 1) { + for (int count = 30; count > (30 - red + 1); count--) { + if ((count % 2) == 0) { + pixels.setPixelColor(count, pixels.Color(255, 0, 0)); + } + else { + pixels.setPixelColor(count, pixels.Color(255, 96, 0)); + } + pixels.show(); + } + animateLastPoint(false, red); + } + else { + for (int count = 30; count > (30 - red); count--) { + if ((count % 2) == 0) { + pixels.setPixelColor(count, pixels.Color(255, 0, 0)); + } + else { + pixels.setPixelColor(count, pixels.Color(255, 96, 0)); + } + pixels.show(); + } + } + if (red == 13) { + pixels.setPixelColor(16, pixels.Color(40, 40, 40)); + pixels.show(); + } + else if (red < 13) { + pixels.setPixelColor(16, pixels.Color(0, 150, 0)); + pixels.show(); + } + if (red != 14) { + for (int count = (30 - red); count > 16; count--) { + pixels.setPixelColor(count, pixels.Color(0, 0, 0)); + pixels.show(); + } + } + else { + animateWin(false); + } + } +} + +bool whenMessageIncomingBlue(String value){ + handleLedStipUpdate(redToSave, value.toInt(), "blue"); + return true; +} +bool whenMessageIncomingRed(String value){ + handleLedStipUpdate(value.toInt(), blueToSave, "red"); + return true; +} + +bool whenMessageIncomingReset(String value){ + if(value.equals("true")){ + redToSave = 0; + blueToSave = 0; + handleLedStipUpdate(redToSave, blueToSave, "blue"); + handleLedStipUpdate(redToSave, blueToSave, "red"); + } + return true; +} + +bool whenMessageIncomingFlag(String value){ + if(value == "start"){ + flagIncoming = true; + } + else if(value == "shootout"){ + flagIncoming = true; + shootout = true; + } + else if(flagIncoming){ + if(value == "show"){ + flagIncoming = false; + if(shootout){ + setFlagInstantly(); + } + else{ + animateFlag(); + } + shootout = false; + color = 0; + flag[0][0] = -1; + flag[0][1] = -1; + flag[0][2] = -1; + flag[1][0] = -1; + flag[1][1] = -1; + flag[1][2] = -1; + flag[2][0] = -1; + flag[2][1] = -1; + flag[2][2] = -1; + return true; + } + if(flag[color][0] == -1){ + flag[color][0] = value.toInt(); + } + else if(flag[color][1] == -1){ + flag[color][1] = value.toInt(); + } + else if(flag[color][2] == -1){ + flag[color][2] = value.toInt(); + color += 1; + } + } + return true; +} + +//All up to setup! +void setup() { + + flag[0][0] = -1; + flag[0][1] = -1; + flag[0][2] = -1; + flag[1][0] = -1; + flag[1][1] = -1; + flag[1][2] = -1; + flag[2][0] = -1; + flag[2][1] = -1; + flag[2][2] = -1; + + nodeGoal.subscribe("blue", whenMessageIncomingBlue); + nodeGoal.subscribe("red", whenMessageIncomingRed); + nodeGoal.subscribe("reset", whenMessageIncomingReset); + nodeFlag.subscribe("flag", whenMessageIncomingFlag); + Homie.registerNode(nodeGoal); + Homie.registerNode(nodeFlag); + Homie.setFirmware("Table Soccer LedStrip Display", "1.0"); + Homie.setup(); + + //Begins Leds + pixels.begin(); + + //Define Pixel Led Layout + pixels.setPixelColor(14, pixels.Color(0, 150, 0)); + pixels.show(); + + pixels.setPixelColor(15, pixels.Color(0, 150, 0)); + pixels.show(); + + pixels.setPixelColor(16, pixels.Color(0, 150, 0)); + pixels.show(); +} + +//Loop every time over and over again! +void loop() { + Homie.loop(); +} +