Hướng dẫn ESP32 36/55 - Trò chơi đoán số | Bộ học IoT ESP32 của SunFounder
Trong hướng dẫn này, chúng ta sẽ tạo một trò chơi đoán số thú vị sử dụng vi điều khiển ESP32 cùng với điều khiển hồng ngoại và màn hình LCD. Người chơi sẽ cố gắng đoán một số được tạo ngẫu nhiên từ 0 đến 99, với trò chơi cung cấp gợi ý về việc đoán quá cao hay quá thấp. Thông qua dự án này, bạn sẽ học cách sử dụng bộ thu hồng ngoại, hiển thị giá trị trên màn hình LCD và quản lý đầu vào từ điều khiển từ xa. Bạn có thể tham khảo video để rõ hơn (trong video tại 00:00).
Giải thích phần cứng
Các thành phần chính được sử dụng trong dự án này bao gồm vi điều khiển ESP32, điều khiển hồng ngoại, bộ thu hồng ngoại và màn hình LCD. ESP32 đóng vai trò là bộ xử lý chính và có khả năng xử lý giao tiếp không dây, khiến nó trở thành lựa chọn linh hoạt cho các dự án IoT. Điều khiển hồng ngoại cho phép người dùng nhập dự đoán mà không cần tương tác vật lý với bo mạch, trong khi màn hình LCD hiển thị trạng thái trò chơi và lời nhắc.
Bộ thu hồng ngoại phát hiện tín hiệu từ điều khiển từ xa và giải mã chúng để sử dụng trong trò chơi. Mỗi lần nhấn nút trên điều khiển tương ứng với một giá trị cụ thể mà ESP32 có thể diễn giải. Màn hình LCD cung cấp giao diện trực quan cho người dùng, hiển thị phạm vi đoán hiện tại và liệu dự đoán có đúng hay không.
Chi tiết bảng dữ liệu
| Nhà sản xuất | SunFounder |
|---|---|
| Số bộ phận | ESP32 |
| Điện áp logic/IO | 3,3 V |
| Điện áp cung cấp | 5 V (qua USB) |
| Dòng điện đầu ra (mỗi kênh) | 12 mA (tối đa) |
| Hướng dẫn tần số PWM | 1 kHz |
| Ngưỡng logic đầu vào | 0,3 * Vcc đến 0,7 * Vcc |
| Sụt áp / RDS(on) / bão hòa | 0,2 V |
| Giới hạn nhiệt | Nhiệt độ hoạt động: -40 đến 85 °C |
| Đóng gói | Mô-đun WROOM-32 |
| Ghi chú / biến thể | Hỗ trợ Wi-Fi và Bluetooth |
- Đảm bảo tất cả các thành phần được định mức cho 3,3 V và 5 V khi áp dụng.
- Sử dụng điện trở kéo lên phù hợp cho bộ thu hồng ngoại để tránh đầu vào trôi nổi.
- Cân nhắc sử dụng tản nhiệt nếu chạy ở dòng điện đầu ra tối đa trong thời gian dài.
- Khi sử dụng PWM, duy trì tần số khoảng 1 kHz để có hiệu suất tối ưu.
- Thận trọng với việc nối dây; đảm bảo các kết nối chắc chắn để tránh lỗi gián đoạn.
Hướng dẫn nối dây

Để thiết lập nối dây cho trò chơi đoán số, bắt đầu bằng cách kết nối bộ thu hồng ngoại. Kết nối dây màu đỏ từ chân bên phải của bộ thu với nguồn điện 3,3 V trên ESP32. Dây màu đen nên đi đến chân nối đất, trong khi chân bên trái của bộ thu hồng ngoại kết nối với chân 14 trên ESP32.
Tiếp theo, nối dây màn hình LCD. Kết nối chân VCC của LCD với nguồn 5 V trên ESP32 và chân nối đất với đất. Các chân SDA và SCL của LCD nên được kết nối với chân 21 và 22 tương ứng. Đảm bảo có hai khoảng trống giữa các kết nối SDA và SCL để tránh xung đột chân. Cuối cùng, đảm bảo tháo mọi lớp nhựa bảo vệ khỏi pin trước khi cấp nguồn cho bo mạch.
Ví dụ mã & hướng dẫn chi tiết
Các đoạn mã sau minh họa các phần thiết yếu của chương trình được sử dụng cho trò chơi đoán số. Chúng ta bắt đầu bằng việc bao gồm các thư viện cần thiết và xác định các định danh chính.
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
Trong đoạn trích này, chúng ta bao gồm các thư viện để xử lý chức năng LCD và bộ thu hồng ngoại. Chân cho bộ thu hồng ngoại được xác định là 14 và chúng ta tạo các phiên bản của các đối tượng cần thiết để quản lý đầu vào và đầu ra.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}
Đoạn mã này hiển thị hàm thiết lập nơi chúng ta khởi tạo LCD, bắt đầu giao tiếp nối tiếp và kích hoạt bộ thu hồng ngoại. Hàm initNewValue() được gọi để tạo một số ngẫu nhiên mới cho người chơi đoán.
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;
}
Hàm này kiểm tra dự đoán của người chơi so với số được tạo ngẫu nhiên, điều chỉnh giới hạn trên và dưới tương ứng. Nếu dự đoán đúng, nó đặt lại bộ đếm và trả về true.
Mã đầy đủ được tải xuống bên dưới bài viết để bạn tham khảo.
Trình diễn / Điều gì sẽ xảy ra
Khi mọi thứ đã được kết nối và mã được tải lên, trò chơi sẽ nhắc bạn nhấn bất kỳ số nào trên điều khiển từ xa. Trò chơi sau đó sẽ đưa ra phản hồi về các dự đoán của bạn, cập nhật phạm vi các số có thể cho đến khi bạn đoán đúng số mục tiêu. Nếu bạn nhấn nút POWER, trò chơi sẽ đặt lại và bắt đầu lại (trong video ở phút 02:30).
Các lỗi thường gặp bao gồm đảm bảo rằng bộ thu hồng ngoại được định hướng đúng và tất cả các kết nối đều chắc chắn. Nếu trò chơi không phản hồi, hãy kiểm tra nguồn điện và xác minh rằng bo mạch và cổng chính xác đã được chọn trong Arduino IDE.
Mốc thời gian video
- 00:00 Bắt đầu
- 2:17 Giới thiệu về dự án trò chơi
- 4:37 Kết nối dây
- 6:15 Giải thích mã Arduino
- 12:32 Chọn bo mạch ESP32 và cổng COM trong Arduino IDE
- 16:16 Chơi trò chơi đoán số
#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
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 36/55- SunFounder doc page for guessing numberdocs.sunfounder.com
Tập tin📁
Không có tệp nào khả dụng.