Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [ hier ] und treten Sie heute bei!

SPIEL - Zahl Erraten

„Zahl Erraten“ ist ein unterhaltsames Partyspiel, bei dem du und deine Freunde abwechselnd eine Zahl (0~99) eingeben. Der Bereich wird mit jeder Eingabe enger, bis ein Spieler die Antwort richtig errät. Der Spieler, der richtig rät, wird zum Verlierer erklärt und einer Strafe unterzogen. Zum Beispiel, wenn die geheime Zahl 51 ist, die die Spieler nicht sehen können, und Spieler 1 gibt 50 ein, ändert sich die Bereichsanzeige auf 50~99. Wenn Spieler 2 70 eingibt, wird der Bereich zu 50~70. Wenn Spieler 3 51 eingibt, ist er der Unglückliche. In diesem Spiel verwenden wir eine IR-Fernbedienung, um Zahlen einzugeben, und ein LCD, um Ergebnisse anzuzeigen.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Steckbrett

KAUFEN

Jumperkabel

KAUFEN

I2C LCD1602

KAUFEN

Infrarotempfänger

KAUFEN

Verdrahtung

../_images/10_guess_number_bb.png

Schaltplan

../_images/10_guess_number_schematic.png

Code

Bemerkung

  • Sie können die Datei 10_guess_number.ino direkt unter dem Pfad elite-explorer-kit-main\fun_project\10_guess_number öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

Bemerkung

Um die Bibliothek zu installieren, verwenden Sie den Arduino-Bibliotheksmanager und suchen Sie nach „IRremote“ und „LiquidCrystal I2C“ und installieren Sie diese.

10_guess_number.ino
  1/*
  2  This code is for an Arduino Uno R4 board setup with an I2C LCD1602 display 
  3  and an Infrared (IR) Receiver. The program facilitates a guessing game where 
  4  a random number is generated. The user then uses an IR remote control to guess 
  5  this number. Feedback is provided on the LCD1602 display, and the generated 
  6  random number is also displayed on the Serial Monitor.
  7
  8  Board: Arduino Uno R4 
  9  Component: I2C LCD1602 and Infrared Receiver
 10  Library: https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/ (LiquidCrystal I2C by Frank de Brabander)
 11           https://github.com/Arduino-IRremote/Arduino-IRremote (IRremote by shirriff, z3t0, ArminJo)
 12*/
 13
 14
 15#include <Wire.h>
 16#include <LiquidCrystal_I2C.h>
 17#include <IRremote.h>
 18
 19const int IR_RECEIVE_PIN = 5;  // Define the pin number for the IR Sensor
 20String lastDecodedValue = "";  // Variable to store the last decoded value
 21
 22LiquidCrystal_I2C lcd(0x27, 16, 2);
 23
 24// Variables for game state
 25int currentGuess = 0;       // Current input number
 26int pointValue = 0;  // Target number
 27int upper = 99;      // Current upper limit for guessing
 28int lower = 0;       // Current lower limit for guessing
 29
 30void setup() {
 31  lcd.init();
 32  lcd.backlight();
 33  Serial.begin(9600);                                     // Start serial communication at 9600 baud rate
 34  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver
 35  initNewValue();                                         // Initialize a new game round
 36}
 37
 38void loop() {
 39  if (IrReceiver.decode()) {
 40    bool numberMatched = 0;
 41    // Serial.println(IrReceiver.decodedIRData.command);
 42    String num = decodeKeyValue(IrReceiver.decodedIRData.command);
 43    if (num != "ERROR" && num != lastDecodedValue) {
 44      Serial.println(num);
 45      lastDecodedValue = num;  // Update the last decoded value
 46    }
 47
 48    // Handle different IR commands
 49    if (num == "POWER") {
 50      initNewValue();  // Start new game if POWER button pressed
 51    } else if (num == "CYCLE") {
 52      numberMatched = detectPoint();
 53      lcdShowInput(numberMatched);
 54    } else if (num >= "0" && num <= "9") {
 55      currentGuess = currentGuess * 10;
 56      currentGuess += num.toInt();
 57      if (currentGuess >= 10) {
 58        numberMatched = detectPoint();
 59      }
 60      lcdShowInput(numberMatched);
 61    }
 62    IrReceiver.resume();  // Enable receiving of the next value
 63  }
 64}
 65
 66void initNewValue() {
 67
 68  // Generate a new target number
 69  randomSeed(analogRead(A0));  // Seed random number generator
 70  pointValue = random(99);     // Generate target number
 71
 72  upper = 99;
 73  lower = 0;
 74
 75  // Display welcome message
 76  lcd.clear();
 77  lcd.print("    Welcome!");
 78  lcd.setCursor(0, 1);
 79  lcd.print("  Guess Number!");
 80
 81  currentGuess = 0;
 82
 83  // Output target for debugging
 84  Serial.print("point is ");
 85  Serial.println(pointValue);
 86}
 87
 88bool detectPoint() {
 89  // Check if guess is correct, too high, or too low
 90  if (currentGuess > pointValue) {
 91    if (currentGuess < upper) upper = currentGuess;
 92  } else if (currentGuess < pointValue) {
 93    if (currentGuess > lower) lower = currentGuess;
 94  } else if (currentGuess == pointValue) {
 95    currentGuess = 0;
 96    return true;
 97  }
 98  currentGuess = 0;
 99  return false;
100}
101
102void lcdShowInput(bool numberMatched) {
103  lcd.clear();
104  if (numberMatched == 1) {
105    lcd.setCursor(0, 0);
106    lcd.print("The number is ");
107    lcd.print(pointValue);
108    lcd.setCursor(0, 1);
109    lcd.print(" You've got it! ");
110    delay(5000);
111    initNewValue();
112    return;
113  }
114  lcd.print("Enter number:");
115  lcd.print(currentGuess);
116  lcd.setCursor(0, 1);
117  lcd.print(lower);
118  lcd.print(" < Point < ");
119  lcd.print(upper);
120}
121
122
123String decodeKeyValue(long irCode) {
124  // Map IR codes to corresponding commands
125  switch (irCode) {
126    case 0x16:
127      return "0";
128    case 0xC:
129      return "1";
130    case 0x18:
131      return "2";
132    case 0x5E:
133      return "3";
134    case 0x8:
135      return "4";
136    case 0x1C:
137      return "5";
138    case 0x5A:
139      return "6";
140    case 0x42:
141      return "7";
142    case 0x52:
143      return "8";
144    case 0x4A:
145      return "9";
146    case 0x9:
147      return "+";
148    case 0x15:
149      return "-";
150    case 0x7:
151      return "EQ";
152    case 0xD:
153      return "U/SD";
154    case 0x19:
155      return "CYCLE";
156    case 0x44:
157      return "PLAY/PAUSE";
158    case 0x43:
159      return "FORWARD";
160    case 0x40:
161      return "BACKWARD";
162    case 0x45:
163      return "POWER";
164    case 0x47:
165      return "MUTE";
166    case 0x46:
167      return "MODE";
168    case 0x0:
169      return "ERROR";
170    default:
171      return "ERROR";
172  }
173}

