ESP32 Tutoriaal 36/55 - Raai Nommer Speletjie | SunFounder se ESP32 IoT-leerkit
In hierdie tutoriaal gaan ons 'n prettige raai-nommer-speletjie skep deur die ESP32-mikrobeheerder saam met 'n infrarooi-afstandbeheer en 'n LCD-skerm te gebruik. Die speler sal probeer om 'n ewekansig gegenereerde nommer tussen 0 en 99 te raai, met die speletjie wat wenke gee oor of die raaiskoot te hoog of te laag is. Deur hierdie projek sal jy leer hoe om die infrarooi-ontvanger te gebruik, waardes op 'n LCD te vertoon, en gebruikersinvoer vanaf 'n afstandbeheer te bestuur. Jy kan na die video verwys vir addisionele duidelikheid (in video by 00:00).
Hardeware Verduidelik
Die primêre komponente wat in hierdie projek gebruik word, sluit die ESP32-mikrobeheerder, 'n infrarooi-afstandbeheer, 'n infrarooi-ontvanger en 'n LCD-skerm in. Die ESP32 dien as die hoofverwerkingseenheid en is in staat om draadlose kommunikasie te hanteer, wat dit 'n veelsydige keuse vir IoT-projekte maak. Die infrarooi-afstandbeheer stel gebruikers in staat om raaiskote in te voer sonder om fisiese interaksie met die bord te vereis, terwyl die LCD die speletjiestatus en -aanwysings vertoon.
Die infrarooi-ontvanger bespeur seine vanaf die afstandbeheer en dekodeer dit vir gebruik in die speletjie. Elke knoppiedruk op die afstandbeheer stem ooreen met 'n spesifieke waarde wat die ESP32 kan interpreteer. Die LCD-skerm bied 'n visuele koppelvlak vir die gebruiker, wat die huidige raai-omvang en of die raaiskoot korrek was, wys.
Datablad Besonderhede
| Vervaardiger | SunFounder |
|---|---|
| Deelnommer | ESP32 |
| Logika/IO-spanning | 3.3 V |
| Toevoerspanning | 5 V (via USB) |
| Uitsetstroom (per kanaal) | 12 mA (maks) |
| PWM-frekwensie-riglyne | 1 kHz |
| Invoerlogika-drempels | 0.3 * Vcc tot 0.7 * Vcc |
| Spanningsval / RDS(on) / versadiging | 0.2 V |
| Termiese limiete | Werkingstemperatuur: -40 tot 85 °C |
| Pakket | WROOM-32-module |
| Notas / variante | Ondersteun Wi-Fi en Bluetooth |
- Maak seker dat alle komponente gegradeer is vir 3.3 V en 5 V waar van toepassing.
- Gebruik behoorlike optrekweerstande vir die IR-ontvanger om drywende insette te vermy.
- Oorweeg die gebruik van 'n hittesink as jy vir lang tydperke teen maksimum uitsetstroom werk.
- Wanneer PWM gebruik word, handhaaf 'n frekwensie van ongeveer 1 kHz vir optimale werkverrigting.
- Wees versigtig met bedrading; maak seker dat verbindings veilig is om intermitterende foute te vermy.
Bedradingsinstruksies

