#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);} //Serial.println(prevI); 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 (torpedosstatus == true){ // if((millis() - lastDebounceTime) > debounceDelay){torpedosstatus = false; regOne.pinOff(shPin24);}} 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); }