Things used in this project

Schematics

MOSFET wiring for solenoid control
mosfet_540_arduino_vTBffkzd62.fzz

Code

Arduino controlled Pinball Machine CodeC/C++
Allows the Arduino to control the game play of a home made pinball machine. Controls lights, sensors, voltage to coils, scoring, etc.
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#include <SPI.h>
#include <SdFat.h>
#include <FreeStack.h>
//and the MP3 Shield Library
#include <SFEMP3Shield.h>
#include <EEPROMex.h>
#include <Arduino.h>

SdFat sd;
SFEMP3Shield MP3player;

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

 
 
 //Variables
int Balls = 1;  //Number of Balls
int MaxBalls = 5; //Number of Maxballs
int Lapscountertemp = 0;  //Testing
int Resetcounter =0;  //Reset at Loss of Ball
long Score = 0;  //Total Score


int adress = 0;
long Highscore;
long Bonus = 0;  //Bonus
int DoubleBonus = 0;
long DoubleBonuscounter = 0;  //Counter for 2xBonus
int AdvanceBonus = 0;   
int AdvanceBonuscounter = 0;
int Arrowcounter = 0;
int Arrowbonus = 0;
int DoubleBonus_Lit = 0; 
int Milli = 150; //Delay 1
int MilliRoll = 100; //Delay 2
int Milli_Bumper = 40; //Delay for Bumpers
int AZTEC_A = 0;
int AZTEC_Z = 0;
int AZTEC_T = 0;
int AZTEC_E = 0;
int AZTEC_C = 0;
int Ball_Bonus = 0;
int Kickout_Bonus =0;
int Target_Middle = 0;
int Target_Points = 0;
volatile int AttractMode = 0;
int Attractcounter1 = 0;
int Attractcounter2 = 0;
int Attractcounter3 = 0;
int Attractcounter4 = 0;
int Attractdelay1 = 800;
int Attractdelay2 = 400;
int Startplay_A = 0;
int Startplay_ACTIVE = 0;

int RolloverLinks_Rechts_int_last =LOW;
int RolloverMitte_int_last = LOW;
int Slingshots_Links_Rechts_last = LOW;
int kickoutreset = 0;

int  Target_Z_last= LOW;
int  Target_T_last= LOW;
int  Target_E_last= LOW;
int  Target_C_last= LOW;
int  Target_Middle_last= LOW;
int  Target_Points_last= LOW;
int  Ramp_last= LOW;

int SwitchtopLinks_Rechts_last = LOW;
int SwitchtopMitte_last = LOW;

int Outlanes_Links_Rechts_last =LOW;
int Sidelanes_Links_Rechts_last = LOW;


//Mosfet Variables
const long interval = 40;           // interval at which to trigger solenoids (milliseconds)
unsigned long  Solenoid_TimeTemp;
unsigned long  Solenoid_FireTime;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
int MosfetState = LOW;    

int Kickout_Trigger = 0;
int BumperLinks_Trigger = 0;
int BumperRechts_Trigger = 0;
int BumperUnten_Trigger = 0;

//PINS
//int Startplay = 19;
int RolloverLinks_Rechts = 22; 
int RolloverMitte = 23;

int Kickout = 24; 
int Bumper_Links = 25; 
int Bumper_Rechts = 26; 
int Bumper_Unten = 27; 

int Target_Z = 28; 
int Target_T = 29; 
int Target_E = 30; 
int Target_C = 31; 
int Target_M = 32; 
int Target_P = 33; 

int SwitchtopLinks_Rechts = 34; 
int SwitchtopMitte = 35;
int Release = 36; 


int Spinner = 37;
int Ramp = 38;
int Slingshots_Links_Rechts = 39;


int Outlanes_Links_Rechts = 42;
int Sidelanes_Links_Rechts = 43;
const int solenoidPin_Kickout = 44;
const int solenoidPin_BumperLinks = 45;
const int solenoidPin_BumperRechts = 46;


//50,51,52 Display
const int solenoidPin_Release = 49;
const int solenoidPin_BumperUnten = 48;


//Lights

char Light_A = A0;    //x2
char Light_Z = A1;    //x2
char Light_T = A2;    //x2
char Light_E = A3;    //x2
char Light_C = A4;    //x2
char Light_Ball_Bonus = A5;
int Light_A_Target = A6;
int Light_Z_Target = A7;
int Light_T_Target = A8;
int Light_E_Target = A9;
int Light_C_Target = A10;
int Light_Arrow = A11;
int Light_Double_Bonus_Lit = A12;   //x2
int Light_Advance_Bonus = A13;  //x3
int Light_Double_Bonus = A14;  //x1

int Light__Bonus_1 = 14;
int Light__Bonus_2 = 15;
int Light__Bonus_3 = 16;
int Light__Bonus_4 = 17;
int Light__Bonus_5 = 41;//18
int Light__Bonus_6 = 19;  
int Light__Bonus_7 = 40;
int Light__Bonus_8 = A15;
int Light__Bonus_9 = 5;
int Light__Bonus_10 = 47;
//mp3 shield 2,2,3,6,7,8,9

//-A15

//SOUNDS

//1 Bumper
//2 Slingshots
//3 Spinner
//4 Target
//5 Kickoutlane
//6 Ball lost
//7 Game Over

