Introduction: Electronic Basketball Hoops Arcade Game With Arduino

About: My name is José Luis Bejarano Vásquez.Tecnólogo en electrónica, estudiante de ing electrónica, desarrollador de software. Aficionado a la robótica. Blogger.

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.

Step 1: Sensor Position

The optical sensor must be placed at the bottom of the hoop, so can detect the crossing of the ball.

Step 2: Diagram

Step 3: 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

Step 4: Youtube Video

Arduino Contest 2020

Participated in the
Arduino Contest 2020