دليل ESP32 36/55 - لعبة تخمين الرقم | مجموعة تعلم إنترنت الأشياء ESP32 من صن فاوندر
في هذا الدرس، سنقوم بإنشاء لعبة ممتعة لتخمين الأرقام باستخدام وحدة التحكم الدقيقة ESP32 مع جهاز تحكم عن بعد بالأشعة تحت الحمراء وشاشة LCD. سيقوم اللاعب بمحاولة تخمين رقم تم توليده عشوائيًا بين 0 و 99، مع تقديم اللعبة تلميحات حول ما إذا كان التخمين مرتفعًا جدًا أو منخفضًا جدًا. من خلال هذا المشروع، ستتعلم كيفية استخدام مستقبل الأشعة تحت الحمراء، وعرض القيم على شاشة LCD، وإدارة إدخال المستخدم من جهاز التحكم عن بعد. يمكنك الرجوع إلى الفيديو لمزيد من التوضيح (في الفيديو عند 00:00).
شرح الأجهزة
المكونات الرئيسية المستخدمة في هذا المشروع تشمل المتحكم الدقيق ESP32، جهاز التحكم عن بُعد بالأشعة تحت الحمراء، جهاز الاستقبال بالأشعة تحت الحمراء، وشاشة LCD. يعمل جهاز ESP32 كوحدة المعالجة الرئيسية وهو قادر على التعامل مع الاتصالات اللاسلكية، مما يجعله خيارًا مرنًا لمشاريع الإنترنت من الأشياء. يسمح جهاز التحكم عن بُعد بالأشعة تحت الحمراء للمستخدمين بإدخال التوقعات دون الحاجة إلى تفاعل جسدي مع اللوحة، بينما تعرض شاشة LCD حالة اللعبة والمطالبات.
detects signals from the remote control and decodes them for use in the game. Each button press on the remote corresponds to a specific value that the ESP32 can interpret. The LCD display provides a visual interface for the user, showing the current guess range and whether the guess was correct.
تفاصيل ورقة البيانات
| الصانع | صن فاوندر |
|---|---|
| رقم الجزء | ESP32 |
| جهد المنطق/المدخلات والمخرجات | ٣.٣ فولت |
| جهد الإمداد | 5 فولت (عبر USB) |
| تيار الإخراج (لكل قناة) | ١٢ مللي أمبير (كحد أقصى) |
| إرشادات تردد PWM | 1 كيلوهرتز |
| عتبات منطق الإدخال | 0.3 * Vcc إلى 0.7 * Vcc |
| انخفاض الجهد / Rدي إس (أون)/ تشبع | 0.2 فولت |
| الحدود الحرارية | درجة حرارة التشغيل: -40 إلى 85 °م |
| حزمة | وحدة WROOM-32 |
| ملاحظات / متغيرات | يدعم واي فاي وبلوتوث |
- تأكد من أن جميع المكونات مصنفة للعمل بجهد 3.3 فولت و 5 فولت حيثما كان ذلك مناسبًا.
- استخدم المقاومات السحب المناسبة لوحدة الاستقبال الأشعة تحت الحمراء لتجنب المدخلات العائمة.
- يُنصح باستخدام مبرد حراري إذا كنت تعمل عند أقصى تيار مخرج لفترات طويلة.
- عند استخدام PWM، حافظ على تردد حوالي 1 كيلو هرتز لتحقيق أداء مثالي.
- كن حذرًا عند توصيل الأسلاك؛ تأكد من أن الاتصالات آمنة لتفادي الأعطال المتقطعة.
تعليمات الأسلاك