void setup() {
  // put your setup code here, to run once:



  
lcd.begin(16,4);   // initialize the lcd for 16 chars 4 lines, turn on backlight
lcd.clear();
lcd.print("Aztec Pinball");


//MP3

sd.begin(SD_SEL, SPI_FULL_SPEED);
MP3player.begin();
//

//Variables



// Inputs

 pinMode(RolloverLinks_Rechts,INPUT);  //Rollover Left and right
 pinMode(RolloverMitte,INPUT);  //Rollover Mid
 pinMode(Target_Z,INPUT);  //Target Z
 pinMode(Target_T,INPUT);  //Target T
 pinMode(Target_E,INPUT);  //Target E
 pinMode(Target_C,INPUT);  //Target C
 pinMode(Target_M,INPUT);  //Target M
 pinMode(Target_P,INPUT);  //Target P

 pinMode(Release,INPUT);  //Release
 pinMode(Kickout,INPUT);  //Kickout
 pinMode(Bumper_Rechts,INPUT); 
 pinMode(Bumper_Links,INPUT); 
 pinMode(Bumper_Unten,INPUT); 

pinMode(SwitchtopLinks_Rechts,INPUT); 
pinMode(SwitchtopMitte,INPUT); 
pinMode(Spinner,INPUT); 
pinMode(Ramp,INPUT); 

//pinMode(Startplay,INPUT); 
pinMode(Outlanes_Links_Rechts,INPUT); 
pinMode(Sidelanes_Links_Rechts,INPUT); 

//Outputs
pinMode(solenoidPin_Release, OUTPUT);
pinMode(solenoidPin_Kickout, OUTPUT);
pinMode(solenoidPin_BumperLinks, OUTPUT);
pinMode(solenoidPin_BumperRechts, OUTPUT);
pinMode(solenoidPin_BumperUnten, OUTPUT);


pinMode(Light_A, OUTPUT);
pinMode(Light_Z, OUTPUT);
pinMode(Light_T, OUTPUT);
pinMode(Light_E, OUTPUT);
pinMode(Light_C, OUTPUT);
pinMode(Light_Ball_Bonus, OUTPUT);
pinMode(Light_Arrow, OUTPUT);

pinMode(Light_A_Target, OUTPUT);
pinMode(Light_Z_Target, OUTPUT);
pinMode(Light_T_Target, OUTPUT);
pinMode(Light_E_Target, OUTPUT);
pinMode(Light_C_Target, OUTPUT);

pinMode(Light_Double_Bonus_Lit, OUTPUT);
pinMode(Light_Double_Bonus, OUTPUT);
pinMode(Light_Advance_Bonus, OUTPUT);

pinMode(Light__Bonus_1, OUTPUT);
pinMode(Light__Bonus_2, OUTPUT);
pinMode(Light__Bonus_3, OUTPUT);
pinMode(Light__Bonus_4, OUTPUT);
pinMode(Light__Bonus_5, OUTPUT);
pinMode(Light__Bonus_6, OUTPUT);
pinMode(Light__Bonus_7, OUTPUT);
pinMode(Light__Bonus_8, OUTPUT);
pinMode(Light__Bonus_9, OUTPUT);
pinMode(Light__Bonus_10, OUTPUT);
/////////

digitalWrite(Light_A, LOW);
digitalWrite(Light_Z, LOW);
digitalWrite(Light_T, LOW);
digitalWrite(Light_E, LOW);
digitalWrite(Light_C, LOW);
digitalWrite(Light_Ball_Bonus, LOW);
digitalWrite(Light_Arrow, LOW);

digitalWrite(Light_Double_Bonus_Lit, LOW); 
digitalWrite(Light_Double_Bonus, LOW); 
digitalWrite(Light_Advance_Bonus, LOW); 

digitalWrite(Light_A_Target, HIGH); 
digitalWrite(Light_Z_Target, HIGH); 
digitalWrite(Light_T_Target, HIGH); 
digitalWrite(Light_E_Target, HIGH); 
digitalWrite(Light_C_Target, HIGH); 

digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light__Bonus_3, LOW); 
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light__Bonus_6, LOW); 
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light__Bonus_10, LOW); 


}  //END SETUP

