Suchcode

ESP32 Tutorial 36/55 - Zahlratenspiel | SunFounder's ESP32 IoT Lernset

ESP32 Tutorial 36/55 - Zahlratenspiel | SunFounder's ESP32 IoT Lernset

In diesem Tutorial werden wir ein unterhaltsames Zahlenspiel erstellen, bei dem es darum geht, eine zufällig generierte Zahl zwischen 0 und 99 zu erraten, indem wir den ESP32-Mikrocontroller zusammen mit einer Infrarotfernbedienung und einem LCD-Display verwenden. Der Spieler wird versuchen, die richtige Zahl zu erraten, wobei das Spiel Hinweise gibt, ob die Schätzung zu hoch oder zu niedrig ist. Durch dieses Projekt werden Sie lernen, wie man den Infrarotempfänger verwendet, Werte auf einem LCD anzeigt und Benutzereingaben von einer Fernbedienung verwaltet. Sie können das Video zur zusätzlichen Klarheit ansehen (im Video bei 00:00).

ESP32_36_nummer_raten-1
ESP32_36_guessing_numbe-2

Hardware erklärt

Die Hauptkomponenten, die in diesem Projekt verwendet werden, sind der ESP32-Mikrocontroller, eine Infrarotfernbedienung, ein Infrarotempfänger und ein LCD-Display. Der ESP32 dient als zentrale Verarbeitungseinheit und ist in der Lage, drahtlose Kommunikation zu handhaben, was ihn zu einer vielseitigen Wahl für IoT-Projekte macht. Die Infrarotfernbedienung ermöglicht es den Benutzern, Eingaben zu machen, ohne physisch mit dem Board zu interagieren, während das LCD den Spielstatus und Aufforderungen anzeigt.

Der Infrarotempfänger erkennt Signale von der Fernbedienung und dekodiert sie zur Verwendung im Spiel. Jeder Tastendruck auf der Fernbedienung entspricht einem bestimmten Wert, den der ESP32 interpretieren kann. Das LCD-Display bietet eine visuelle Schnittstelle für den Benutzer, die den aktuellen Schätzbereich und anzeigt, ob die Schätzung korrekt war.

Datenblattdetails

Hersteller SunFounder
Teilenummer ESP32
Logik/IO-Spannung 3,3 V
Versorgungsspannung 5 V (über USB)
Ausgangsstrom (pro Kanal) 12 mA (max)
PWM-Frequenzrichtlinien 1 kHz
Eingabelogikschwellen 0,3 * Vcc bis 0,7 * Vcc
Spannungsabfall / RDS(on)/ Sättigung 0,2 V
Thermische Grenzen Betriebstemperatur: -40 bis 85 °C
Paket WROOM-32 Modul
Hinweise / Varianten Unterstützt WLAN und Bluetooth

  • Stellen Sie sicher, dass alle Komponenten für 3,3 V und 5 V geeignet sind, wo dies zutrifft.
  • Verwenden Sie geeignete Pull-Up-Widerstände für den IR-Empfänger, um schwebende Eingangssignale zu vermeiden.
  • Berücksichtigen Sie die Verwendung eines Kühlkörpers, wenn Sie über längere Zeit mit maximalem Ausgangsstrom arbeiten.
  • Beim Einsatz von PWM sollte eine Frequenz von etwa 1 kHz für optimale Leistung eingehalten werden.
  • Seien Sie vorsichtig mit der Verkabelung; stellen Sie sicher, dass die Verbindungen sicher sind, um intermittierende Ausfälle zu vermeiden.

Verdrahtungsanweisungen

ESP32_36_guessing_number_wiring

Um die Verdrahtung für das Zahlengeschätzspiel einzurichten, beginnen Sie mit dem Anschließen des Infrarotempfängers. Verbinden Sie den roten Draht vom rechten Pin des Empfängers mit der 3,3 V Stromversorgung auf dem ESP32. Der schwarze Draht sollte mit dem Boden verbunden werden, während der linke Pin des Infrarotempfängers mit dem Pin verbinden.14auf dem ESP32.

ESP32_36_Zahlenraten_Schaltplan

Als Nächstes schließen Sie das LCD-Display an. Verbinden Sie den VCC-Pin des LCD mit der 5-V-Versorgung des ESP32 und den Ground-Pin mit dem Masseanschluss. Die SDA- und SCL-Pins des LCD sollten mit den Pins verbunden werden.21und22beziehungsweise. Stellen Sie sicher, dass zwischen den SDA- und SCL-Verbindungen zwei Leerzeichen frei bleiben, um Pin-Konflikte zu vermeiden. Entfernen Sie schließlich alle Kunststoffabdeckungen von der Batterie, bevor Sie die Platine mit Strom versorgen.

