.. 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.14_py: 4.1.14 Verrou à Code ================================ Introduction ------------- Dans ce projet, nous utiliserons un pavé numérique et un écran LCD pour fabriquer un verrou à combinaison. Le LCD affichera une invite correspondante pour que vous puissiez saisir votre mot de passe sur le pavé numérique. Si le mot de passe est correct, "Correct" sera affiché. Sur la base de ce projet, nous pouvons ajouter des composants électroniques supplémentaires, tels qu'un buzzer, une LED, etc., pour ajouter différents phénomènes expérimentaux lors de la saisie du mot de passe. Composants Requis ------------------------------ Pour ce projet, nous avons besoin des composants suivants. .. image:: ../img/list_Password_Lock.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_i2c_lcd` - |link_i2clcd1602_buy| * - :ref:`cpn_keypad` - \- Schéma de Câblage ------------------ ============ ======== ======== === Nom T-Board physique wiringPi BCM GPIO18 Pin 12 1 18 GPIO23 Pin 16 4 23 GPIO24 Pin 18 5 24 GPIO25 Pin 22 6 25 GPIO17 Pin 11 0 17 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 SPIMOSI Pin 19 12 10 SDA1 Pin 3 SCL1 Pin 5 ============ ======== ======== === .. image:: ../img/Schematic_three_one9.png :align: center Procédures Expérimentales ---------------------------- **Étape 1 :** Construisez le circuit. .. image:: ../img/image262.png **Étape 2 :** Changez de répertoire. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Étape 3 :** Exécutez. .. raw:: html .. code-block:: sudo python3 4.1.14_PasswordLock.py Après l'exécution du code, le pavé numérique est utilisé pour saisir le mot de passe : 1984. Si “CORRECT” apparaît sur l'écran LCD1602, le mot de passe est correct ; sinon, “WRONG KEY” apparaîtra. .. note:: * Si vous obtenez l'erreur ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, vous devez vous référer à :ref:`i2c_config` pour activer l'I2C. * Si vous obtenez l'erreur ``ModuleNotFoundError: No module named 'smbus2'``, veuillez exécuter ``sudo apt install python3-smbus2``. * Si l'erreur ``OSError: [Errno 121] Remote I/O error`` apparaît, cela signifie que le module est mal câblé ou qu'il est défectueux. * Si le code et le câblage sont corrects, mais que l'écran LCD ne s'affiche toujours pas, vous pouvez tourner le potentiomètre à l'arrière pour augmenter le contraste. **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 LCD1602 ##################### HERE IS THE KEYPAD LIBRARY TRANSPLANTED FROM Arduino ############ #class Key:Define some of the properties of Key class Keypad(): def __init__(self, rowsPins, colsPins, keys): self.rowsPins = rowsPins self.colsPins = colsPins self.keys = keys GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(self.rowsPins, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(self.colsPins, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def read(self): pressed_keys = [] for i, row in enumerate(self.rowsPins): GPIO.output(row, GPIO.HIGH) for j, col in enumerate(self.colsPins): index = i * len(self.colsPins) + j if (GPIO.input(col) == 1): pressed_keys.append(self.keys[index]) GPIO.output(row, GPIO.LOW) return pressed_keys ################ EXAMPLE CODE START HERE ################ LENS = 4 password=['1','9','8','4'] testword=['0','0','0','0'] keyIndex=0 def check(): for i in range(0,LENS): if(password[i]!=testword[i]): return 0 return 1 def setup(): global keypad, last_key_pressed rowsPins = [18,23,24,25] colsPins = [10,22,27,17] keys = ["1","2","3","A", "4","5","6","B", "7","8","9","C", "*","0","#","D"] keypad = Keypad(rowsPins, colsPins, keys) last_key_pressed = [] LCD1602.init(0x27, 1) # init(slave address, background light) LCD1602.clear() LCD1602.write(0, 0, 'WELCOME!') LCD1602.write(2, 1, 'Enter password') time.sleep(2) def destroy(): LCD1602.clear() GPIO.cleanup() def loop(): global keyIndex global LENS global keypad, last_key_pressed while(True): pressed_keys = keypad.read() if len(pressed_keys) != 0 and last_key_pressed != pressed_keys: LCD1602.clear() LCD1602.write(0, 0, "Enter password:") LCD1602.write(15-keyIndex,1, pressed_keys) testword[keyIndex]=pressed_keys keyIndex+=1 if (keyIndex is LENS): if (check() is 0): LCD1602.clear() LCD1602.write(3, 0, "WRONG KEY!") LCD1602.write(0, 1, "please try again") else: LCD1602.clear() LCD1602.write(4, 0, "CORRECT!") LCD1602.write(2, 1, "welcome back") keyIndex=keyIndex%LENS last_key_pressed = pressed_keys time.sleep(0.1) if __name__ == '__main__': # Program start from here try: setup() loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the program destroy() will be executed. destroy() **Explication du Code** .. code-block:: python LENS = 4 password=['1','9','8','4'] ... rowsPins = [18,23,24,25] colsPins = [10,22,27,17] keys = ["1","2","3","A", "4","5","6","B", "7","8","9","C", "*","0","#","D"] Ici, nous définissons la longueur du mot de passe LENS, le tableau keys qui stocke les touches du clavier matriciel, et le tableau password qui stocke le mot de passe correct. .. code-block:: python class Keypad(): def __init__(self, rowsPins, colsPins, keys): self.rowsPins = rowsPins self.colsPins = colsPins self.keys = keys GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(self.rowsPins, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(self.colsPins, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) ... Cette classe lit les valeurs des touches pressées. Référez-vous à :ref:`2.1.8_py` de ce document pour plus de détails. .. code-block:: python while(True): pressed_keys = keypad.read() if len(pressed_keys) != 0 and last_key_pressed != pressed_keys: LCD1602.clear() LCD1602.write(0, 0, "Enter password:") LCD1602.write(15-keyIndex,1, pressed_keys) testword[keyIndex]=pressed_keys keyIndex+=1 ... Lire la valeur de la touche et la stocker dans le tableau de test testword. Si le nombre de valeurs de touches stockées dépasse 4, la vérification du mot de passe est automatiquement effectuée, et les résultats de la vérification sont affichés sur l'interface LCD. .. code-block:: python def check(): for i in range(0,LENS): if(password[i]!=testword[i]): return 0 return 1 Vérifiez la validité du mot de passe. Retourne 1 si le mot de passe est correct, et 0 sinon. Image du Phénomène --------------------- .. image:: ../img/image263.jpeg :align: center