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 [Ici] et rejoignez-nous aujourd’hui !

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.

../_images/list_Password_Lock.png

Il est certainement pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément à partir des liens ci-dessous.

INTRODUCTION DU COMPOSANT

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

LCD1602 I2C

ACHETER

Clavier

-

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

../_images/Schematic_three_one9.png

Procédures Expérimentales

Étape 1 : Construisez le circuit.

../_images/image262.png

Étape 2 : Changez de répertoire.

cd ~/raphael-kit/python/

Étape 3 : Exécutez.

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 à Configuration I²C 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.

#!/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

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.

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 à 2.1.8 Clavier de ce document pour plus de détails.

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.

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

../_images/image263.jpeg