Om die bedrading vir die raai-nommer-speletjie op te stel, begin deur die infrarooi-ontvanger te koppel. Verbind die rooi draad vanaf die regterpen van die ontvanger aan die 3.3 V-kragtoevoer op die ESP32. Die swart draad moet na die grond gaan, terwyl die linkerkantste pen van die infrarooi-ontvanger aan pen 14 op die ESP32 koppel.
Volgende, bedraad die LCD-skerm. Verbind die VCC-pen van die LCD aan die 5 V-toevoer op die ESP32 en die grondpen aan grond. Die SDA- en SCL-penne van die LCD moet onderskeidelik aan penne 21 en 22 gekoppel word. Maak seker dat daar twee leë spasies tussen die SDA- en SCL-verbindings is om penkonflikte te vermy. Maak laastens seker dat jy enige plastiekbedekkings van die battery verwyder voordat jy die bord van krag voorsien.
Kode Voorbeelde & Deurloop
Die volgende kodefragmente illustreer noodsaaklike dele van die program wat vir die raai-nommer-speletjie gebruik word. Ons begin deur nodige biblioteke in te sluit en sleutelidentifiseerders te definieer.
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
In hierdie uittreksel sluit ons biblioteke in vir die hantering van die LCD- en IR-ontvangerfunksionaliteit. Die pen vir die infrarooi-ontvanger word as 14 gedefinieer, en ons skep instansies van die nodige voorwerpe om invoer en uitset te bestuur.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}
Hierdie fragment wys die opstellingsfunksie waar ons die LCD initialiseer, seriekommunikasie begin, en die IR-ontvanger aktiveer. Die funksie initNewValue() word geroep om 'n nuwe ewekansige nommer vir die speler om te raai, te genereer.
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;
}
Hierdie funksie kontroleer die speler se raaiskoot teen die ewekansig gegenereerde nommer, en pas die boonste en onderste limiete dienooreenkomstig aan. As die raaiskoot korrek is, stel dit die telling terug en gee dit waar terug.
Die volledige kode word onder die artikel gelaai vir jou verwysing.
Demonstrasie / Wat om te Verwags
Sodra alles bedraad is en die kode opgelaai is, sal die speletjie jou vra om enige nommer op die afstandbeheer te druk. Die speletjie sal dan terugvoer oor jou raaiskote gee, die reeks moontlike nommers opdateer totdat jy die teiken nommer korrek raai. As jy die KRAG-knoppie druk, herstel die speletjie en begin oor (in video by 02:30).
Algemene slaggate sluit in om te verseker dat die infrarooi-ontvanger korrek georiënteer is en dat alle verbindings veilig is. As die speletjie nie reageer nie, kontroleer die kragtoevoer en verifieer dat die korrekte bord en poort in die Arduino IDE gekies is.
Video Tydstempels
- 00:00 Begin
- 2:17 Inleiding tot die speletjieprojek
- 4:37 Bedrading
- 6:15 Arduino-kode verduidelik
- 12:32 Kies ESP32-bord en COM-poort in Arduino IDE
- 16:16 Speel die raai-nommer speletjie
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// Define the IR receiver pin
const uint16_t IR_RECEIVE_PIN = 14;
// Create an IRrecv object
IRrecv irrecv(IR_RECEIVE_PIN);
// Create a decode_results object
decode_results results;
const long interval = 1000;
unsigned long previousMillis = 0;
// Initialize the LCD object
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize the input number value
int count = 0;
// Initialize the random lucky point
int pointValue = 0;
// Initialize the upper and lower limit tips
int upper = 99;
int lower = 0;
void setup() {
// Initialize the LCD screen
lcd.init();
lcd.backlight();
// Start the serial communication
Serial.begin(9600);
// Enable the IR receiver
irrecv.enableIRIn();
// Initialize a new lucky point value
initNewValue();
}
void loop() {
// If a signal is received from the IR receiver
if (irrecv.decode(&results)) {
bool result = 0;
String num = decodeKeyValue(results.value);
// If the POWER button is pressed
if (num == "POWER") {
initNewValue(); // Initialize a new lucky point value
}
// If the CYCLE button is pressed
else if (num == "CYCLE") {
result = detectPoint(); // Detect the input number
lcdShowInput(result); // Show the result on the LCD screen
}
// If a number button (0-9) is pressed,
//add the digit to the input number
//and detect the number if it is greater than or equal to 10
else if (num >= "0" && num <= "9") {
count = count * 10;
count += num.toInt();
if (count >= 10) {
result = detectPoint();
}
lcdShowInput(result);
}
irrecv.resume();
}
}
// Function to initialize a new lucky point value
void initNewValue() {
// Set the random seed based on the analog value from pin A0
randomSeed(analogRead(A0));
// Generate a new random lucky point value
pointValue = random(99);
// Reset the upper and lower limit tips
upper = 99;
lower = 0;
// Show the welcome message on the LCD screen
lcd.clear();
lcd.print(" Welcome!");
lcd.setCursor(0, 1);
lcd.print("Press Any Number");
// Reset the input number value
count = 0;
// Print the lucky point value to the serial monitor
Serial.print("point is ");
Serial.println(pointValue);
}
// Detect the input number
//and update the upper/lower limit tips accordingly
bool detectPoint() {
if (count > pointValue) {
if (count < upper)upper = count;
}
else if (count < pointValue) {
if (count > lower)lower = count;
}
// If the input number is equal to the lucky point value,
else if (count == pointValue) {
// Reset the input number and return true
count = 0;
return 1;
}
// Reset the input number and return false
count = 0;
return 0;
}
// Show the input number and the upper/lower limit tips
void lcdShowInput(bool result) {
lcd.clear();
// If the input number is equal to the lucky point value
if (result == 1)
{
// Show the success message and initialize a new lucky point value
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);
}
// Function to decode the key value from the IR receiver signal
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";
}
}
Common Course Links
Common Course Files
Hulpbronne en verwysings
-
DokumentasieESP32 Tutorial 36/55 - SunFounder doc page for guessing numberdocs.sunfounder.com
Lêers📁
Geen lêers beskikbaar.