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
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 |
Procedimientos Experimentales
Paso 1: Construye el circuito.
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