//////////////////////////////////////////////////////////////////////////////////////////////////////////MAIN
void loop() { 
  // put your main code here, to run repeatedly:


EIFR = bit (INTF5);
attachInterrupt(5, interruptstart, RISING);

  
if (AttractMode == 0) {

ATTRACT();
  } //END ATTRACT



if (AttractMode == 1)  {


if (Startplay_ACTIVE == 0){

    Startplay_ACTIVE = 1;
    MP3player.stopTrack();
    MP3player.playMP3("009.mp3");
    ResetGame();
    Kickout_ball();
}

unsigned long currentMillis = millis();       //Starting Time
detectCollision();                              //Collision and Switch detection
control_lights();                              //Lights
check_conditions();                            //Checks for Bonuses

//Timed Soneloid Triggers running in Main Loop


//MOSFET !

int difference = currentMillis - previousMillis;
 
 if ((difference >= interval)and (BumperLinks_Trigger == 1)) {
   previousMillis = currentMillis; 
  BumperLinks_Trigger = 0;
 digitalWrite(solenoidPin_BumperLinks, LOW);
 }
if ((difference >= interval)and (BumperRechts_Trigger == 1)) {
   previousMillis = currentMillis; 
  BumperRechts_Trigger = 0;
 digitalWrite(solenoidPin_BumperRechts, LOW);
 } 
 if ((difference >= interval)and (BumperUnten_Trigger == 1)) {
   previousMillis = currentMillis; 
  BumperUnten_Trigger = 0;
 digitalWrite(solenoidPin_BumperUnten, LOW);
 }

}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////MAIN ENDE
void interruptstart(){      //  ISR!
  
    AttractMode = 1;
    detachInterrupt(5);
  }


void ATTRACT (){      //Bad, lazy code !!
long Highscore = EEPROM.readLong(adress);
lcd.clear();
lcd.print("Aztec Pinball");
lcd.setCursor(0,1);
lcd.print("Highscore  ");
lcd.print(Highscore);

  
while (AttractMode == 0) {
    

lcd.clear();
lcd.print("Aztec Pinball");
lcd.setCursor(0,1);
lcd.print("Highscore  ");
lcd.print(Highscore);

Attractcounter1 = 0;
Attractcounter2 = 0;
Attractcounter3 = 0;
Attractcounter4 = 0;
AttractMode = 0;

digitalWrite(Light_A_Target, LOW); 
digitalWrite(Light_Z_Target, LOW); 
digitalWrite(Light_T_Target, LOW); 
digitalWrite(Light_E_Target, LOW); 
digitalWrite(Light_C_Target, LOW); 
digitalWrite(Light_A, LOW);
digitalWrite(Light_Z, LOW);
digitalWrite(Light_T, LOW);
digitalWrite(Light_E, LOW);
digitalWrite(Light_C, LOW);
digitalWrite(Light_Ball_Bonus, LOW);
digitalWrite(Light_Arrow, LOW);
digitalWrite(Light_Double_Bonus_Lit, LOW); 
digitalWrite(Light_Double_Bonus, LOW); 
digitalWrite(Light_Advance_Bonus, LOW); 
digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light__Bonus_3, LOW); 
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light__Bonus_6, LOW); 
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light__Bonus_10, LOW); 




digitalWrite(Light__Bonus_1, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;}; 
digitalWrite(Light__Bonus_2, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_3, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_4, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_5, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_6, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_7, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_8, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_9, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_10, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
while (Attractcounter1 <4){
digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light__Bonus_3, LOW); 
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light__Bonus_6, LOW); 
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light__Bonus_10, LOW); 
delay(Attractdelay2);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_1, HIGH); 
digitalWrite(Light__Bonus_2, HIGH); 
digitalWrite(Light__Bonus_3, HIGH); 
digitalWrite(Light__Bonus_4, HIGH); 
digitalWrite(Light__Bonus_5, HIGH); 
digitalWrite(Light__Bonus_6, HIGH); 
digitalWrite(Light__Bonus_7, HIGH); 
digitalWrite(Light__Bonus_8, HIGH); 
digitalWrite(Light__Bonus_9, HIGH); 
digitalWrite(Light__Bonus_10, HIGH);     
delay(Attractdelay2);if (AttractMode == 1)  {break;};
Attractcounter1 +=1;
}

digitalWrite(Light_A, HIGH);
digitalWrite(Light_A_Target, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Z, HIGH);
digitalWrite(Light_Z_Target, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_T, HIGH);
digitalWrite(Light_T_Target, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_E, HIGH);
digitalWrite(Light_E_Target, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_C, HIGH);
digitalWrite(Light_C_Target, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};

while (Attractcounter2 <4){
digitalWrite(Light_A, LOW);
digitalWrite(Light_A_Target, LOW); 
digitalWrite(Light_Z, LOW);
digitalWrite(Light_Z_Target, LOW); 
digitalWrite(Light_T, LOW);
digitalWrite(Light_T_Target, LOW); 
digitalWrite(Light_E, LOW);
digitalWrite(Light_E_Target, LOW); 
digitalWrite(Light_C, LOW);    
digitalWrite(Light_C_Target, LOW); 
delay(Attractdelay2);if (AttractMode == 1)  {break;};
digitalWrite(Light_A, HIGH);
digitalWrite(Light_A_Target, HIGH); 
digitalWrite(Light_Z, HIGH);
digitalWrite(Light_Z_Target, HIGH); 
digitalWrite(Light_T, HIGH);
digitalWrite(Light_T_Target, HIGH); 
digitalWrite(Light_E, HIGH);
digitalWrite(Light_E_Target, HIGH); 
digitalWrite(Light_C, HIGH);
digitalWrite(Light_C_Target, HIGH); 
delay(Attractdelay2);if (AttractMode == 1)  {break;};
Attractcounter2 +=1;
}

