Files
BBB_bolak/hw/bolak/bolak.ino

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;
}