Nota

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 [Qui] e unisciti oggi stesso!

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.

../_images/list_GAME_Guess_Number.png

È sicuramente conveniente acquistare un intero kit, ecco il link:

Nome

OGGETTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link qui sotto.

INTRODUZIONE COMPONENTI

LINK ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Tastierino

-

I2C LCD1602

ACQUISTA

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)

../_images/Schematic_three_one12.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image273.png

Passo 2: Configura I2C (vedi Appendice Configurazione I²C. Se hai già configurato I2C, salta questo passaggio.)

Passo 3: Cambia directory.

cd ~/raphael-kit/c/3.1.11/

Passo 4: Compila.

gcc 3.1.11_GAME_GuessNumber.c -lwiringPi

Passo 5: Esegui.

sudo ./a.out

Dopo l’avvio del programma, verrà visualizzata la pagina iniziale sull’LCD:

Nota

  • Se compare un messaggio di errore wiringPi.h: No such file or directory, consulta Installa e Controlla wiringPi.

  • Se ricevi l’errore Unable to open I2C device: No such file or directory, devi fare riferimento a Configurazione I²C 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.

Benvenuto!
Premi A per iniziare!

Premi “A”, e il gioco inizierà. La pagina del gioco apparirà sull’LCD.

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 1.1.7 I2C LCD1602 e 2.1.8 Tastiera.

Qui ci interessano le seguenti funzioni:

/****************************************/
//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!”.

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.

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

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,"<Point<");
    Int2Str(str,upper);
    write(12,1,str);
}

Questa funzione serve a mostrare la pagina di gioco. Nota la funzione Int2Str(str,count), che converte queste variabili count, lower e upper da intero a stringa di caratteri per la corretta visualizzazione su lcd.

int main(){
    unsigned char pressed_keys[BUTTON_NUM];
    unsigned char last_key_pressed[BUTTON_NUM];
    if(wiringPiSetup() == -1){ //quando l'inizializzazione di wiringPi fallisce, stampa messaggio a schermo
        printf("setup wiringPi failed !");
        return 1;
    }
    init();
    init_new_value();
    while(1){
        keyRead(pressed_keys);
        bool comp = keyCompare(pressed_keys, last_key_pressed);
        if (!comp){
            if(pressed_keys[0] != 0){
                bool result = 0;
                if(pressed_keys[0] == 'A'){
                    init_new_value();
                    lcd_show_input(0);
                }
                else if(pressed_keys[0] == 'D'){
                    result = detect_point();
                    lcd_show_input(result);
                }
                else if(pressed_keys[0] >='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

../_images/image274.jpeg