Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Únete para profundizar en Raspberry Pi, Arduino y ESP32 junto a otros apasionados.

¿Por qué unirte?

  • Soporte de Expertos: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances Exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y vistas previas.

  • Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy.

3.1.13 JUEGO– 10 Segundos

Introducción

Ahora, acompáñame a crear un dispositivo de juego para desafiar tu concentración. Ata el interruptor de inclinación a un palo para hacer una varita mágica. Agita la varita, y el display de 4 dígitos comenzará a contar; agítala de nuevo para detener el conteo. Si logras mantener el conteo en pantalla en 10.00, ganas. Puedes jugar con tus amigos para ver quién es el maestro del tiempo.

Componentes

_images/list_GAME_10_Second.png

Diagrama Esquemático

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

SPIMOSI

Pin 19

12

10

GPIO18

Pin 12

1

18

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

GPIO26

Pin 37

25

26

_images/Schematic_three_one13.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

10 second_bb

Para Usuarios de Lenguaje C

Paso 2: Ve a la carpeta del código.

cd ~/davinci-kit-for-raspberry-pi/c/3.1.13/

Paso 3: Compila el código.

gcc 3.1.13_GAME_10Second.c -lwiringPi

Paso 4: Ejecuta el archivo compilado.

sudo ./a.out

Agita la varita y el display de 4 dígitos comenzará a contar; agítala nuevamente para detener el conteo. Si logras que el conteo en pantalla llegue exactamente a 10.00, habrás ganado. Agítala una vez más para iniciar la siguiente ronda del juego.

Nota

Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory», consulta ¿El código en C no funciona?.

Explicación del Código

void stateChange(){
    if (gameState == 0){
        counter = 0;
        delay(1000);
        ualarm(10000,10000);
    }else{
        alarm(0);
        delay(1000);
    }
    gameState = (gameState + 1)%2;
}

El juego se divide en dos modos:

gameState=0 es el modo «inicio», en el cual el tiempo se mide y se muestra en el display de segmentos, y se agita el interruptor de inclinación para entrar al modo «mostrar».

GameState=1 es el modo «mostrar», en el cual se detiene el tiempo y se muestra en el display. Agitar el interruptor de inclinación de nuevo restablece el temporizador y reinicia el juego.

void loop(){
    int currentState =0;
    int lastState=0;
    while(1){
        display();
        currentState=digitalRead(sensorPin);
        if((currentState==0)&&(lastState==1)){
            stateChange();
        }
        lastState=currentState;
    }
}

Loop() es la función principal. Primero, muestra el tiempo en el display de 4 dígitos y lee el valor del interruptor de inclinación. Si el estado del interruptor ha cambiado, se llama a stateChange().

Para Usuarios de Lenguaje Python

Paso 2: Ve a la carpeta del código.

cd ~/davinci-kit-for-raspberry-pi/python/

Paso 3: Ejecuta el archivo.

sudo python3 3.1.13_GAME_10Second.py

Agita la varita y el display de 4 dígitos comenzará a contar; agítala nuevamente para detener el conteo. Si logras que el conteo en pantalla llegue exactamente a 10.00, habrás ganado. Agítala una vez más para iniciar la siguiente ronda del juego.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes, necesitas dirigirte a la ruta del código fuente, como davinci-kit-for-raspberry-pi/python.

import RPi.GPIO as GPIO
import time
import threading

sensorPin = 26

SDI = 24
RCLK = 23
SRCLK = 18

placePin = (10, 22, 27, 17)
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

counter = 0
timer =0
gameState =0

def clearDisplay():
    for i in range(8):
        GPIO.output(SDI, 1)
        GPIO.output(SRCLK, GPIO.HIGH)
        GPIO.output(SRCLK, GPIO.LOW)
    GPIO.output(RCLK, GPIO.HIGH)
    GPIO.output(RCLK, GPIO.LOW)

def hc595_shift(data):
    for i in range(8):
        GPIO.output(SDI, 0x80 & (data << i))
        GPIO.output(SRCLK, GPIO.HIGH)
        GPIO.output(SRCLK, GPIO.LOW)
    GPIO.output(RCLK, GPIO.HIGH)
    GPIO.output(RCLK, GPIO.LOW)

def pickDigit(digit):
    for i in placePin:
        GPIO.output(i,GPIO.LOW)
    GPIO.output(placePin[digit], GPIO.HIGH)

def display():
    global counter
    clearDisplay()
    pickDigit(0)
    hc595_shift(number[counter % 10])

    clearDisplay()
    pickDigit(1)
    hc595_shift(number[counter % 100//10])

    clearDisplay()
    pickDigit(2)
    hc595_shift(number[counter % 1000//100]-0x80)

    clearDisplay()
    pickDigit(3)
    hc595_shift(number[counter % 10000//1000])

def stateChange():
    global gameState
    global counter
    global timer1
    if gameState == 0:
        counter = 0
        time.sleep(1)
        timer()
    elif gameState ==1:
        timer1.cancel()
        time.sleep(1)
    gameState = (gameState+1)%2

def loop():
    global counter
    currentState = 0
    lastState = 0
    while True:
        display()
        currentState=GPIO.input(sensorPin)
        if (currentState == 0) and (lastState == 1):
            stateChange()
        lastState=currentState

def timer():
    global counter
    global timer1
    timer1 = threading.Timer(0.01, timer)
    timer1.start()
    counter += 1

def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SDI, GPIO.OUT)
    GPIO.setup(RCLK, GPIO.OUT)
    GPIO.setup(SRCLK, GPIO.OUT)
    for i in placePin:
        GPIO.setup(i, GPIO.OUT)
    GPIO.setup(sensorPin, GPIO.IN)

def destroy():   # Cuando se presiona \"Ctrl+C\", se ejecuta esta función.
    GPIO.cleanup()
    global timer1
    timer1.cancel()

if __name__ == '__main__':  # El programa comienza desde aquí
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

Explicación del Código

def stateChange():
    global gameState
    global counter
    global timer1
    if gameState == 0:
        counter = 0
        time.sleep(1)
        timer()
    elif gameState ==1:
        timer1.cancel()
        time.sleep(1)
    gameState = (gameState+1)%2

El juego se divide en dos modos:

gameState=0 es el modo «inicio», en el cual el tiempo se mide y se muestra en el display de segmentos, y se agita el interruptor de inclinación para entrar al modo «mostrar».

GameState=1 es el modo «mostrar», en el cual se detiene el tiempo y se muestra en el display. Agitar el interruptor de inclinación de nuevo restablece el temporizador y reinicia el juego.

def loop():
    global counter
    currentState = 0
    lastState = 0
    while True:
        display()
        currentState=GPIO.input(sensorPin)
        if (currentState == 0) and (lastState == 1):
            stateChange()
        lastState=currentState

Loop() es la función principal. Primero, muestra el tiempo en el display de 4 dígitos y lee el valor del interruptor de inclinación. Si el estado del interruptor ha cambiado, se llama a stateChange().

def timer():
    global counter
    global timer1
    timer1 = threading.Timer(0.01, timer)
    timer1.start()
    counter += 1

Cuando el intervalo alcanza 0.01s, se llama a la función timer; se añade 1 a counter, y el temporizador se usa nuevamente para ejecutarse repetidamente cada 0.01s.

Imagen del Fenómeno

_images/image278.jpeg