Codebeispiele und Durchgänge

Die folgenden Codeausschnitte veranschaulichen wesentliche Teile des Programms, das für das Zahlenratenspiel verwendet wird. Wir beginnen damit, notwendige Bibliotheken einzufügen und wichtige Bezeichner zu definieren.

#include 
#include 
#include 
#include 

const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;

In diesem Auszug fügen wir Bibliotheken für die Handhabung der LCD- und IR-Empfängerfunktionalität ein. Der Pin für den Infrarotempfänger ist definiert als14, und wir erstellen Instanzen der notwendigen Objekte, um Eingaben und Ausgaben zu verwalten.

void setup() {
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  irrecv.enableIRIn();
  initNewValue();
}

Dieser Snippet zeigt die Setup-Funktion, in der wir das LCD initialisieren, die serielle Kommunikation starten und den IR-Empfänger aktivieren. Die FunktioninitNewValue()wird aufgerufen, um eine neue Zufallszahl für den Spieler zu generieren, die er erraten soll.

bool detectPoint() {
  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;
}

Diese Funktion vergleicht die Vermutung des Spielers mit der zufällig generierten Zahl und passt die oberen und unteren Grenzen entsprechend an. Wenn die Vermutung korrekt ist, wird der Zähler zurückgesetzt und es wird true zurückgegeben.

Der vollständige Code ist unter dem Artikel zu Ihrer Referenz geladen.

Demonstration / Was zu erwarten ist

Sobald alles verdrahtet ist und der Code hochgeladen wurde, wird das Spiel Sie auffordern, eine beliebige Zahl auf der Fernbedienung zu drücken. Das Spiel wird Ihnen dann Rückmeldung zu Ihren Vermutungen geben und den Bereich möglicher Zahlen aktualisieren, bis Sie die Zielnummer korrekt erraten. Wenn Sie die POWER-Taste drücken, wird das Spiel zurückgesetzt und von vorne begonnen (im Video bei 02:30).

Häufige Fehlerquellen sind, dass der Infrarotempfänger richtig ausgerichtet ist und dass alle Verbindungen sicher sind. Wenn das Spiel nicht reagiert, überprüfen Sie die Stromversorgung und stellen Sie sicher, dass das richtige Board und der richtige Port im Arduino IDE ausgewählt sind.

Video-Zeitstempel

  • 00:00 Start
  • 2:17 Einführung in das Spielprojekt
  • 4:37 Verkabelung
  • 6:15 Arduino-Code erklärt
  • 12:32 Auswahl des ESP32-Boards und COM-Ports in der Arduino IDE
  • 16:16 Spiele Zahlenraten

Bilder

ESP32_36_guessing_number_schematic
ESP32_36_guessing_number_schematic
ESP32_36_guessing_number_wiring
ESP32_36_guessing_number_wiring
ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2
ESP32_36_guessing_numbe-2
837-ESP32 Tutorial 36/55- Arduino code for guessing number
Sprache: C++
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>

 // Definieren Sie den IR-Empfängerpin
const uint16_t IR_RECEIVE_PIN = 14;

 // Erstelle ein IRrecv-Objekt
IRrecv irrecv(IR_RECEIVE_PIN);

 // Erstelle ein decode_results Objekt
decode_results results;

const long interval = 1000;

unsigned long previousMillis = 0;

 // Initialisieren Sie das LCD-Objekt
LiquidCrystal_I2C lcd(0x27, 16, 2);

 // Initialisiere den Eingabewert der Zahl.
int count = 0;

 // Initialisiere den zufälligen Glückspunkt
int pointValue = 0;

 // Initialisieren Sie die oberen und unteren Grenzwertspitzen.
int upper = 99;
int lower = 0;

void setup() {
 // Initialisiere den LCD-Bildschirm
  lcd.init();
  lcd.backlight();

 // Beginne die serielle Kommunikation
  Serial.begin(9600);

 // Aktivieren Sie den IR-Empfänger
  irrecv.enableIRIn();

 // Ein neues Glückspunktwert initialisieren
  initNewValue();
}