digitalWrite(Light_Ball_Bonus, HIGH);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Arrow, HIGH);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Double_Bonus_Lit, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Double_Bonus, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Advance_Bonus, HIGH); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
while (Attractcounter3 <4){
digitalWrite(Light_Ball_Bonus, LOW);
digitalWrite(Light_Arrow, LOW);
digitalWrite(Light_Double_Bonus_Lit, LOW); 
digitalWrite(Light_Double_Bonus, LOW); 
digitalWrite(Light_Advance_Bonus, LOW); 
delay(Attractdelay2);if (AttractMode == 1)  {break;};
digitalWrite(Light_Ball_Bonus, HIGH);
digitalWrite(Light_Arrow, HIGH);
digitalWrite(Light_Double_Bonus_Lit, HIGH); 
digitalWrite(Light_Double_Bonus, HIGH); 
digitalWrite(Light_Advance_Bonus, HIGH); 
delay(Attractdelay2);if (AttractMode == 1)  {break;};
Attractcounter3 +=1;
}
delay(2000);if (AttractMode == 1)  {break;};

digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light_Ball_Bonus, LOW);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light_C, LOW); 
digitalWrite(Light_Z_Target, LOW);  
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_3, LOW); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light_E, LOW);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Arrow, LOW);
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light_T_Target, LOW); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_6,LOW); 
digitalWrite(Light_T, LOW);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light_Advance_Bonus, LOW); 
digitalWrite(Light_E_Target, LOW); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light_Double_Bonus_Lit, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light_Z, LOW);
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light_C_Target, LOW); 
digitalWrite(Light_Double_Bonus, LOW);  
delay(Attractdelay1);if (AttractMode == 1)  {break;};
digitalWrite(Light__Bonus_10, LOW);
digitalWrite(Light_A, LOW);
digitalWrite(Light_A_Target, LOW); 
delay(Attractdelay1);if (AttractMode == 1)  {break;};



}
}

void check_conditions(){
 if ((AZTEC_A ==1) && (AZTEC_Z ==1) && (AZTEC_T ==1) && (AZTEC_E ==1) && (AZTEC_C ==1 && (Resetcounter ==0))){
  Ball_Bonus =1;
  DoubleBonus =1;
  Resetcounter = 1;
 }

 if (DoubleBonuscounter >50) {
  DoubleBonus =1; 
 }



 if (AdvanceBonuscounter >10) {
  if (AdvanceBonus == 0) {
    AdvanceBonus ==1; 
  }
  else if (AdvanceBonus == 1) {
    AdvanceBonus ==0;
  }
  AdvanceBonuscounter = 0;
 }
}


