#include #include //Finales de carrera motor ezButton fcP1B(9); ezButton fcP1T(8); //Btn reset ezButton resetBtn(6); //Finales de carrera puntos ezButton P1S1(12); ezButton P1S2(11); ezButton P1S3(10); //Quitar para desactivar debug #define DEBUG // Configuración del motor paso a paso const int pasosPorRevolucion = 200; // Depende de tu motor Stepper motor(pasosPorRevolucion, 4, 5); // Pines del Arduino al driver del motor //Pins Gameover int pinGameOverLight = 3; int pinGameOverSiren = 2; // Variables de estado bool estadoPulsadorAvance = false; bool estadoPulsadorReset = false; bool estadoAnteriorAvance = false; //Variables de motor int remainingSteps = 0; //Constantes de motor const int MOTOR_INCREMENT = 50; const int MOTOR_INCREMENT_RESET = 50; const int MOTOR_ONE_LAP = 6400; int estadoFcP1B = 0; int estadoFcP1T = 0; // Variables de modo enum modes {PLAYING, RESET, GAMEOVER}; modes currentMode = PLAYING; // playing, reset int gameOverDelay = 500; bool gameOverShowEnded = false; void debug(String message){ #ifdef DEBUG Serial.println(message); #endif } void setup() { pinMode(pinGameOverLight, OUTPUT); pinMode(pinGameOverSiren, OUTPUT); disableGameOver(); motor.setSpeed(2000); // Velocidad del motor en RPM fcP1B.setDebounceTime(50); // set debounce time to 50 milliseconds fcP1T.setDebounceTime(50); // set debounce time to 50 milliseconds resetBtn.setDebounceTime(50); // set debounce time to 50 milliseconds #ifdef DEBUG Serial.begin(9600); Serial.println("hasiera"); #endif } void loop() { fcP1B.loop(); fcP1T.loop(); resetBtn.loop(); P1S1.loop(); P1S2.loop(); P1S3.loop(); estadoFcP1B = fcP1B.getState(); estadoFcP1T = fcP1T.getState(); switch(currentMode){ case RESET: modeReset(); break; case GAMEOVER: modeGameOver(); break; default: modePlaying(); break; } //Reset mode-ean moterea ta goika FC-a ez dugu begiratuko if(currentMode == RESET){ return; } handleMotor(); if(resetBtn.isReleased()){ currentMode = RESET; } } void handleMotor(){ if(estadoFcP1T){ currentMode = GAMEOVER; return; } if(remainingSteps > 0) { motor.step(MOTOR_INCREMENT); remainingSteps -= MOTOR_INCREMENT; } } void modeReset(){ disableGameOver(); if(!estadoFcP1B){ motor.step(-MOTOR_INCREMENT_RESET); } else { currentMode = PLAYING; } } void modePlaying(){ if(P1S1.isReleased() || P1S2.isReleased() || P1S3.isReleased()){ debug("Points"); remainingSteps += MOTOR_ONE_LAP; } } void modeGameOver(){ remainingSteps = 0; digitalWrite(pinGameOverLight, LOW); enableGameOver(); } void enableGameOver(){ showGameOver(); debug("GameOver enabled"); } void disableGameOver(){ gameOverShowEnded = false; digitalWrite(pinGameOverSiren, HIGH); digitalWrite(pinGameOverLight, HIGH); debug("GameOver disabled"); } void showGameOver(){ if(gameOverShowEnded) return; for(int i = 0; i< 3; i++){ digitalWrite(pinGameOverSiren, LOW); digitalWrite(pinGameOverLight, LOW); delay(gameOverDelay); digitalWrite(pinGameOverSiren, HIGH); digitalWrite(pinGameOverLight, HIGH); delay(gameOverDelay); } gameOverShowEnded = true; }