.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Immergiti più a fondo nel mondo di Raspberry Pi, Arduino e ESP32 con altri appassionati. **Perché unirsi a noi?** - **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra comunità e del nostro team. - **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue abilità. - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime. - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e omaggi**: Partecipa a omaggi e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _3.1.11_c: 3.1.11 GIOCO – Indovina il numero ====================================== Introduzione ------------------ Indovina il Numero è un gioco divertente da fare in compagnia in cui tu e i tuoi amici vi alternate inserendo un numero (0~99). L'intervallo diventerà più piccolo man mano che vengono inseriti i numeri fino a quando un giocatore indovinerà il numero corretto. Il giocatore sconfitto subirà una penalità. Ad esempio, se il numero fortunato è 51, che i giocatori non possono vedere, e il giocatore ① inserisce 50, l'intervallo numerico cambierà in 50~99; se il giocatore ② inserisce 70, l'intervallo diventerà 50~70; se il giocatore ③ inserisce 51, questo giocatore sarà quello sfortunato. In questo progetto, utilizziamo un tastierino per inserire i numeri e un display LCD per mostrare i risultati. Componenti necessari ------------------------------ In questo progetto, avremo bisogno dei seguenti componenti. .. image:: ../img/list_GAME_Guess_Number.png :align: center È sicuramente conveniente acquistare un intero kit, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - OGGETTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link qui sotto. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE COMPONENTI - LINK 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_keypad` - \- * - :ref:`cpn_i2c_lcd` - |link_i2clcd1602_buy| 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 SPIMOSI Pin 19 12 10 GPIO22 Pin 15 3 22 GPIO27 Pin 13 2 27 GPIO17 Pin 11 0 17 SDA1 Pin 3 SDA1(8) SDA1(2) SCL1 Pin 5 SCL1(9) SDA1(3) ============ ======== ======== ======= .. image:: ../img/Schematic_three_one12.png :align: center Procedure Sperimentali ----------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/image273.png **Passo 2**: Configura I2C (vedi Appendice :ref:`i2c_config`. Se hai già configurato I2C, salta questo passaggio.) **Passo 3**: Cambia directory. .. raw:: html .. code-block:: cd ~/raphael-kit/c/3.1.11/ **Passo 4**: Compila. .. raw:: html .. code-block:: gcc 3.1.11_GAME_GuessNumber.c -lwiringPi **Passo 5**: Esegui. .. raw:: html .. code-block:: sudo ./a.out Dopo l'avvio del programma, verrà visualizzata la pagina iniziale sull'LCD: .. note:: * Se compare un messaggio di errore ``wiringPi.h: No such file or directory``, consulta :ref:`install_wiringpi`. * Se ricevi l'errore ``Unable to open I2C device: No such file or 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 continua a non visualizzare contenuti, puoi regolare il potenziometro sul retro per aumentare il contrasto. .. code-block:: Benvenuto! Premi A per iniziare! Premi 'A', e il gioco inizierà. La pagina del gioco apparirà sull'LCD. .. code-block:: Inserisci numero: 0 ‹numero‹ 99 Un numero casuale 'punti' viene generato ma non mostrato sull'LCD quando inizia il gioco. Devi cercare di indovinarlo. Il numero inserito apparirà alla fine della prima riga fino a che non sarà effettuato il calcolo finale. (Premi 'D' per avviare il confronto, e se il numero inserito è maggiore di 10, il confronto automatico inizierà.) L'intervallo del numero 'punti' è mostrato sulla seconda riga. Devi inserire un numero entro l'intervallo. Quando inserisci un numero, l'intervallo si restringerà; se indovini il numero fortunato o sfortunato, apparirà "Hai indovinato!" Spiegazione del Codice ---------------------- Nella prima parte del codice troviamo le funzioni del **tastierino** e dell'**I2C LCD1602**. Puoi trovare ulteriori dettagli su queste funzioni nei capitoli :ref:`1.1.7_c` e :ref:`2.1.8_c`. Qui ci interessano le seguenti funzioni: .. code-block:: c /****************************************/ //Inizia da qui /****************************************/ void init(void){     fd = wiringPiI2CSetup(LCDAddr);     lcd_init();     lcd_clear();     for(int i=0 ; i<4 ; i++) {         pinMode(rowPins[i], OUTPUT);         pinMode(colPins[i], INPUT);     }     lcd_clear();     write(0, 0, "Welcome!");     write(0, 1, "Press A to go!"); } Questa funzione viene utilizzata per definire inizialmente **I2C LCD1602** e **tastierino** e per visualizzare “Benvenuto!” e “Premi A per iniziare!”. .. code-block:: c void init_new_value(void){     srand(time(0));     pointValue = rand()%100;     upper = 99;     lower = 0;     count = 0;     printf("point is %d\n",pointValue); } Questa funzione genera il numero casuale 'punti' e reimposta l'intervallo di suggerimento per il numero. .. code-block:: c bool detect_point(void){     if(count > pointValue){         if(count < upper){             upper = count;         }     }     else if(count < pointValue){         if(count > lower){             lower = count;         }     }     else if(count = pointValue){         count = 0;         return 1;     }     count = 0;     return 0; } La funzione detect_point() confronta il numero inserito con il numero generato. Se il risultato del confronto è negativo, **count** assegnerà valori a **upper** e **lower** e restituirà '0'; in caso contrario, se il risultato indica che sono uguali, verrà restituito '1'. .. code-block:: c void lcd_show_input(bool result){     char *str=NULL;     str =(char*)malloc(sizeof(char)*3);     lcd_clear();     if (result == 1){         write(0,1,"You've got it!");         delay(5000);         init_new_value();         lcd_show_input(0);         return;     }     write(0,0,"Enter number:");     Int2Str(str,count);     write(13,0,str);     Int2Str(str,lower);     write(0,1,str);     write(3,1,"='0' && pressed_keys[0] <= '9'){                     count = count * 10;                     count = count + (pressed_keys[0] - 48);                     if (count>=10){                         result = detect_point();                     }                     lcd_show_input(result);                 }             }             keyCopy(last_key_pressed, pressed_keys);         }         delay(100);     }     return 0;    } Main() contiene l'intero processo del programma, come segue: 1) Inizializza **I2C LCD1602** e **tastierino**. 2) Usa **init_new_value()** per creare un numero casuale **0-99**. 3) Verifica se il pulsante è stato premuto e ottieni la lettura del pulsante. 4) Se il pulsante 'A' viene premuto, verrà generato un numero casuale **0-99** e il gioco inizierà. 5) Se il pulsante 'D' viene rilevato come premuto, il programma entrerà nel giudizio del risultato e lo mostrerà sull'LCD. Questo passaggio consente di giudicare il risultato anche premendo un solo numero e poi il pulsante 'D'. 6) Se viene premuto un pulsante compreso tra **0-9**, il valore di **count** verrà modificato; se **count** è maggiore di **10**, inizierà il giudizio. 7) I cambiamenti del gioco e i suoi valori vengono visualizzati su **LCD1602**. Immagine del fenomeno -------------------------- .. image:: ../img/image274.jpeg :align: center