#include // Comes with Arduino IDE #include #include "LedControl.h" LedControl lc=LedControl(13,11,12,2); LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address #include #include shiftOutX regOne(10, 8, 9, MSBFIRST, 4); int trigger1 = 5; int trigger2 = 6; int trigger3 = 7; int dataPin = 8; //all LED pins int clockPin = 9; int latchPin = 10; int torpedos=22; boolean torpedosstatus; //4.2 far right middle int hyperdrive=23; boolean hyperdrivestatus; //2.2 left middle red int repair=24; boolean repairstatus; //4.1 ??? int laserleft=25; int laserleftstatus; //2.1 done int canopydown=26; //3.3 canopydown int targeting=27; boolean targetingstatus; //2.3 ??? int laserright=28; int laserrightstatus;//3.1 done int deflector=29; boolean deflectorstatus; //1.2 left leaning unbrella on the left int canopyup=30; //3.2 canopy up int keypad4 = 31; //# int keypad1 = 33; //7 int keypad2 = 35; //2 int keypadwrong = 37;//all wrong int keypad3 = 39;//3 #define rlMain1 44 #define rlMain2 45 #define rlOne 46 #define rlTwo 47 #define rlArduino2 48 #define remInput 50 #define canSensor 51 int buzzer = 53; boolean repairledstatus; int lasercountR; int lasercountL; int torpedocount; int prevI =0; boolean lastlaser; boolean leftreload; boolean rightreload; boolean triggerstatus; int keytrack; //variable to track key sequence int functionstatus; //variable that settles password entry once int wrongpasswordcount; boolean pwdprompt; boolean ledasc = true; boolean resetcanopylight = false; long lastDebounceTime = 0; // the last time the output pin was toggled long debounceDelay = 200; long repairstarttime = 0; long repairblink = 0; unsigned long lastDebounceTime1 = 0; // the last time the output pin was toggled unsigned long debounceDelay1 = 800; // the debounce time; increase if the output flickers unsigned long lastDebounceTime2 = 0; // the last time the output pin was toggled unsigned long debounceDelay2 = 4000; // the debounce time; increase if the output flickers long debounceDelayRemote = 800; int numOfRegisters = 2; byte* registerState; long effectId = 0; long prevEffect = 0; long effectRepeat = 0; long effectSpeed = 30; void setup() { //Initialize array registerState = new byte[numOfRegisters]; for (size_t i = 0; i < numOfRegisters; i++) {registerState[i] = 0; } Serial.begin(9600); Serial1.begin(9600); lc.shutdown(0,false); lc.shutdown(1,false); /* Set the brightness to a medium values */ lc.setIntensity(0,8); lc.setIntensity(1,8); /* and clear the display */ lc.clearDisplay(0); lc.clearDisplay(1); lasercountR=0; lasercountL=0; torpedocount = 8; //LED setup pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(deflector,INPUT_PULLUP); deflectorstatus = false; //shPin18 pinMode(hyperdrive,INPUT_PULLUP); hyperdrivestatus = LOW; //shPin17 pinMode(targeting,INPUT_PULLUP); targetingstatus = LOW; //shPin32 pinMode(repair,INPUT_PULLUP); repairstatus = LOW; //shPin21 pinMode(laserleft,INPUT_PULLUP); laserleftstatus = 0; //shPin19 pinMode(laserright,INPUT_PULLUP); laserrightstatus =0; //shPin20 pinMode(torpedos,INPUT_PULLUP); torpedosstatus = false; //shPin24 pinMode(canopyup,INPUT_PULLUP); //shPin22 pinMode(canopydown,INPUT_PULLUP); // shPin23 pinMode(trigger1,INPUT_PULLUP); pinMode(trigger2,INPUT_PULLUP); pinMode(trigger3,INPUT_PULLUP); pinMode(remInput,INPUT_PULLUP); pinMode(rlMain1,OUTPUT); digitalWrite(rlMain1, HIGH); pinMode(rlMain2,OUTPUT); digitalWrite(rlMain2, HIGH); pinMode(rlOne,OUTPUT); digitalWrite(rlOne, HIGH); pinMode(rlTwo,OUTPUT); digitalWrite(rlTwo, HIGH); pinMode(rlArduino2,OUTPUT); digitalWrite(rlArduino2, HIGH); pinMode(canSensor,INPUT_PULLUP); pinMode(keypad1,INPUT_PULLUP); pinMode(keypad2,INPUT_PULLUP); pinMode(keypad3,INPUT_PULLUP); pinMode(keypad4,INPUT_PULLUP); pinMode(keypadwrong,INPUT_PULLUP); keytrack =0; wrongpasswordcount = 0; functionstatus = 1; pwdprompt = true; lastlaser = false; leftreload = false; rightreload = false; triggerstatus = false; lcd.begin(20,4); lcd.clear(); lcd.backlight(); delay(250); lcd.noBacklight(); delay(250); } void loop() { Serial.println(functionstatus); if (digitalRead(remInput) == LOW) { if ((millis() - lastDebounceTime) > debounceDelayRemote) { lastDebounceTime = millis(); canopy(); } } if (pwdprompt==true) { pwdprompt=false; prepassword(); } if (functionstatus==1){ if (prevI==0){ ledasc =true; } else if (prevI==16){ ledasc = false; } if (ledasc == true){ regWrite(prevI, LOW); regWrite((prevI+1), HIGH); prevI=++prevI; delay(30); } else if (ledasc ==false){ regWrite(prevI, LOW); regWrite((prevI-1), HIGH); prevI=--prevI; delay(30); } if ((digitalRead(keypad1)==LOW) && (keytrack ==0)){ keytrack = 1; tone(buzzer, 500,200); }//if 7 pushed the keytrack goes to 1 if (digitalRead(keypad2)==LOW && keytrack ==1){ tone(buzzer, 500,200); keytrack = 2; }//if 2 pushed the keypad goes to 2 if (digitalRead(keypad3)==LOW && keytrack ==2){ tone(buzzer, 500,200); keytrack = 3; }//if 3 pushed the keypad goes to 3 if (digitalRead(keypad2)==LOW && keytrack ==3){ tone(buzzer, 500,200); keytrack = 4; }//if 2 pushed the keypad goes to 4 if (digitalRead(keypadwrong)==LOW){ tone(buzzer, 500,200); keytrack = 5; }//if any other key is pushed at any time the keypad goes to 5 if (digitalRead(keypad4)==LOW){//if # pushed then it checks for keytrack if (keytrack ==4){ keytrack = 0; tone(buzzer, 500,200); functionstatus=2; Serial1.print('J'); digitalWrite(rlArduino2, LOW); lcd.clear(); lcd.setCursor(3,0); lcd.print("Great job, Jedi"); lcd.setCursor(0,1); lcd.print("Get to know the"); lcd.setCursor(0,2); lcd.print("X-Wing before"); lcd.setCursor(0,3); lcd.print("engaging the engines"); regOne.allOn(); delay(1000); regOne.allOff();} else{ wrongpassword(); } } } else if (functionstatus==2) { if ((millis() - lastDebounceTime) > debounceDelay) { if (digitalRead(deflector) == LOW){ Serial.println("pushed"); if (deflectorstatus == false){ deflectorstatus = true; regOne.pinOn(shPin18); lcd.clear(); lcd.setCursor(3,0); lcd.print("Deflectors enabled"); lcd.setCursor(0,2); lcd.print("Remember, they"); lcd.setCursor(0,3); lcd.print("effect velocity"); Serial1.print('K');} else { deflectorstatus = false; regOne.pinOff(shPin18); lcd.clear(); lcd.setCursor(0,0); lcd.print("Deflectors disabled"); lcd.setCursor(0,2); lcd.print("Be cautious"); Serial1.print('L'); } lastDebounceTime = millis(); } if (digitalRead(hyperdrive) == LOW){ if (hyperdrivestatus == false){ hyperdrivestatus = true; regOne.pinOn(shPin17); lcd.clear(); lcd.setCursor(3,0); lcd.print("Hyperdrive enabled"); lcd.setCursor(0,1); lcd.print("Dont wonder too far"); lcd.setCursor(0,2); lcd.print("Imperials are around"); Serial1.print('M');} else { hyperdrivestatus = false; regOne.pinOff(shPin17); lcd.clear(); lcd.setCursor(0,0); lcd.print("Hyperdrive disabled"); lcd.setCursor(0,1); lcd.print("Return to base"); lcd.setCursor(0,2); lcd.print("immediately"); Serial1.print('N'); } lastDebounceTime = millis(); } if (digitalRead(targeting) == LOW){ if (targetingstatus== LOW){ targetingstatus = HIGH; regOne.pinOn(shPin32); } else {targetingstatus = LOW; regOne.pinOff(shPin32); } lastDebounceTime = millis(); } if (digitalRead(repair) == LOW){ if (repairstatus == LOW){ repairstatus = HIGH; regOne.pinOn(shPin21); repairstarttime = millis(); repairblink = millis(); repairledstatus = true; lcd.clear(); lcd.setCursor(0,0); lcd.print("....REPAIRING..."); Serial1.print('J'); } lastDebounceTime = millis(); } if (digitalRead(laserleft) == LOW){ regOne.pinOn(shPin19); matrixledL(); leftreload=true; lastDebounceTime = millis(); } if (digitalRead(laserright) == LOW){ regOne.pinOn(shPin20); matrixledR(); rightreload=true; lastDebounceTime = millis(); } if (digitalRead(torpedos) == LOW){ if (torpedosstatus == true){ torpedosstatus = false; regOne.pinOff(shPin24); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else { torpedosstatus = true; regOne.pinOn(shPin24); lcd.clear(); lcd.setCursor(0,0); lcd.print("---Torpedo count---"); lcd.setCursor(8,1); lcd.print(torpedocount); } lastDebounceTime = millis(); } if (digitalRead(trigger2) == LOW){ torpedosstatus = false; regOne.pinOff(shPin24); lastDebounceTime = millis(); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } if (digitalRead(trigger3) == LOW){ torpedosstatus = true; regOne.pinOn(shPin24); lastDebounceTime = millis(); lcd.clear(); lcd.setCursor(0,0); lcd.print("---Torpedo count---"); lcd.setCursor(8,1); lcd.print(torpedocount); } if (digitalRead(trigger1) == LOW){ if (torpedosstatus ==true){ torpedoshoot(); } else { matrixledS(); } lastDebounceTime = millis(); } if (digitalRead(canopyup) == LOW){ lastDebounceTime = millis(); if (digitalRead(canSensor) == HIGH) { canopyopen(); } } if (digitalRead(canopydown) == LOW){ lastDebounceTime = millis(); canopyclose(); } } if (repairstatus ==HIGH) { if ((millis() - repairstarttime) > 3000){ repairstatus = LOW; regOne.pinOff(shPin21); repairledstatus=false; lcd.clear(); } if ((millis() - repairblink) > 200){ if (repairledstatus == false) { regOne.pinOff(shPin21); repairledstatus = true; } else { regOne.pinOn(shPin21); repairledstatus = false; } repairblink = millis(); } } if (leftreload == true){ if((millis() - lastDebounceTime) > debounceDelay){ leftreload = false; regOne.pinOff(shPin19); } } if (rightreload == true){ if((millis() - lastDebounceTime) > debounceDelay){ rightreload = false; regOne.pinOff(shPin20); } } if (resetcanopylight==true){ if((millis() - lastDebounceTime) > debounceDelay){ resetcanopylight = false; regOne.pinOff(shPin22); regOne.pinOff(shPin23); } } } } void wrongpassword() { keytrack = 0; tone(buzzer, 100,500); if ((millis() - lastDebounceTime1) > debounceDelay1) { wrongpasswordcount = ++wrongpasswordcount; if (wrongpasswordcount == 1) { Serial1.print('A'); } if (wrongpasswordcount == 2) { Serial1.print('B'); } if (wrongpasswordcount == 3) { Serial1.print('C'); } if (wrongpasswordcount == 4) { Serial1.print('D'); } if (wrongpasswordcount == 5) { Serial1.print('E'); } if (wrongpasswordcount == 6) { Serial1.print('F'); } if (wrongpasswordcount == 7) { Serial1.print('G'); } if (wrongpasswordcount == 8) { Serial1.print('H'); } if (wrongpasswordcount > 8) { Serial1.print('I'); } lastDebounceTime1 = millis(); } } void torpedoshoot(){ if (torpedocount >0){ Serial1.print('Q'); torpedocount = --torpedocount; } else { Serial1.print('R'); } lcd.clear(); lcd.setCursor(0,0); lcd.print("---Torpedo count---"); lcd.setCursor(8,1); lcd.print(torpedocount); } void matrixledL(){ if (lasercountL < 8){ lasercountL = ++lasercountL; lc.setColumn(1,lasercountL-1,B11111111); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else { Serial1.print('J'); } } void matrixledR(){ if (lasercountR < 8){ lasercountR = ++lasercountR; lc.setColumn(0,lasercountR-1,B11111111); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else {Serial1.print('J'); } } void matrixledS(){ if (lastlaser==false){ if (lasercountL>0){ lastlaser=true; lc.setColumn(1,lasercountL-1,B00000000); lasercountL = --lasercountL; Serial1.print('P'); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else if (lasercountR>0){ lastlaser=false; lc.setColumn(0,lasercountR-1,B00000000); lasercountR = --lasercountR; Serial1.print('P'); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else { Serial1.print('Q'); lcd.clear(); lcd.setCursor(0,1); lcd.print("---Reload lasers---"); regOne.pinOn(shPin19); rightreload=true; regOne.pinOn(shPin20); leftreload=true; } } else { if (lasercountR>0){ lastlaser=false; lc.setColumn(0,lasercountR-1,B00000000); lasercountR = --lasercountR; Serial1.print('P'); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else if (lasercountL>0){ lastlaser=true; lc.setColumn(1,lasercountL-1,B00000000); lasercountL = --lasercountL; Serial1.print('P'); lcd.clear(); lcd.setCursor(0,0); lcd.print("----Laser count----"); lcd.setCursor(0,1); lcd.print("Right: "); lcd.setCursor(8,1); lcd.print(lasercountR); lcd.setCursor(0,2); lcd.print("Left: "); lcd.setCursor(8,2); lcd.print(lasercountL); } else { Serial1.print('Q'); lcd.clear(); lcd.setCursor(0,1); lcd.print("---Reload lasers---"); regOne.pinOn(shPin19); rightreload=true; regOne.pinOn(shPin20); leftreload=true; } } } void ledintro(){ int prevI = 0; for (int i = 0; i < 16; i++){ regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i;delay(30); } for (int i = 15; i >= 0; i--){ regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(30); } } void regWrite(int pin, bool state){//Determines register int reg = pin / 8; //Determines pin for actual register int actualPin = pin - (8 * reg); digitalWrite(latchPin, LOW); for (int i = 0; i < numOfRegisters; i++){ byte* states = ®isterState[i]; if (i == reg){ bitWrite(*states, actualPin, state); } shiftOut(dataPin, clockPin, MSBFIRST, *states); } digitalWrite(latchPin, HIGH); } void canopy() { if (digitalRead(canSensor) == LOW) { canopyclose(); } else { canopyopen(); } } void canopyclose(){ regOne.pinOn(shPin23); resetcanopylight=true; digitalWrite(rlMain1, HIGH); digitalWrite(rlMain2, HIGH); delay(10); digitalWrite(rlOne, LOW); digitalWrite(rlTwo, LOW); delay(10); digitalWrite(rlMain1, LOW); digitalWrite(rlMain2, LOW); if (functionstatus==0){ functionstatus=1; pwdprompt = true; lastDebounceTime2 = millis(); prepassword(); } } void canopyopen(){ regOne.pinOn(shPin22); resetcanopylight=true; digitalWrite(rlMain1, HIGH); digitalWrite(rlMain2, HIGH); delay(10); digitalWrite(rlOne, HIGH); digitalWrite(rlTwo, HIGH); delay(10); digitalWrite(rlMain1, LOW); digitalWrite(rlMain2, LOW); } void prepassword(){ regOne.allOn(); delay(1000); regOne.allOff(); delay(1000); for(int i = 0; i< 3; i++) {lcd.backlight(); delay(250); lcd.noBacklight(); delay(250);} lcd.backlight(); lcd.clear(); lcd.setCursor(3,0); lcd.print("Hello, Jedi!"); delay(500); lcd.setCursor(2,1); lcd.print("Enter the passcode"); delay(500); lcd.setCursor(0,2); lcd.print("on the keypad"); lcd.setCursor(0,3); delay(500); lcd.print("to start the T-65"); delay(500); }