Electronic Basketball Hoops Arcade Game With Arduino
by sistemasymicros in Circuits > Arduino
1539 Views, 6 Favorites, 0 Comments
Electronic Basketball Hoops Arcade Game With Arduino
Do you wanna have fun in this quarantine season with your sons or friends? Play this basketball game with timer and score counter made with arduino.
Contains two 7 segments displays for the timer (59 seconds) and two displays for the score (up to 99), and an infrared optical sensor for detecting when the ball cross.
Supplies
- Arduino one or similar.
- FC 51 Infrared optical sensor.
- (4) 7 segments displays common anode.
- (4) NPN transistors, eg: 2N3904.
- (2) IC 74LS47
- (4) 1K ohms resistors.
- (14) 100 ohms resistors.
- Board hoop.
- Jumpers
- Voltage souce 5V @1A.
Sensor Position
The optical sensor must be placed at the bottom of the hoop, so can detect the crossing of the ball.
Diagram
Arduino Code
//Programa del juego de basquetball con cronómetro y marcador de canasta
//Variables para el cronómetro const int Acr = 1; const int Bcr = 2; const int Ccr = 3; const int Dcr = 4;
const int displayUnidadesCronometro = 5; const int displayDecenasCronometro = 6;
// Variables para el marcador const int Am = 7; const int Bm = 8; const int Cm = 9; const int Dm = 10;
const int displayUnidadesMarcador = 11; const int displayDecenasMarcador = 12;
//*****************************************
const int sensor = 13;
long tiempoAnterior = 0; long intervalo = 1000;
int estadoSensor; bool estadoBotonAnteriorSensor;
bool activo = true;
const int tiempo = 8; const int tiempoAntirebote = 10;
int tiempoCronometro; int marcador;
int unidadesCronometro = 0; int decenasCronometro = 0; int unidadesMarcador = 0; int decenasMarcador = 0;
boolean estadoAnterior = LOW; // Estado anterior del botòn boolean estadoActual = LOW; // Estado actual del botòn
void escribirBcdCronometro(byte num) { digitalWrite(Acr, (num & 1) == 1); digitalWrite(Bcr, (num & 2) == 2); digitalWrite(Ccr, (num & 4) == 4); digitalWrite(Dcr, (num & 8) == 8); }
void escribirBcdMarcador(byte num) { digitalWrite(Am, (num & 1) == 1); digitalWrite(Bm, (num & 2) == 2); digitalWrite(Cm, (num & 4) == 4); digitalWrite(Dm, (num & 8) == 8); }
void setup() {
pinMode(Acr, OUTPUT); pinMode(Bcr, OUTPUT); pinMode(Ccr, OUTPUT); pinMode(Dcr, OUTPUT);
pinMode(displayUnidadesCronometro, OUTPUT); pinMode(displayDecenasCronometro, OUTPUT);
pinMode(Am, OUTPUT); pinMode(Bm, OUTPUT); pinMode(Cm, OUTPUT); pinMode(Dm, OUTPUT);
pinMode(displayUnidadesMarcador, OUTPUT); pinMode(displayDecenasMarcador, OUTPUT);
pinMode(sensor, INPUT); //pinMode(reset,INPUT_PULLUP);
digitalWrite(displayUnidadesCronometro, HIGH); digitalWrite(displayDecenasCronometro, HIGH); digitalWrite(displayUnidadesMarcador, HIGH); digitalWrite(displayDecenasMarcador, HIGH); estadoBotonAnteriorSensor = 1; tiempoCronometro = 59; marcador = 0; }
//*******RUTINA ANTIREBOTE ********************************************************* boolean antiRebote (int pin ) { int contador = 0; boolean estado; // guarda el estado del boton boolean estadoAnterior; // guarda el ultimo estado del boton
do { estado = digitalRead (pin); if (estado != estadoAnterior ) { // comparamos el estado actual contador = 0; estadoAnterior = estado; } else { contador = contador + 1; // aumentamos el contador en 1 } delay (1); } while (contador < tiempoAntirebote); return estado; }
//************************************************************************
// TEMPORIZADOR O CRONÓMETRO void timer() {
long tiempoActual = millis(); //Leo el tiempo actual
if(activo){ if (tiempoActual - tiempoAnterior > intervalo) { tiempoCronometro = tiempoCronometro - 1; tiempoAnterior = tiempoActual; } }
}
void habilitarUnidadesCronometro() { escribirBcdCronometro(unidadesCronometro); digitalWrite(displayUnidadesCronometro, HIGH); digitalWrite(displayDecenasCronometro, LOW); delay(tiempo); }
void habilitarDecenasCronometro() { escribirBcdCronometro(decenasCronometro); digitalWrite(displayUnidadesCronometro, LOW); digitalWrite(displayDecenasCronometro, HIGH); delay(tiempo); }
void habilitarUnidadesMarcador() { escribirBcdMarcador(unidadesMarcador); digitalWrite(displayUnidadesMarcador, HIGH); digitalWrite(displayDecenasMarcador, LOW); delay(tiempo); }
void habilitarDecenasMarcador() { escribirBcdMarcador(decenasMarcador); digitalWrite(displayUnidadesMarcador, LOW); digitalWrite(displayDecenasMarcador, HIGH); delay(tiempo); }
void loop() {
timer();
estadoSensor = digitalRead(sensor);
//********************************************************************************************* if(activo){ if (estadoSensor != estadoBotonAnteriorSensor) { //si hay cambio con respeto al estado if (antiRebote (sensor)) { //checamos si esta presionado y si lo esta marcador++; } }
estadoBotonAnteriorSensor = estadoSensor; // guardamos el estado del boton } //******************************************************************************************* // Si se acabó el tiempo, no permita que siga contando el marcador if (tiempoCronometro == 0) { activo = false; }
if (marcador > 99) { marcador = 0; }
decenasCronometro = tiempoCronometro / 10; //Extraigo el dìgito de las unidades
unidadesCronometro = tiempoCronometro - ( decenasCronometro * 10); //Extraigo el dìgito de las decenas
//************************************************************************************************* decenasMarcador = marcador / 10; //Extraigo el dìgito de las unidades
unidadesMarcador = marcador - (decenasMarcador * 10); //Extraigo el dìgito de las decenas
habilitarUnidadesCronometro(); habilitarDecenasCronometro(); habilitarUnidadesMarcador(); habilitarDecenasMarcador();
}
Or download from here