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

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 |

Procedura Sperimentale
Passo 1: Costruisci il circuito.

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