void detectCollision(){
  
int RolloverLinks_Rechts_int = digitalRead(RolloverLinks_Rechts);  //Variable for Rollover Switches
int RolloverMitte_int = digitalRead(RolloverMitte);  //Variable for Rollover Switches

int SwitchtopLinks_Rechts_int = digitalRead(SwitchtopLinks_Rechts);  //Variable for Rollover Switches
int SwitchtopMitte_int = digitalRead(SwitchtopMitte);  //Variable for Rollover Switches
int Ramp_int = digitalRead(Ramp);  //Variable for Ramp
int Spinner_int = digitalRead(Spinner);  //Variable for Spinner
int Outlanes_Links_Rechts_int = digitalRead(Outlanes_Links_Rechts);  //Variable for Outlanes Links Rechts
int Sidelanes_Links_Rechts_int = digitalRead(Sidelanes_Links_Rechts);  //Variable for Sidelanes Links Rechts
int Slingshots_Links_Rechts_int = digitalRead(Slingshots_Links_Rechts);  //Variable for Sidelanes Links Rechts

int Target_Z_int = digitalRead(Target_Z);  //Variable for Target Z
int Target_T_int = digitalRead(Target_T);  //Variable for Target T
int Target_E_int = digitalRead(Target_E);  //Variable for Target E
int Target_C_int = digitalRead(Target_C);  //Variable for Target C
int Target_M_int = digitalRead(Target_M);  //Variable for Target M
int Target_P_int = digitalRead(Target_P);  //Variable for Target P

//Rollovers Links und Rechts und Mitte

if ((RolloverLinks_Rechts_int == HIGH) && (RolloverLinks_Rechts_int_last == LOW)  ){      //Rollover pressed

Score100f();
RolloverLinks_Rechts_int_last = HIGH;
 MP3player.stopTrack();
 MP3player.playMP3("001.mp3");
}

else if ((RolloverLinks_Rechts_int == LOW) && (RolloverLinks_Rechts_int_last == HIGH)  ){    //Rollover released
 RolloverLinks_Rechts_int_last = LOW; 
delay (MilliRoll);
}

if ((RolloverMitte_int == HIGH) && (RolloverMitte_int_last == LOW)  ){      //Rollover pressed

Bonusf();
RolloverMitte_int_last = HIGH;
 MP3player.stopTrack();
MP3player.playMP3("001.mp3");
}

else if ((RolloverMitte_int == LOW) && (RolloverMitte_int_last == HIGH)  ){ //Rollover released
 RolloverMitte_int_last = LOW;
 delay (MilliRoll); 
}
//Switches Left, right and mid


if ((SwitchtopLinks_Rechts_int == HIGH) && (SwitchtopLinks_Rechts_last == LOW)  ){      //Rollover pressed

Arrowbonus =0;      //deacitvate Spinner Bonus 

if (AdvanceBonus == 0) {  
Score1000f();
}
else if (AdvanceBonus == 1) {  
Score1000f();
Bonusf();
AdvanceBonus = 0;
}


SwitchtopLinks_Rechts_last = HIGH;
//MP3player.stopTrack();
// MP3player.playMP3("001.mp3");
}

else if ((SwitchtopLinks_Rechts_int == LOW) && (SwitchtopLinks_Rechts_last == HIGH)  ){    //Rollover released
 SwitchtopLinks_Rechts_last = LOW; 
delay (MilliRoll);
}

if ((SwitchtopMitte_int == HIGH) && (SwitchtopMitte_last == LOW)  ){      //Rollover pressed
Arrowbonus = 1;        //acitvate Spinner Bonus 
AZTEC_Af();
SwitchtopMitte_last = HIGH;
//MP3player.stopTrack();
 //MP3player.playMP3("001.mp3");
}

else if ((SwitchtopMitte_int == LOW) && (SwitchtopMitte_last == HIGH)  ){    //Rollover released
 SwitchtopMitte_last = LOW; 
delay (MilliRoll);
}

//Slingshots

if ((Slingshots_Links_Rechts_int == HIGH) && (Slingshots_Links_Rechts_last == LOW)  ){      //Rollover pressed


Score150f();
MP3player.stopTrack();
MP3player.playMP3("002.mp3");
 DoubleBonuscounter +=1; 
 //lcd.setCursor(4,3);
 //lcd.print("Slingshots");
Slingshots_Links_Rechts_last = HIGH;
}

else if ((Slingshots_Links_Rechts_int == LOW) && (Slingshots_Links_Rechts_last == HIGH)  ){    //Rollover released
 Slingshots_Links_Rechts_last = LOW; 
delay (MilliRoll);
}


//Outlanes

if ((Outlanes_Links_Rechts_int == HIGH) && (Outlanes_Links_Rechts_last == LOW)  ){      //Rollover pressed

Bonusf();
Score10000f();
 //lcd.setCursor(4,3);
 //lcd.print("Outlane");
Outlanes_Links_Rechts_last = HIGH;
MP3player.stopTrack();
 MP3player.playMP3("001.mp3");
}

else if ((Outlanes_Links_Rechts_int == LOW) && (Outlanes_Links_Rechts_last == HIGH)  ){    //Rollover released
 Outlanes_Links_Rechts_last = LOW; 
delay (MilliRoll);
}


//Sidelanes

if ((Sidelanes_Links_Rechts_int == HIGH) && (Sidelanes_Links_Rechts_last == LOW)  ){      //Rollover pressed


Score5000f();
//lcd.setCursor(4,3);
//lcd.print("Sidelane");
Sidelanes_Links_Rechts_last = HIGH;
MP3player.stopTrack();
 MP3player.playMP3("001.mp3");
}

else if ((Sidelanes_Links_Rechts_int == LOW) && (Sidelanes_Links_Rechts_last == HIGH)  ){    //Rollover released
 Sidelanes_Links_Rechts_last = LOW; 
delay (MilliRoll);
}



  


//RAMP
if ((Ramp_int == HIGH) && (Ramp_last == LOW)  ){      //RAMP Pressed

Rampf();
Ramp_last = HIGH;
}

else if ((Ramp_int == LOW) && (Ramp_last == HIGH)  ){    //Ramp released
 Ramp_last = LOW; 
delay (MilliRoll);
}



// TARGETS

if ((Target_Z_int == HIGH) && (Target_Z_last == LOW)  ){      //Target hit
Target_Z_last = HIGH;
  
  AZTEC_Z = 1;
  Score = Score +1000;
  //lcd.setCursor(4,3);
  //lcd.print("Z");   
  MP3player.stopTrack();
  MP3player.playMP3("004.mp3");
  
delay (MilliRoll); 
}

else if ((Target_Z_int == LOW) && (Target_Z_last == HIGH)  ){ //Target released
 Target_Z_last = LOW;
 delay (MilliRoll); 
}

if ((Target_T_int == HIGH) && (Target_T_last == LOW)  ){      //Target hit
Target_T_last = HIGH;

  AZTEC_T = 1;
  Score = Score +1000;
  //lcd.setCursor(4,3);
  //lcd.print("T");   
  MP3player.stopTrack();
  MP3player.playMP3("004.mp3");
  
delay (MilliRoll); 
}

else if ((Target_T_int == LOW) && (Target_T_last == HIGH)  ){ //Target released
 Target_T_last = LOW;
 delay (MilliRoll); 
}

if ((Target_E_int == HIGH) && (Target_E_last == LOW)  ){      //Target hit
Target_E_last = HIGH;

  AZTEC_E = 1;
  Score = Score +1000;
  //lcd.setCursor(4,3);
  //lcd.print("E");   
  MP3player.stopTrack();
  MP3player.playMP3("004.mp3");
  
delay (MilliRoll); 
}

else if ((Target_E_int == LOW) && (Target_E_last == HIGH)  ){ //Target released
 Target_E_last = LOW;
delay (MilliRoll); 
}


if ((Target_C_int == HIGH) && (Target_C_last == LOW)  ){      //Target hit
Target_C_last = HIGH;

  AZTEC_C = 1;
  Score = Score +1000;
  //lcd.setCursor(4,3);
  //lcd.print("C");   
  MP3player.stopTrack();
  MP3player.playMP3("004.mp3");
  
delay (MilliRoll); 
}

else if ((Target_C_int == LOW) && (Target_C_last == HIGH)  ){ //Target released
 Target_C_last = LOW;
 delay (MilliRoll); 
}

if ((Target_M_int == HIGH) && (Target_Middle_last == LOW)  ){      //Target hit
Target_Middle_last = HIGH;

  Target_Middle = 1;
  Score = Score +500; 
      if (Ball_Bonus ==1){
       MaxBalls +=1;
       Ball_Bonus = 0;
      digitalWrite(Light_Ball_Bonus, LOW);
      }
  
  MP3player.stopTrack();
  MP3player.playMP3("004.mp3");
  Bonusf();
  
delay (MilliRoll); 
}

else if ((Target_M_int == LOW) && (Target_Middle_last == HIGH)  ){ //Target released
 Target_Middle_last = LOW;
 delay (MilliRoll); 
}

if ((Target_P_int == HIGH) && (Target_Points_last == LOW)  ){      //Target hit
Target_Points_last = HIGH;

Target_Points += 1;
//MP3player.stopTrack();
//MP3player.playMP3("004.mp3");

    if (AdvanceBonus == 0) {  
        Score1000f();
        }
    else if (AdvanceBonus == 1) {  
        Score1000f();
        Bonusf();
        AdvanceBonus =0;
        }

delay (45); //shorter because of Bumpers
}

else if ((Target_P_int == LOW) && (Target_Points_last == HIGH)  ){ //Target released
 Target_Points_last = LOW;
 delay (MilliRoll); 
}


//SPINNER
if ((digitalRead(Spinner) == HIGH) ){

Spinnerf();

}



//Ball Release
if ((digitalRead(Release) == HIGH) ){
Releasef();

}

//Kickout
if ((digitalRead(Kickout) == HIGH)&& (kickoutreset ==0) ){
kickoutreset = 1;
Kickoutf();

}

//Bumpers
if ((digitalRead(Bumper_Links) == HIGH) ){

BumperLf();

}
if ((digitalRead(Bumper_Rechts) == HIGH) ){

BumperRf();

}
if ((digitalRead(Bumper_Unten) == HIGH) ){

BumperUf();

}
}  // ENDE Collision Detection