Wie funktioniert des?

  1. Bibliotheksimporte und globale Variablendefinitionen:

    Drei Bibliotheken werden importiert: Wire für die I2C-Kommunikation, LiquidCrystal_I2C zur Steuerung des LCD-Displays und IRremote zum Empfangen von Signalen der Infrarot-Fernbedienung. Mehrere globale Variablen werden definiert, um den Spielstand und die Einstellungen zu speichern.

  2. setup()

    Initialisieren Sie das LCD-Display und schalten Sie die Hintergrundbeleuchtung ein. Initialisieren Sie die serielle Kommunikation mit einer Baudrate von 9600. Starten Sie den Infrarotempfänger. Rufen Sie die Funktion initNewValue() auf, um den anfänglichen Spielzustand einzustellen.

  3. loop()

    Überprüfen Sie, ob ein Signal von der Infrarot-Fernbedienung empfangen wurde. Dekodieren Sie das empfangene Infrarotsignal. Aktualisieren Sie den Spielstand oder führen Sie entsprechende Aktionen basierend auf dem dekodierten Wert (Zahl oder Befehl) aus.

  4. initNewValue()

    Verwenden Sie analogRead, um den Zufallszahlensamen zu initialisieren und zu gewährleisten, dass jedes Mal unterschiedliche Zufallszahlen generiert werden. Generieren Sie eine Zufallszahl zwischen 0 und 98 als Glückszahl (die Zahl, die die Spieler erraten müssen). Setzen Sie die Hinweise für die obere und untere Grenze zurück. Zeigen Sie eine Begrüßungsnachricht auf dem LCD an. Setzen Sie die Eingabenummer zurück.

  5. detectPoint()

    Überprüfen Sie das Verhältnis zwischen der Eingabenummer des Spielers und der Glückszahl. Wenn die Eingabenummer größer als die Glückszahl ist, aktualisieren Sie den Hinweis für die obere Grenze. Wenn die Eingabenummer kleiner als die Glückszahl ist, aktualisieren Sie den Hinweis für die untere Grenze. Wenn der Spieler die richtige Zahl eingibt, setzen Sie die Eingabe zurück und geben Sie wahr zurück.

  6. lcdShowInput()

    Zeigen Sie die Eingabe des Spielers und die aktuellen Hinweise für die obere und untere Grenze auf dem LCD an. Wenn der Spieler richtig rät, zeigen Sie eine Erfolgsmeldung an und pausieren Sie für 5 Sekunden, bevor Sie das Spiel neu starten.