169 lines
3.2 KiB
C++
169 lines
3.2 KiB
C++
#include <Stepper.h>
|
|
|
|
|
|
#include <ezButton.h>
|
|
|
|
//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;
|
|
}
|