//Lights

void control_lights(){
  
if (AZTEC_A ==1){
  digitalWrite(Light_A, HIGH);
  digitalWrite(Light_A_Target, LOW); 
}
if (AZTEC_Z ==1){
  digitalWrite(Light_Z, HIGH);
   digitalWrite(Light_Z_Target, LOW); 
}
if (AZTEC_T ==1){
  digitalWrite(Light_T, HIGH);
   digitalWrite(Light_T_Target, LOW); 
}
if (AZTEC_E ==1){
  digitalWrite(Light_E, HIGH);
   digitalWrite(Light_E_Target, LOW); 
}
if (AZTEC_C ==1){
  digitalWrite(Light_C, HIGH);
   digitalWrite(Light_C_Target, LOW); 
}
if (Ball_Bonus ==1){
  digitalWrite(Light_Ball_Bonus, HIGH);
}

if (DoubleBonus == 1){
  
  digitalWrite(Light_Double_Bonus, HIGH);
}

else if (DoubleBonus == 0){
    digitalWrite(Light_Double_Bonus, LOW);
}

//###########
if (DoubleBonus_Lit ==1){
  
  digitalWrite(Light_Double_Bonus_Lit, HIGH);
}

else if (DoubleBonus_Lit ==0){
    digitalWrite(Light_Double_Bonus_Lit, LOW);
}

//################





if (Arrowbonus ==1){
  digitalWrite(Light_Arrow, HIGH);
  }

else if (Arrowbonus ==0){
  digitalWrite(Light_Arrow, LOW);
  }


if (AdvanceBonus == 1) {
  digitalWrite(Light_Advance_Bonus, HIGH);
}
else if (AdvanceBonus == 0) {
  digitalWrite(Light_Advance_Bonus, LOW);
}

//Bonus Lights
//###############

if (Bonus == 5000) {
  digitalWrite(Light__Bonus_1, HIGH); 
}
else if (Bonus == 10000) {
  digitalWrite(Light__Bonus_2, HIGH); 
}

else if (Bonus == 15000) {
  digitalWrite(Light__Bonus_3, HIGH); 
}
else if (Bonus == 20000) {
  digitalWrite(Light__Bonus_4, HIGH); 
}
else if (Bonus == 25000) {
  digitalWrite(Light__Bonus_5, HIGH); 
}
else if (Bonus == 30000) {
  digitalWrite(Light__Bonus_6, HIGH); 
}
else if (Bonus == 35000) {
  digitalWrite(Light__Bonus_7, HIGH); 
}
else if (Bonus == 40000) {
  digitalWrite(Light__Bonus_8, HIGH); 
}
else if (Bonus == 45000) {
  digitalWrite(Light__Bonus_9, HIGH); 
}
else if (Bonus == 50000) {
  digitalWrite(Light__Bonus_10, HIGH); 
}

//###############
}










//Scoring



void Score100f()
{
  Score = Score +100;
  AdvanceBonuscounter +=1;
  ScoreDisplay();     //Show Score
 delay(Milli);
}