لإعداد الأسلاك للعبة تخمين الرقم، ابدأ بتوصيل جهاز الاستقبال بالأشعة تحت الحمراء. قم بتوصيل السلك الأحمر من الدبوس الأيمن لجهاز الاستقبال بمصدر الطاقة 3.3 فولت على ESP32. يجب أن يذهب السلك الأسود إلى الأرض، بينما يتصل الدبوس الأيسر لجهاز الاستقبال بالأشعة تحت الحمراء بالدبوس14على الـ ESP32.
التالي، قم بتوصيل شاشة LCD. قم بتوصيل طرف VCC الخاص بشاشة LCD بمصدر 5 فولت على 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 وجهاز استقبال الأشعة تحت الحمراء. يتم تعريف الدبوس لجهاز استقبال الأشعة تحت الحمراء كـ14، ونقوم بإنشاء نسخ من الكائنات اللازمة لإدارة المدخلات والمخرجات.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}يظهر هذا الجزء وظيفة الإعداد حيث نقوم بتهيئة الشاشة LCD، وبدء الاتصال التسلسلي، وتمكين مستقبل الأشعة تحت الحمراء. الوظيفة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.
الكود الكامل محمّل أدناه المقالة لاستعانتك.
عرض / ما يمكن توقعه
بمجرد توصيل كل شيء وتحميل الكود، ستطلب منك اللعبة الضغط على أي رقم في جهاز التحكم عن بعد. ستوفر اللعبة بعد ذلك تعليقات على تخميناتك، محدثة نطاق الأرقام الممكنة حتى تخمن الرقم المستهدف بشكل صحيح. إذا ضغطت على زر الطاقة، ستقوم اللعبة بإعادة تعيين نفسها وتبدأ من جديد (في الفيديو عند 02:30).
تشمل الفخاخ الشائعة التأكد من توجيه جهاز الاستقبال بالأشعة تحت الحمراء بشكل صحيح وأن جميع الاتصالات آمنة. إذا لم يستجب اللعبة، تحقق من مصدر الطاقة وتأكد من اختيار اللوحة والمنفذ الصحيحين في بيئة تطوير Arduino.
طوابع زمنية للفيديو
- :00 بداية
- :17 مقدمة لمشروع اللعبة
- ٤:٣٧ التوصيلات
- كود أردوينو 6:15 موضح
- 12:32 اختيار لوحة ESP32 و منفذ COM في Arduino IDE
- :16 16:16 لعب لعبة تخمين الرقم
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// حدد دبوس مستقبل الأشعة تحت الحمراء
const uint16_t IR_RECEIVE_PIN = 14;
// إنشاء كائن IRrecv
IRrecv irrecv(IR_RECEIVE_PIN);
// إنشاء كائن decode_results
decode_results results;
const long interval = 1000;
unsigned long previousMillis = 0;
// قم بتهيئة كائن LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// تهيئة قيمة رقم المدخل
int count = 0;
// قم بتهيئة النقطة العشوائية المحظوظة
int pointValue = 0;
// قم بتهيئة نصائح الحدود العلوية والسفلية
int upper = 99;
int lower = 0;
void setup() {
// قم بتهيئة شاشة LCD
lcd.init();
lcd.backlight();
// ابدأ الاتصال التسلسلي
Serial.begin(9600);
// تمكين جهاز استقبال الأشعة تحت الحمراء
irrecv.enableIRIn();
// قم بتهيئة قيمة نقطة حظ جديدة
initNewValue();
}
void loop() {
// إذا تم استلام إشارة من مستقبل الأشعة تحت الحمراء
if (irrecv.decode(&results)) {
bool result = 0;
String num = decodeKeyValue(results.value);
// إذا تم الضغط على زر الطاقة
if (num == "POWER") {
initNewValue(); // قم بتهيئة قيمة نقطة حظ جديدة
}
// إذا تم الضغط على زر الدائرة
else if (num == "CYCLE") {
result = detectPoint(); // كشف الرقم المدخل
lcdShowInput(result); // عرض النتيجة على شاشة LCD
}
// إذا تم الضغط على زر رقم (0-9)،
// أضف الرقم إلى الرقم المدخل
// وكشف الرقم إذا كان أكبر من أو يساوي 10
else if (num >= "0" && num <= "9") {
count = count * 10;
count += num.toInt();
if (count >= 10) {
result = detectPoint();
}
lcdShowInput(result);
}
irrecv.resume();
}
}
// دالة لتهيئة قيمة نقطة حظ جديدة
void initNewValue() {
// قم بتعيين البذور العشوائية استنادًا إلى القيمة التناظرية من الدبوس A0
randomSeed(analogRead(A0));
// قم بإنشاء قيمة نقطة محظوظة عشوائية جديدة
pointValue = random(99);
// أعد تعيين نصائح الحدود العليا والسفلى
upper = 99;
lower = 0;
// عرض رسالة الترحيب على شاشة LCD
lcd.clear();
lcd.print(" Welcome!");
lcd.setCursor(0, 1);
lcd.print("Press Any Number");
// إعادة تعيين قيمة الرقم المدخل
count = 0;
// اطبع قيمة نقطة الحظ على الشاشة التسلسلية
Serial.print("point is ");
Serial.println(pointValue);
}
// كشف الرقم المدخل
// وقم بتحديث نصائح الحدود العليا والدنيا وفقًا لذلك.
bool detectPoint() {
if (count > pointValue) {
if (count < upper)upper = count;
}
else if (count < pointValue) {
if (count > lower)lower = count;
}
// إذا كانت قيمة العدد المدخل مساوية لقيمة النقطة المحظوظة،
else if (count == pointValue) {
// قم بإعادة تعيين رقم الإدخال وأعد القيمةtrue
count = 0;
return 1;
}
// إعادة تعيين الرقم المدخل وإرجاع خطأ
count = 0;
return 0;
}
// عرض رقم الإدخال ونصائح الحدود العليا/السفلى
void lcdShowInput(bool result) {
lcd.clear();
// إذا كانت القيمة المدخلة تساوي قيمة نقطة الحظ
if (result == 1)
{
// عرض رسالة النجاح وتهيئة قيمة نقطة الحظ الجديدة
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);
}
// دالة لفك شفرة قيمة المفتاح من إشارة جهاز استقبال الأشعة تحت الحمراء
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 36/55 - صفحة وثائق SunFounder لتخمين الرقمdocs.sunfounder.com
ملفات📁
لا توجد ملفات متاحة.