ESP32 Упатство 36/55 - Игра со погодување број | SunFounder's ESP32 IoT Learning комплет
Во ова упатство, ќе создадеме забавна игра за погодување број користејќи го ESP32 микроконтролерот заедно со инфрацрвен далечински управувач и LCD дисплеј. Играчот ќе се обиде да погоди случајно генериран број помеѓу 0 и 99, при што играта ќе дава совети дали погодокот е превисок или пренизок. Преку овој проект, ќе научите како да го користите инфрацрвениот приемник, да прикажувате вредности на LCD, и да управувате со внес од далечински управувач. Можете да ја погледнете видеото за дополнителна јасност (во видеото на 00:00).
Објаснување на хардверот
Примарните компоненти користени во овој проект вклучуваат ESP32 микроконтролер, инфрацрвен далечински управувач, инфрацрвен приемник и LCD дисплеј. ESP32 служи како главна процесорска единица и е способен да управува со безжична комуникација, што го прави разновиден избор за IoT проекти. Инфрацрвениот далечински управувач им овозможува на корисниците да внесуваат погодоци без потреба од физичка интеракција со плочката, додека LCD дисплејот го прикажува статусот на играта и пораките.
Инфрацрвениот приемник детектира сигнали од далечинскиот управувач и ги декодира за употреба во играта. Секое притискање на копче на далечинскиот управувач одговара на специфична вредност што ESP32 може да ја интерпретира. LCD дисплејот обезбедува визуелен интерфејс за корисникот, прикажувајќи го моменталниот опсег на погодување и дали погодокот бил точен.
Детали од техничката документација
| Производител | SunFounder |
|---|---|
| Број на дел | ESP32 |
| Логички/IO напон | 3.3 V |
| Напон на напојување | 5 V (преку USB) |
| Излезна струја (по канал) | 12 mA (макс.) |
| Насоки за PWM фреквенција | 1 kHz |
| Прагови на влезна логика | 0.3 * Vcc до 0.7 * Vcc |
| Пад на напон / RDS(on) / заситување | 0.2 V |
| Термички ограничувања | Работна температура: -40 до 85 °C |
| Пакет | WROOM-32 модул |
| Белешки / варијанти | Поддржува Wi-Fi и Bluetooth |
- Осигурете се дека сите компоненти се оценети за 3.3 V и 5 V каде што е применливо.
- Користете соодветни pull-up отпорници за IR приемникот за да избегнете лебдечки влезови.
- Размислете за користење на ладилник ако работите со максимална излезна струја подолг период.
- Кога користите PWM, одржувајте фреквенција од околу 1 kHz за оптимални перформанси.
- Бидете внимателни со жиците; осигурете се дека врските се сигурни за да избегнете повремени дефекти.
Инструкции за поврзување

За да го поставите поврзувањето за играта за погодување број, започнете со поврзување на инфрацрвениот приемник. Поврзете ја црвената жица од десниот пин на приемникот со 3.3 V напојување на ESP32. Црната жица треба да оди на земја, додека левиот пин на инфрацрвениот приемник се поврзува со пин 14 на ESP32.
Следно, поврзете го LCD дисплејот. Поврзете го VCC пинот на LCD со 5 V напојување на ESP32 и пинот за земја со земја. SDA и SCL пиновите на LCD треба да се поврзат со пиновите 21 и 22 соодветно. Осигурете се дека има две празни места помеѓу SDA и SCL врските за да избегнете конфликти на пиновите. Конечно, осигурете се да ги отстраните сите пластични капаци од батеријата пред да ја напојувате плочката.
Примери на код и објаснување
Следните фрагменти од код ги илустрираат основните делови на програмата користена за играта за погодување број. Започнуваме со вклучување на потребните библиотеки и дефинирање на клучни идентификатори.
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
Во овој извадок, вклучуваме библиотеки за управување со LCD и IR приемник функционалноста. Пинот за инфрацрвениот приемник е дефиниран како 14, и создаваме инстанци на потребните објекти за управување со влез и излез.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}
Овој фрагмент ја прикажува setup функцијата каде што ги иницијализираме LCD, започнуваме сериска комуникација и го овозможуваме IR приемникот. Функцијата initNewValue() се повикува за да генерира нов случаен број што играчот треба да го погоди.
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;
}
Оваа функција го проверува погодокот на играчот против случајно генерираниот број, прилагодувајќи ги горните и долните граници соодветно. Ако погодокот е точен, ја ресетира вредноста и враќа true.
Целосниот код е вчитан подолу во статијата за ваша референца.
Демонстрација / Што да очекувате
Откако сè е поврзано и кодот е поставен, играта ќе ве поттикне да притиснете било кој број на далечинскиот управувач. Играта потоа ќе дава повратни информации за вашите обиди, ажурирајќи го опсегот на можни броеви додека точно не го погодите целниот број. Ако го притиснете копчето POWER, играта се ресетира и започнува одново (во видеото на 02:30).
Вообичаени грешки вклучуваат осигурување дека инфрацрвениот приемник е правилно ориентиран и дека сите врски се безбедни. Ако играта не реагира, проверете го напојувањето и потврдете дека правилната плоча и порт се избрани во Arduino IDE.
Временски ознаки на видеото
- 00:00 Почеток
- 2:17 Вовед во проектот за играта
- 4:37 Поврзување
- 6:15 Објаснување на Arduino кодот
- 12:32 Избор на ESP32 плоча и COM порт во Arduino IDE
- 16:16 Играње на играта за погодување број
#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
Ресурси и референци
-
ДокументацијаESP32 Tutorial 36/55 - SunFounder doc page for guessing numberdocs.sunfounder.com
Датотеки📁
Нема достапни датотеки.