void loop() {
 // Wenn ein Signal vom IR-Empfänger empfangen wird
  if (irrecv.decode(&results)) {
    bool result = 0;
    String num = decodeKeyValue(results.value);

 // Wenn die POWER-Taste gedrückt wird
    if (num == "POWER") {
      initNewValue(); // Ein neues Glückspunktwert initialisieren
    }

 // Wenn die CYCLE-Taste gedrückt wird
    else if (num == "CYCLE") {
      result = detectPoint(); // Erkenne die eingegebene Nummer
      lcdShowInput(result); // Zeigen Sie das Ergebnis auf dem LCD-Bildschirm an.
    }

 // Wenn eine Zahlentaste (0-9) gedrückt wird,
 // Fügen Sie die Ziffer zur eingegebenen Zahl hinzu.
 // und die Zahl erkennen, wenn sie größer oder gleich 10 ist
    else if (num >= "0" && num <= "9") {
      count = count * 10;
      count += num.toInt();
      if (count >= 10) {
        result = detectPoint();
      }
      lcdShowInput(result);
    }
    irrecv.resume();
  }
}

 // Funktion zur Initialisierung eines neuen Glückspunktwerts
void initNewValue() {
 // Setzen Sie den Zufalls-Seed basierend auf dem analogen Wert von Pin A0.
  randomSeed(analogRead(A0));

 // Erzeuge einen neuen zufälligen Wert für den Glückspunkt.
  pointValue = random(99);

 // Setzen Sie die oberen und unteren Grenzwerte zurück.
  upper = 99;
  lower = 0;

 // Zeigen Sie die Willkommensnachricht auf dem LCD-Bildschirm an.
  lcd.clear();
  lcd.print("    Welcome!");
  lcd.setCursor(0, 1);
  lcd.print("Press Any Number");

 // Setzen Sie den Eingabezahlenwert zurück.
  count = 0;

 // Geben Sie den Wert des Glückspunktes im seriellen Monitor aus.
  Serial.print("point is ");
  Serial.println(pointValue);
}

 // Erkenne die eingegebene Nummer
 // und aktualisieren Sie die Tipps für die Ober-/Untergrenze entsprechend
bool detectPoint() {
  if (count > pointValue) {
    if (count < upper)upper = count;
  }
  else if (count < pointValue) {
    if (count > lower)lower = count;
  }

 // Wenn die Eingabezahl dem Wert des Glückspunkts entspricht,
  else if (count == pointValue) {

 // Setze die Eingabezahl zurück und gib true zurück.
    count = 0;
    return 1;
  }
 // Setze die Eingabezahl zurück und gebe false zurück.
  count = 0;
  return 0;
}

 // Zeigen Sie die Eingabezahl und die Tipps für die obere/untere Grenze.
void lcdShowInput(bool result) {
  lcd.clear();

 // Wenn die eingegebene Zahl dem Wert des Glückspunktes entspricht
  if (result == 1)
  {
 // Zeige die Erfolgsmeldung an und initialisiere einen neuen Glückspunktwert.
    lcd.setCursor(0, 1);
    lcd.print(" You've got it! ");
    delay(5000);
    initNewValue();
    return;
  }
  lcd.print("Enter number:");
  lcd.print(count);
  lcd.setCursor(0, 1);
  lcd.print(lower);
  lcd.print(" < Point < ");
  lcd.print(upper);
}

 // Funktion zum Dekodieren des Schlüsselwerts aus dem IR-Empfängersignal
String decodeKeyValue(long result)
{
  switch(result){
    case 0xFF6897:
      return "0";
    case 0xFF30CF:
      return "1";
    case 0xFF18E7:
      return "2";
    case 0xFF7A85:
      return "3";
    case 0xFF10EF:
      return "4";
    case 0xFF38C7:
      return "5";
    case 0xFF5AA5:
     return "6";
    case 0xFF42BD:
      return "7";
    case 0xFF4AB5:
      return "8";
    case 0xFF52AD:
      return "9";
    case 0xFF906F:
      return "+";
    case 0xFFA857:
      return "-";
    case 0xFFE01F:
      return "EQ";
    case 0xFFB04F:
      return "U/SD";
    case 0xFF9867:
      return "CYCLE";
    case 0xFF22DD:
      return "PLAY/PAUSE";
    case 0xFF02FD:
      return "BACKWARD";
    case 0xFFC23D:
      return "FORWARD";
    case 0xFFA25D:
      return "POWER";
    case 0xFFE21D:
      return "MUTE";
    case 0xFF629D:
      return "MODE";
    case 0xFFFFFFFF:
      return "ERROR";
    default :
      return "ERROR";
    }
}

Ressourcen & Referenzen

Dateien📁

Keine Dateien verfügbar.