Code, autoformatted for better readability:
#include <Time.h>
#include <TimeLib.h>
#include <Bounce2.h>
// Include the Arduino Stepper Library
#include <Stepper.h>
#include <Wire.h>
// Include NewLiquidCrystal Library for I2C
#include <LiquidCrystal_I2C.h>
// Define LCD pinout
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
// Define LCD display connections
const int i2c_addr = 0x27;
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
// Number of steps per output rotation
const byte stepsPerRevolution = 200;
// Create Instance of Stepper library
Stepper Xstepper(stepsPerRevolution, 22, 23, 24, 25);
Stepper Ystepper(stepsPerRevolution, 26, 27, 28, 29);
Stepper Zstepper(stepsPerRevolution, 30, 31, 32, 33);
Bounce debouncer = Bounce();
#define CoinLimitSwitch 34
#define CoinLED 35
#define U 36
#define D 37
#define L 38
#define R 39
#define ClawLED 40
#define Claw 41
#define X 42
#define Y 43
#define X2 44
#define Y2 45
#define Demo 46
#define Test 47
#define Solenoid 48
#define Z 49
const byte timelimit = 0;
const byte delaytimeforLCD = 250;
void setup() {
pinMode(CoinLimitSwitch, INPUT_PULLUP);
pinMode(U, INPUT_PULLUP);
pinMode(D, INPUT_PULLUP);
pinMode(L, INPUT_PULLUP);
pinMode(R, INPUT_PULLUP);
pinMode(Claw, INPUT_PULLUP);
pinMode(X, INPUT_PULLUP);
pinMode(X2, INPUT_PULLUP);
pinMode(Y, INPUT_PULLUP);
pinMode(Y2, INPUT_PULLUP);
pinMode(Z, INPUT_PULLUP);
pinMode(Demo, INPUT_PULLUP);
pinMode(Test, INPUT_PULLUP);
pinMode(CoinLED, OUTPUT);
pinMode(ClawLED, OUTPUT);
pinMode(Solenoid, OUTPUT);
debouncer.attach(CoinLimitSwitch);
debouncer.attach(U);
debouncer.attach(D);
debouncer.attach(L);
debouncer.attach(R);
debouncer.attach(Claw);
debouncer.attach(X);
debouncer.attach(X2);
debouncer.attach(Y);
debouncer.attach(Y2);
debouncer.attach(Z);
debouncer.attach(Demo);
debouncer.attach(Test);
debouncer.interval(5);
Xstepper.setSpeed(60);
Ystepper.setSpeed(60);
Zstepper.setSpeed(100);
// Start with a presenting message as the pins are being initialized
// Set display type as 16 char, 2 rows
lcd.begin(16, 2);
// Print on first row
lcd.print("Presenting...");
// Wait 2 seconds
delay(2000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" The Arduino Action Contraption");
for (int PositionCount = 0; PositionCount < 25; PositionCount++)
{
lcd.scrollDisplayLeft(); //builtin command to scroll right the text
delay(500);//delay of 250 msec
}
delay(3000);
}
void loop() {
//gameIdle(); //if you don't want free play, get rid of the forward slashs & the */ *\ in the code below
runGame();
if (digitalRead(Demo) == LOW) {
demo();
}
if (digitalRead(Test) == LOW) {
testInputs();
}
}
//----------------------------- Game Idle -----------------------------------
/*void gameIdle(){
while(digitalRead(CoinLimitSwitch) == HIGH){
lcd.clear();
lcd.print("Please, insert");
lcd.setCursor(0,1);
lcd.print("<= $0.25.");
digitalWrite(CoinLED, HIGH);
delay(500);
digitalWrite(CoinLED, LOW);
delay(500);
}
digitalWrite(CoinLED, LOW);
digitalWrite(CoinLimitSwitch, LOW);
lcd.clear();
runGame();
}
*/
//-------------------start of gameplay ------------------------------
void runGame() {
for (byte time1 = 20; time1 >= timelimit; --time1) {
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
while (digitalRead(U) == LOW) {
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
}
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
while (digitalRead(D) == LOW) {
Zstepper.step(-stepsPerRevolution);
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
}
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
while (digitalRead(L) == LOW) {
Ystepper.step(stepsPerRevolution);
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
}
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
while (digitalRead(R) == LOW) {
Ystepper.step(-stepsPerRevolution);
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
}
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
while (digitalRead(Claw) == HIGH) {
digitalWrite(ClawLED, HIGH);
delay(500);
digitalWrite(ClawLED, LOW);
delay(500);
lcd.print("Time remaining: ");
lcd.setCursor(0, 1);
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
}
Zstepper.step(-stepsPerRevolution);
lcd.print("Time remaining: ");
lcd.print(time1);
delay(delaytimeforLCD);
lcd.clear();
time1--;
if (time1 == timelimit) {
break;
gameOver();
}
}
}
void demo() {
}
void testInputs() {
}
void gameOver() {
lcd.clear();
lcd.print("Game Over :(");
runGame();
}