.. note:: Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés. **Pourquoi rejoindre ?** - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe. - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences. - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus. - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents. - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances. 👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui ! .. _4.1.18_py: 4.1.18 JEU - 10 Secondes =================================== Introduction ------------------- Ensuite, suivez-moi pour fabriquer un dispositif de jeu pour tester votre concentration. Attachez l'interrupteur à bascule à un bâton pour en faire une baguette magique. Secouez la baguette, l'affichage à 4 chiffres commencera à compter, secouez à nouveau pour arrêter le comptage. Si vous réussissez à maintenir le compte affiché à **10.00**, alors vous gagnez. Vous pouvez jouer à ce jeu avec vos amis pour voir qui est le maître du temps. Composants Requis ------------------------------ Pour ce projet, nous avons besoin des composants suivants. .. image:: ../img/list_GAME_10_Second.png :align: center Il est certainement pratique d'acheter un kit complet, voici le lien : .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nom - ÉLÉMENTS DANS CE KIT - LIEN * - Kit Raphael - 337 - |link_Raphael_kit| Vous pouvez également les acheter séparément à partir des liens ci-dessous. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCTION DU COMPOSANT - LIEN D'ACHAT * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_4_digit` - \- * - :ref:`cpn_74hc595` - |link_74hc595_buy| * - :ref:`cpn_tilt_switch` - \- Schéma de Câblage ------------------------ ============ ======== ======== === Nom T-Board physique 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 ============ ======== ======== === .. image:: ../img/Schematic_three_one13.png :align: center Procédures Expérimentales --------------------------------- **Étape 1** : Construisez le circuit. .. image:: ../img/image277.png **Étape 2** : Allez dans le dossier du code. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Étape 3** : Exécutez le fichier exécutable. .. raw:: html .. code-block:: sudo python3 4.1.18_GAME_10Second.py Secouez la baguette, l'affichage à 4 chiffres commencera à compter, secouez à nouveau pour arrêter le comptage. Si vous réussissez à maintenir le compte affiché à **10.00**, alors vous gagnez. Secouez-la une fois de plus pour commencer le prochain tour du jeu. **Code** .. note:: Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez aller dans le chemin du code source comme ``raphael-kit/python``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet. .. raw:: html .. code-block:: python #!/usr/bin/env python3 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(): # When "Ctrl+C" is pressed, the function is executed. GPIO.cleanup() global timer1 timer1.cancel() if __name__ == '__main__': # Program starting from here setup() try: loop() except KeyboardInterrupt: destroy() **Explication du Code** .. code-block:: python 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 Le jeu est divisé en deux modes : ``gameState==0`` est le mode "démarrage", dans lequel le temps est chronométré et affiché sur l'affichage à segments, et le basculement de l'interrupteur permet de passer en mode "affichage". ``gameState==1`` est le mode "affichage", qui arrête le chronométrage et affiche le temps sur l'affichage à segments. Le basculement de l'interrupteur réinitialise le chronomètre et relance le jeu. .. code-block:: python 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()`` est la fonction principale. Tout d'abord, le temps est affiché sur l'affichage à 4 segments et la valeur de l'interrupteur à bascule est lue. Si l'état de l'interrupteur à bascule a changé, ``stateChange()`` est appelé. .. code-block:: python def timer(): global counter global timer1 timer1 = threading.Timer(0.01, timer) timer1.start() counter += 1 Après que l'intervalle ait atteint 0,01s, la fonction de minuterie est appelée ; ajoutez 1 à counter, et la minuterie est utilisée à nouveau pour s'exécuter elle-même de manière répétée toutes les 0,01s. Image du Phénomène ----------------------- .. image:: ../img/image278.jpeg :align: center