شِفر (کود) جستجو

آموزش ESP32 36/55 - بازی حدس زدن عدد | کیت یادگیری IoT ESP32 سان فاوندر

آموزش ESP32 36/55 - بازی حدس زدن عدد | کیت یادگیری IoT ESP32 سان فاوندر

در این آموزش، ما یک بازی سرگرم‌کننده حدس عدد را با استفاده از میکروکنترلر ESP32 همراه با یک کنترل از راه دور مادون قرمز و یک نمایشگر LCD ایجاد خواهیم کرد. بازیکن سعی خواهد کرد یک عدد تصادفی بین ۰ تا ۹۹ را حدس بزند، در حالی که بازی نکاتی درباره اینکه آیا حدس بیش از حد بالا یا پایین است، ارائه می‌دهد. از طریق این پروژه، شما خواهید آموخت که چگونه از گیرنده مادون قرمز استفاده کنید، مقادیر را روی LCD نمایش دهید و ورودی کاربر را از یک کنترل از راه دور مدیریت کنید. می‌توانید برای وضوح بیشتر به ویدیو مراجعه کنید (در ویدیو در ۰۰:۰۰).

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

توضیح سخت‌افزار

اجزاء اصلی استفاده شده در این پروژه شامل میکروکنترلر ESP32، یک کنترل از راه دور مادون قرمز، یک گیرنده مادون قرمز و یک نمایشگر LCD است. ESP32 به عنوان واحد پردازش اصلی عمل کرده و قادر به انجام ارتباط بی‌سیم است که آن را به گزینه‌ای چندمنظوره برای پروژه‌های IoT تبدیل می‌کند. کنترل از راه دور مادون قرمز به کاربران اجازه می‌دهد حدس‌های خود را بدون نیاز به تعامل فیزیکی با برد وارد کنند، در حالی که LCD وضعیت بازی و پیام‌ها را نمایش می‌دهد.

گیرنده‌ی مادون قرمز سیگنال‌هایی را از کنترل از راه دور شناسایی کرده و آن‌ها را برای استفاده در بازی رمزگشایی می‌کند. هر بار فشار دادن دکمه بر روی کنترل از راه دور به یک مقدار خاص مرتبط است که ESP32 می‌تواند آن را تفسیر کند. نمایشگر LCD یک رابط بصری برای کاربر فراهم می‌کند که دامنه‌ی حدس فعلی و درستی حدس را نشان می‌دهد.

جزئیات برگه داده

سازنده سان فاندرد
شماره قطعه ESP32
ولتاژ منطقی/ورودی-خروجی ۳.۳ ولت
ولتاژ تغذیه ۵ ولت (از طریق USB)
جریان خروجی (برای هر کانال) ۱۲ میلی‌آمپر (حداکثر)
راهنمایی فرکانس PWM 1 کیلوهرتز
آستانه‌های منطقی ورودی ۰.۳ * Vcc تا ۰.۷ * Vcc
افت ولتاژ / RDS(on)/ اشباع ۰.۲ ولت
محدودیت‌های حرارتی دمای عملیاتی: -۴۰ تا ۸۵ درجه سانتی‌گراد
بسته ماجیول WROOM-32
یادداشت‌ها / واریانت‌ها از Wi-Fi و بلوتوث پشتیبانی می‌کند

  • اطمینان حاصل کنید که تمام اجزا برای ۳.۳ ولت و ۵ ولت در صورت لزوم برآورد شده‌اند.
  • از مقاومت‌های کششی مناسب برای گیرنده IR استفاده کنید تا از سیگنال‌های ورودی شناور جلوگیری شود.
  • در نظر داشته باشید که در صورت کار کردن با حداکثر جریان خروجی برای مدت طولانی، از یک هیت سینک استفاده کنید.
  • هنگام استفاده از PWM، فرکانسی در حدود ۱ کیلوهرتز را برای عملکرد بهینه حفظ کنید.
  • با سیم‌کشی احتیاط کنید؛ اطمینان حاصل کنید که اتصالات محکم هستند تا از بروز خرابی‌های متناوب جلوگیری شود.

دستورالعمل های سیم کشی

ESP32_36_guessing_number_wiring

برای راه‌اندازی سیم‌کشی بازی حدس عدد، با اتصال گیرنده مادون قرمز شروع کنید. سیم قرمز را از پایه راست گیرنده به منبع تغذیه ۳.۳ ولت بر روی ESP32 وصل کنید. سیم سیاه باید به زمین متصل شود، در حالی که پایه چپ گیرنده مادون قرمز به پایه متصل می‌شود.14بر روی ESP32.

ESP32_36_نقشه_حدس_عدد

بعد، نمایشگر LCD را سیم‌کشی کنید. پایه VCC LCD را به منبع ۵ ولت بر روی 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();
}

این قطعه شِفر (کود) تابع راه‌اندازی را نشان می‌دهد که در آن ما 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 را فشار دهید، بازی ریست می‌شود و دوباره آغاز می‌شود (در ویدیو در ۰۲:۳۰).

اشتباهات رایج شامل اطمینان از این است که گیرنده مادون قرمز به درستی تنظیم شده و تمام اتصالات ایمن هستند. اگر بازی پاسخ نداد، منبع تغذیه را بررسی کنید و اطمینان حاصل کنید که برد و پورت صحیح در محیط Arduino IDE انتخاب شده‌اند.

زمان‌بندی ویدیو

  • ۰۰:۰۰ شروع
  • معرفی پروژه بازی ۲:۱۷
  • ۴:۳۷ سیم‌کشی
  • شِفر (کود) آردوینو توضیح داده شده ۶:۱۵
  • انتخاب برد ESP32 و پورت COM در محیط Arduino IDE در :32
  • شانزده: شانزده بازی حدس عدد را بازی می‌کنم

تصاویر

ESP32_36_guessing_number_schematic
ESP32_36_guessing_number_schematic
ESP32_36_guessing_number_wiring
ESP32_36_guessing_number_wiring
ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2
ESP32_36_guessing_numbe-2
837-ESP32 Tutorial 36/55- Arduino code for guessing number
زبان: C++
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>

 // پایه دریافت‌کننده IR را تعریف کنید
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);

 // دریافت‌کننده IR را فعال کنید
  irrecv.enableIRIn();

 // مقدار جدیدی از نقطه شانس را راه‌اندازی کنید
  initNewValue();
}

void loop() {
 // اگر سیگنالی از گیرنده IR دریافت شود
  if (irrecv.decode(&results)) {
    bool result = 0;
    String num = decodeKeyValue(results.value);

 // اگر دکمه POWER فشار داده شود
    if (num == "POWER") {
      initNewValue(); // مقدار جدیدی از نقطه شانس را راه‌اندازی کنید
    }

 // اگر دکمه CYCLE زده شود
    else if (num == "CYCLE") {
      result = detectPoint(); // شماره ورودی را شناسایی کنید
      lcdShowInput(result); // نتیجه را روی صفحه‌نمایش LCD نشان دهید
    }

 // اگر یک دکمه عددی (۰-۹) فشرده شود،
 // عدد را به شماره ورودی اضافه کنید
 // و شماره را تشخیص دهید اگر بزرگتر یا برابر با 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) {

 // عدد ورودی را بازنشانی کرده و درست را برگردانید
    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);
}

 // توابعی برای رمزگشایی ارزش کلید از سیگنال گیرنده IR
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";
    }
}

فایل‌ها📁

هیچ فایلی موجود نیست.