void Score150f()    //Slingshots
{
  Score = Score +150;
  
  ScoreDisplay();     //Show Score
 delay(Milli);
}

void Score1000f()
{
  Score = Score +1000;
  AdvanceBonuscounter +=1;
  ScoreDisplay();     //Show Score
 delay(Milli);
}
void Score5000f()
{
  Score = Score +5000;
  AdvanceBonuscounter +=1;
  ScoreDisplay();     //Show Score
 delay(Milli);
}

void Score10000f()
{
  Score = Score +10000;
  
  ScoreDisplay();     //Show Score
 delay(Milli);
}

void Kickoutscoref(){
  int AZTEC_SUM = (AZTEC_A + AZTEC_Z +AZTEC_T +AZTEC_E +AZTEC_C);
   
   if (DoubleBonus_Lit == 0) {      //##########
   Score = Score +(5000* AZTEC_SUM);
   }
   else if (DoubleBonus_Lit == 1) {     //##########
   Score = Score +(10000* AZTEC_SUM);
   DoubleBonus = 1;
   }
   AdvanceBonuscounter +=1;
}



void Bonusf()
{
  if (Bonus < 50000){
  Bonus = Bonus +5000;
  }
  ScoreDisplay();     //Show Score
  AdvanceBonuscounter +=1;
 delay(Milli);
}



void Spinnerf(){
  
  MP3player.stopTrack();
  MP3player.playMP3("003.mp3");
  
  if (Arrowbonus == 0) {
  Score = Score +100;
  }
  else if (Arrowbonus == 1) {
  Score = Score +1000;
  }
  
  ScoreDisplay();     //Show Score
 //  lcd.setCursor(4,3);
//  lcd.print("SPINNER !");
 delay(50);
}


void AZTEC_Af(){
  //lcd.setCursor(4,3);
 //lcd.print("Aztec AF called ");
 //lcd.print(AZTEC_A); 
   AZTEC_A = 1;
  Score = Score +1000;
  AdvanceBonuscounter +=1;
  
  //lcd.setCursor(4,3);
  //lcd.print("A");   
  delay(Milli);
}

void Rampf() {
  Bonusf();
  if (DoubleBonus_Lit == 1){        //##########
    DoubleBonus = 1;
  }
  //lcd.setCursor(4,3);
  //lcd.print("Ramp");   
  delay(Milli); 
}








void BumperLf()
{
  Score = Score +200;
  DoubleBonuscounter +=1;
  ScoreDisplay();     //Show Score
  
  previousMillis = millis(); 
  digitalWrite(solenoidPin_BumperLinks, HIGH);
  BumperLinks_Trigger =1 ;
  

  
  delay(Milli_Bumper);

  
}
void BumperRf()
{
  Score = Score +200;
  DoubleBonuscounter +=1;
  ScoreDisplay();     //Show Score
   
  previousMillis = millis(); 
  digitalWrite(solenoidPin_BumperRechts, HIGH);
  BumperRechts_Trigger =1 ;
  

  
  delay(Milli_Bumper);
  
}


void BumperUf()
{
  Score = Score +200;
  DoubleBonuscounter +=1;
  ScoreDisplay();     //Show Score
  
  previousMillis = millis(); 
  digitalWrite(solenoidPin_BumperUnten, HIGH);
  BumperUnten_Trigger =1 ;



  delay(Milli_Bumper);
}


void Kickoutf()
{
  Kickoutscoref();
  
  ScoreDisplay();     //Show Score
  
 MP3player.stopTrack();
MP3player.playMP3("005.mp3");
  delay(1000);
  digitalWrite(solenoidPin_Kickout, HIGH);
  
 delay(Milli);
 digitalWrite(solenoidPin_Kickout,LOW);
 delay(250);
 kickoutreset = 0;
}



void Releasef()
{
  
  
 if (Balls <MaxBalls){
  Balls +=1;
  
  lcd.clear();
  lcd.setCursor(4,3);
  lcd.print("Ball Lost");   
 
 
 Ball_Lost();

 }
 
else if (Balls >=MaxBalls){
  lcd.clear();
  lcd.setCursor(4,3);
  lcd.print("Game Over");  
  Game_Over();
 }
}

void Kickout_ball() {

lcd.setCursor(4,3);
lcd.print("Start"); 
delay(1000);
digitalWrite(solenoidPin_Release, HIGH);
delay (100);    //TEST
digitalWrite(solenoidPin_Release,LOW);
delay (400);  
}


