ESP32 Tutorijal 36/55 - Igra pogađanja brojeva | SunFounder's ESP32 IoT Learning kit
U ovom tutorijalu ćemo napraviti zabavnu igru pogađanja brojeva koristeći ESP32 mikrokontroler zajedno sa infracrvenim daljinskim upravljačem i LCD ekranom. Igrač će pokušati pogoditi nasumično generirani broj između 0 i 99, a igra će pružati savjete o tome je li pogađanje previsoko ili prenisko. Kroz ovaj projekat naučit ćete kako koristiti infracrveni prijemnik, prikazati vrijednosti na LCD ekranu i upravljati korisničkim unosom s daljinskog upravljača. Za dodatnu jasnoću možete pogledati video (u videu na 00:00).
Objašnjenje hardvera
Primarne komponente korištene u ovom projektu uključuju ESP32 mikrokontroler, infracrveni daljinski upravljač, infracrveni prijemnik i LCD ekran. ESP32 služi kao glavna procesna jedinica i sposoban je za upravljanje bežičnom komunikacijom, što ga čini svestranim izborom za IoT projekte. Infracrveni daljinski upravljač omogućava korisnicima unos pogađanja bez fizičke interakcije s pločom, dok LCD ekran prikazuje status igre i upite.
Infracrveni prijemnik detektira signale s daljinskog upravljača i dekodira ih za upotrebu u igri. Svaki pritisak tipke na daljinskom upravljaču odgovara specifičnoj vrijednosti koju ESP32 može interpretirati. LCD ekran pruža vizualno sučelje za korisnika, prikazujući trenutni raspon pogađanja i je li pogađanje bilo tačno.
Detalji iz tehničke dokumentacije
| Proizvođač | SunFounder |
|---|---|
| Broj dijela | ESP32 |
| Logički/IO napon | 3,3 V |
| Napon napajanja | 5 V (putem USB-a) |
| Izlazna struja (po kanalu) | 12 mA (maks.) |
| Smjernice za PWM frekvenciju | 1 kHz |
| Ulazni logički pragovi | 0,3 * Vcc do 0,7 * Vcc |
| Pad napona / RDS(on) / zasićenje | 0,2 V |
| Toplinska ograničenja | Radna temperatura: -40 do 85 °C |
| Paket | WROOM-32 modul |
| Napomene / varijante | Podržava Wi-Fi i Bluetooth |
- Osigurajte da su sve komponente ocijenjene za 3,3 V i 5 V gdje je primjenjivo.
- Koristite odgovarajuće pull-up otpornike za IR prijemnik kako biste izbjegli plutajuće ulaze.
- Razmotrite korištenje hladnjaka ako radite pri maksimalnoj izlaznoj struji duže vrijeme.
- Kada koristite PWM, održavajte frekvenciju oko 1 kHz za optimalne performanse.
- Budite oprezni s ožičenjem; osigurajte da su veze sigurne kako biste izbjegli povremene kvarove.
Upute za ožičenje

Za postavljanje ožičenja za igru pogađanja brojeva, počnite spajanjem infracrvenog prijemnika. Spojite crvenu žicu s desnog pina prijemnika na napajanje od 3,3 V na ESP32. Crna žica treba ići na masu, dok se lijevi pin infracrvenog prijemnika spaja na pin 14 na ESP32.
Zatim spojite LCD ekran. Spojite VCC pin LCD-a na napajanje od 5 V na ESP32, a pin za masu na masu. SDA i SCL pinovi LCD-a trebaju biti spojeni na pinove 21 i 22 respektivno. Osigurajte da postoje dva prazna mjesta između SDA i SCL veza kako biste izbjegli sukobe pinova. Na kraju, obavezno uklonite sve plastične poklopce s baterije prije napajanja ploče.
Primjeri koda i objašnjenje
Sljedeći isječci koda ilustriraju bitne dijelove programa korištenog za igru pogađanja brojeva. Počinjemo uključivanjem potrebnih biblioteka i definiranjem ključnih identifikatora.
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
U ovom isječku uključujemo biblioteke za upravljanje LCD i IR prijemnikom. Pin za infracrveni prijemnik definiran je kao 14, i kreiramo instance potrebnih objekata za upravljanje ulazom i izlazom.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}
Ovaj isječak prikazuje setup funkciju gdje inicijaliziramo LCD, pokrećemo serijsku komunikaciju i omogućavamo IR prijemnik. Funkcija initNewValue() se poziva za generiranje novog nasumičnog broja koji igrač treba pogoditi.
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;
}
Ova funkcija provjerava igračevo pogađanje u odnosu na nasumično generirani broj, prilagođavajući gornje i donje granice u skladu s tim. Ako je pogađanje tačno, resetira brojač i vraća true.
Kompletan kod je učitani ispod članka za vašu referencu.
Demonstracija / Šta očekivati
Jednom kada je sve povezano i kod je uploadan, igra će vas zamoliti da pritisnete bilo koji broj na daljinskom upravljaču. Igra će zatim dati povratnu informaciju o vašim pogađanjima, ažurirajući raspon mogućih brojeva dok tačno ne pogodite ciljani broj. Ako pritisnete POWER dugme, igra se resetuje i počinje ispočetka (u videu na 02:30).
Uobičajene zamke uključuju osiguravanje da je infracrveni prijemnik pravilno orijentisan i da su sve veze sigurne. Ako igra ne reaguje, provjerite napajanje i potvrdite da su ispravna ploča i port odabrani u Arduino IDE-u.
Vremenske oznake videa
- 00:00 Početak
- 2:17 Uvod u projekat igre
- 4:37 Povezivanje
- 6:15 Objašnjen Arduino kod
- 12:32 Odabir ESP32 ploče i COM porta u Arduino IDE-u
- 16:16 Igranje igre pogađanja brojeva
#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
Resources & references
-
DocumentationESP32 Tutorial 36/55- SunFounder doc page for guessing numberdocs.sunfounder.com
Files📁
No files available.