Nota

Ciao! Benvenuto nella Community di Facebook per gli appassionati di Raspberry Pi, Arduino & ESP32 targata SunFounder! Unisciti a noi per esplorare Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirsi a noi?

  • Supporto Esperto: Risolvi problematiche tecniche e post-vendita con l’aiuto della nostra community e del nostro team.

  • Impara e Condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Accedi in anteprima agli annunci dei nuovi prodotti e alle loro caratteristiche.

  • Sconti Speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e Giveaway Festivi: Partecipa ai nostri giveaway e alle promozioni speciali durante le festività.

👉 Pronto per esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

3.1.9 Serratura con Password

Introduzione

In questo progetto, utilizzeremo un tastierino numerico e un LCD per creare una serratura a combinazione. L’LCD visualizzerà un messaggio per guidarti nell’inserimento della password tramite il tastierino. Se la password è corretta, verrà visualizzato «Correct».

Basandoci su questo progetto, possiamo aggiungere ulteriori componenti elettronici, come un buzzer o un LED, per creare effetti diversi a seconda dell’inserimento della password.

Componenti

_images/list_Password_Lock.png

Diagramma Elettrico

T-Board Name

physical

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

Procedura Sperimentale

Passo 1: Costruisci il circuito.

_images/image262.png

Per Utenti Linguaggio C

Passo 2: Cambia la directory.

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

Passo 3: Compila.

gcc 3.1.9_PasswordLock.cpp -lwiringPi

Passo 4: Esegui.

sudo ./a.out

Dopo l’esecuzione del codice, usa il tastierino per inserire la password. Se appare "CORRECT" su LCD1602, la password è corretta; altrimenti, vedrai "WRONG KEY".

Nota

Se il programma non funziona o ricevi il messaggio di errore: "wiringPi.h: No such file or directory", consulta la sezione Il codice C non funziona?.

Spiegazione del Codice

#define ROWS  4
#define COLS  4
#define BUTTON_NUM (ROWS * COLS)
#define LENS  4

unsigned char KEYS[BUTTON_NUM] {
'1','2','3','A',
'4','5','6','B',
'7','8','9','C',
'*','0','#','D'};

char password[LENS]={'1','9','8','4'};

Qui definiamo la lunghezza della password LENS, la matrice KEYS con i valori dei tasti del tastierino e l’array che contiene la password corretta.

void keyRead(unsigned char* result);
bool keyCompare(unsigned char* a, unsigned char* b);
void keyCopy(unsigned char* a, unsigned char* b);
void keyPrint(unsigned char* a);
void keyClear(unsigned char* a);
int keyIndexOf(const char value);

Queste sono le dichiarazioni delle funzioni ausiliarie per la gestione del tastierino; consulta 2.1.5 Tastierino di questo documento per ulteriori dettagli.

void write_word(int data);
void send_command(int comm);
void send_data(int data);
void lcdInit();
void clear();
void write(int x, int y, char const data[]);

Queste sono le dichiarazioni delle funzioni ausiliarie per il codice LCD1602; consulta 1.1.7 LCD1602 I2C per maggiori dettagli.

while(1){
        keyRead(pressed_keys);
        bool comp = keyCompare(pressed_keys, last_key_pressed);
        ...
                testword[keyIndex]=pressed_keys[0];
                keyIndex++;
                if(keyIndex==LENS){
                    if(check()==0){
                        clear();
                        write(3, 0, "WRONG KEY!");
                        write(0, 1, "please try again");
                        }
                ...

Legge il valore del tasto e lo memorizza nell’array testword. Se il numero di valori memorizzati supera i 4, la correttezza della password viene verificata automaticamente e il risultato viene mostrato sull’LCD.

int check(){
    for(int i=0;i<LENS;i++){
        if(password[i]!=testword[i])
        {return 0;}
    }
    return 1;
}

Verifica la correttezza della password. Restituisce 1 se la password è corretta e 0 in caso contrario. Per Utenti Python ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Passo 2: Cambia directory.

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

Passo 3: Esegui.

sudo python3 3.1.9_PasswordLock.py

Dopo l’esecuzione del codice, usa il tastierino per inserire la password: 1984. Se sul display LCD1602 appare "CORRECT", la password è giusta; altrimenti, verrà visualizzato "WRONG KEY".

Codice

Nota

Puoi Modificare/Reimpostare/Copiare/Eseguire/Arrestare il codice qui sotto. Prima di ciò, però, devi accedere al percorso del codice sorgente come davinci-kit-for-raspberry-pi/python.

import RPi.GPIO as GPIO
import time
import LCD1602

##################### LIBRERIA DEL TASTIERINO ADATTATA DA Arduino ############
#class Key:Definisce alcune proprietà del tastierino
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

################ ESEMPIO DI CODICE ################
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(indirizzo slave, retroilluminazione)
    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__':     # Programma inizia da qui
    try:
        setup()
        loop()
    except KeyboardInterrupt:  # Quando viene premuto 'Ctrl+C', il programma eseguirà destroy().
        destroy()

Spiegazione del Codice

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"]

Qui definiamo la lunghezza della password LENS, l’array keys che memorizza i tasti della tastiera matriciale, e l’array password che contiene la password corretta.

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)
...

Questa classe contiene il codice che legge i valori dei tasti premuti. Consulta 2.1.5 Tastierino di questo documento per maggiori dettagli.

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
...

Leggi il valore del tasto e memorizzalo nell’array di test testword. Se il numero di valori memorizzati supera 4, la correttezza della password viene verificata automaticamente, e i risultati della verifica vengono mostrati sull’interfaccia LCD.

def check():
    for i in range(0,LENS):
        if(password[i]!=testword[i]):
            return 0
    return 1

Verifica la correttezza della password. Restituisce 1 se la password è corretta, e 0 se non lo è.

Immagine del Fenomeno

_images/image263.jpeg