void ResetGame() {
Score = 0;
MaxBalls = 5;
Bonus = 0;
AZTEC_A = 0;
AZTEC_Z = 0;
AZTEC_T = 0;
AZTEC_E = 0;
AZTEC_C = 0;
Ball_Bonus = 0;
Kickout_Bonus =0;
DoubleBonus = 0;
DoubleBonuscounter = 0;  
AdvanceBonus = 0;   
AdvanceBonuscounter = 0;
Arrowbonus = 0;
RolloverLinks_Rechts_int_last =LOW;
RolloverMitte_int_last = LOW;
Target_Z_last = LOW;
Target_T_last = LOW;
Target_E_last = LOW;
Target_C_last = LOW;
Target_Middle_last= LOW;
Target_Points_last= LOW;
Ramp_last = LOW;

int SwitchtopLinks_Rechts_last = LOW;
int SwitchtopMitte_last = LOW;
int Outlanes_Links_Rechts_last = LOW;
int Sidelanes_Links_Rechts_last = LOW;

digitalWrite(Light_A, LOW);
digitalWrite(Light_Z, LOW);
digitalWrite(Light_T, LOW);
digitalWrite(Light_E, LOW);
digitalWrite(Light_C, LOW);
digitalWrite(Light_Ball_Bonus, LOW);
digitalWrite(Light_Arrow, LOW);
digitalWrite(Light_Double_Bonus, LOW);
digitalWrite(Light_A_Target, HIGH); 
digitalWrite(Light_Z_Target, HIGH); 
digitalWrite(Light_T_Target, HIGH); 
digitalWrite(Light_E_Target, HIGH); 
digitalWrite(Light_C_Target, HIGH); 
digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light__Bonus_3, LOW); 
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light__Bonus_6, LOW); 
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light__Bonus_10, LOW); 

  ScoreDisplay();     //Show Score 
   delay (100);  

}
  

void Ball_Lost() {

MP3player.stopTrack();
MP3player.playMP3("006.mp3");

previousMillis = millis(); 
delay(1000);
digitalWrite(solenoidPin_Release, HIGH);
delay (100);    //TEST
digitalWrite(solenoidPin_Release,LOW);


if (DoubleBonus == 0) {
Score = Score + Bonus;
}
else if (DoubleBonus == 1) {
Score = Score + Bonus + Bonus;
}

Bonus = 0;
AZTEC_A = 0;
AZTEC_Z = 0;
AZTEC_T = 0;
AZTEC_E = 0;
AZTEC_C = 0;
Ball_Bonus = 0;
Kickout_Bonus =0;
DoubleBonus = 0;
DoubleBonuscounter = 0;
Arrowbonus = 0;
RolloverLinks_Rechts_int_last =LOW;
RolloverMitte_int_last = LOW;
Target_Z_last = LOW;
Target_T_last = LOW;
Target_E_last = LOW;
Target_C_last = LOW;
Target_Middle_last= LOW;
Target_Points_last= LOW;
Ramp_last = LOW;

int SwitchtopLinks_Rechts_last = LOW;
int SwitchtopMitte_last = LOW;
int Outlanes_Links_Rechts_last = LOW;
int Sidelanes_Links_Rechts_last = LOW;

digitalWrite(Light_A, LOW);
digitalWrite(Light_Z, LOW);
digitalWrite(Light_T, LOW);
digitalWrite(Light_E, LOW);
digitalWrite(Light_C, LOW);
digitalWrite(Light_Ball_Bonus, LOW);
digitalWrite(Light_Arrow, LOW);
digitalWrite(Light_Double_Bonus, LOW);
digitalWrite(Light_A_Target, HIGH); 
digitalWrite(Light_Z_Target, HIGH); 
digitalWrite(Light_T_Target, HIGH); 
digitalWrite(Light_E_Target, HIGH); 
digitalWrite(Light_C_Target, HIGH); 
digitalWrite(Light__Bonus_1, LOW); 
digitalWrite(Light__Bonus_2, LOW); 
digitalWrite(Light__Bonus_3, LOW); 
digitalWrite(Light__Bonus_4, LOW); 
digitalWrite(Light__Bonus_5, LOW); 
digitalWrite(Light__Bonus_6, LOW); 
digitalWrite(Light__Bonus_7, LOW); 
digitalWrite(Light__Bonus_8, LOW); 
digitalWrite(Light__Bonus_9, LOW); 
digitalWrite(Light__Bonus_10, LOW); 

  ScoreDisplay();     //Show Score 
   delay (100);  
}


void Game_Over(){
AttractMode = 0;
MP3player.stopTrack();
MP3player.playMP3("007.mp3");

if (DoubleBonus == 0) {
Score = Score + Bonus;
}
else if (DoubleBonus == 1) {
Score = Score + Bonus + Bonus;
}


if (Score>Highscore){
  Highscore = Score;
  EEPROM.writeLong(adress, Highscore);
}

  ScoreDisplay();     //Show Score 
   
delay (3000);  
DoubleBonus = 0;
DoubleBonuscounter = 0;
MaxBalls = 5;
Balls = 1;
Startplay_ACTIVE = 0;
AttractMode = 0;
Score = 0;
delay (1000);  
ATTRACT();
}








void ScoreDisplay()
{
  lcd.clear();                // Clear
  lcd.print("Score: ");    // First line
  lcd.print(Score);      // First line
 // lcd.setCursor(0,1);
 // lcd.print("Bonus: ");    // Second line
 // lcd.print(Bonus);      // Second line
  lcd.setCursor(4,3);
  lcd.print("Ball: ");    // Third line
  lcd.print(Balls);      // Third  line
}

Credits

Frogger1108
Frogger1108
0 projects • 4 followers
Contact

Replications

Did you replicate this project? Share it!

I made one

Love this project? Think it could be improved? Tell us what you think!

Give feedback

Comments

Sign up / LoginProjectsPlatformsTopicsContestsLiveAppsBetaBlog