.. note:: Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme agli altri appassionati. **Perché unirti a noi?** - **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra community e del nostro team. - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Ottieni accesso anticipato ai nuovi annunci di prodotti e alle anteprime. - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e omaggi**: Partecipa a omaggi e promozioni speciali durante le festività. 👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _3.1.8_c: 3.1.8 Serratura a Combinazione ====================================== Introduzione ---------------- In questo progetto, utilizzeremo un tastierino e un display LCD per realizzare una serratura a combinazione. Il display LCD visualizzerà un messaggio per guidarti nell'inserimento della password tramite il tastierino. Se la password viene inserita correttamente, verrà visualizzato "Corretto". Sulla base di questo progetto, possiamo aggiungere ulteriori componenti elettronici, come un cicalino, LED e così via, per aggiungere diversi fenomeni sperimentali all'inserimento della password. Componenti necessari ------------------------------ In questo progetto, avremo bisogno dei seguenti componenti. .. image:: ../img/list_Password_Lock.png :align: center È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistare i componenti separatamente dai link qui sotto. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE COMPONENTI - LINK DI ACQUISTO * - :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` - \- Schema 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 ============ ======== ======== === .. image:: ../img/Schematic_three_one9.png :align: center Procedura sperimentale ------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/image262.png **Passo 2**: Vai nella cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/c/3.1.8/ **Passo 3**: Compila. .. raw:: html .. code-block:: gcc 3.1.8_PasswordLock.cpp -lwiringPi **Passo 4:** Esegui. .. raw:: html .. code-block:: sudo ./a.out Dopo l'esecuzione del codice, utilizza il tastierino per inserire la password corretta: 1984. Se sul display LCD1602 appare “CORRETTO”, la password è stata inserita correttamente; altrimenti, apparirà “CHIAVE ERRATA”. .. note:: * Se appare un errore come ``wiringPi.h: Nessun file o directory``, fai riferimento a :ref:`install_wiringpi`. * Se appare l'errore ``Impossibile aprire il dispositivo I2C: Nessun file o directory``, devi fare riferimento a :ref:`i2c_config` per abilitare I2C e controllare se il cablaggio è corretto. * Se il codice e il cablaggio sono corretti, ma l'LCD non mostra contenuti, puoi ruotare il potenziometro sul retro per aumentare il contrasto. **Spiegazione del codice** .. code-block:: c #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 che memorizza i valori dei tasti del tastierino KEYS e l'array che memorizza la password corretta. .. code-block:: c 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); C'è una dichiarazione delle sottofunzioni del codice del tastierino a matrice, fai riferimento a :ref:`2.1.8_c` di questo documento per maggiori dettagli. .. code-block:: c 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[]); C'è una dichiarazione delle sottofunzioni del codice LCD1062, fai riferimento a :ref:`1.1.7_c` di questo documento per maggiori dettagli. .. code-block:: c 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"); } ... Leggi il valore del tasto e memorizzalo nell'array di test testword. Se il numero di valori di tasti memorizzati supera 4, la correttezza della password viene verificata automaticamente, e i risultati della verifica vengono visualizzati sull'interfaccia LCD. .. code-block:: c int check(){ for(int i=0;i