کوڈ تلاش کریں

ESP32 سبق 36/55 - نمبر اندازہ لگانے کا کھیل | سن فاؤنڈر کا ESP32 IoT سیکھنے کا کٹ

ESP32 سبق 36/55 - نمبر اندازہ لگانے کا کھیل | سن فاؤنڈر کا ESP32 IoT سیکھنے کا کٹ

اس ٹیوٹوریل میں، ہم ESP32 مائیکروکنٹرولر کے ساتھ ایک انفراریڈ ریموٹ اور LCD ڈسپلے استعمال کرتے ہوئے ایک دلچسپ اندازہ لگانے والا نمبر گیم بنائیں گے۔ کھلاڑی 0 اور 99 کے درمیان تصادفی طور پر پیدا ہونے والے نمبر کا اندازہ لگانے کی کوشش کرے گا، اور گیم اس بارے میں اشارے فراہم کرے گی کہ اندازہ بہت زیادہ ہے یا بہت کم۔ اس پروجیکٹ کے ذریعے، آپ سیکھیں گے کہ انفراریڈ ریسیور کیسے استعمال کریں، LCD پر ویلیوز ڈسپلے کریں، اور ریموٹ کنٹرول سے صارف کے ان پٹ کو کیسے منظم کریں۔ اضافی وضاحت کے لیے آپ ویڈیو کا حوالہ دے سکتے ہیں (ویڈیو میں 00:00 پر)۔

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

ہارڈویئر کی وضاحت

اس پروجیکٹ میں استعمال ہونے والے بنیادی اجزاء میں ESP32 مائیکروکنٹرولر، ایک انفراریڈ ریموٹ کنٹرول، ایک انفراریڈ ریسیور، اور LCD ڈسپلے شامل ہیں۔ ESP32 مرکزی پروسیسنگ یونٹ کے طور پر کام کرتا ہے اور وائرلیس کمیونیکیشن کو سنبھالنے کی صلاحیت رکھتا ہے، جو اسے IoT پروجیکٹس کے لیے ایک ورسٹائل انتخاب بناتا ہے۔ انفراریڈ ریموٹ صارفین کو بورڈ کے ساتھ جسمانی تعامل کے بغیر اندازے درج کرنے کی اجازت دیتا ہے، جبکہ LCD گیم کی حالت اور پرامپٹس ڈسپلے کرتا ہے۔

انفراریڈ ریسیور ریموٹ کنٹرول سے سگنلز کا پتہ لگاتا ہے اور انہیں گیم میں استعمال کے لیے ڈی کوڈ کرتا ہے۔ ریموٹ پر ہر بٹن پریس ایک مخصوص ویلیو سے مطابقت رکھتا ہے جسے ESP32 تشریح کر سکتا ہے۔ LCD ڈسپلے صارف کے لیے ایک بصری انٹرفیس فراہم کرتا ہے، جو موجودہ اندازے کی حد اور یہ دکھاتا ہے کہ اندازہ درست تھا یا نہیں۔

ڈیٹاشیٹ کی تفصیلات

مینوفیکچرر سن فاؤنڈر
پارٹ نمبر ESP32
لاجک/آئی او وولٹیج 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 ماجیول
نوٹس / ویریئنٹس وائی-فائی اور بلوٹوتھ کو سپورٹ کرتا ہے

 

  • یقینی بنائیں کہ تمام اجزاء 3.3 V اور 5 V کے لیے موزوں ہیں جہاں قابل اطلاق ہو۔
  • فلوٹنگ ان پٹ سے بچنے کے لیے IR ریسیور کے لیے مناسب پل-اپ ریزسٹرز استعمال کریں۔
  • اگر زیادہ سے زیادہ آؤٹ پٹ کرنٹ پر طویل عرصے تک چل رہے ہیں تو ہیٹ سنک استعمال کرنے پر غور کریں۔
  • PWM استعمال کرتے وقت، بہترین کارکردگی کے لیے تقریباً 1 kHz کی فریکوئنسی برقرار رکھیں۔
  • وائرنگ میں محتاط رہیں؛ وقفے وقفے سے ناکامیوں سے بچنے کے لیے کنکشنز کو محفوظ یقینی بنائیں۔

وائرنگ ہدایات

ESP32_36_guessing_number_wiring

اندازہ لگانے والے نمبر گیم کے لیے وائرنگ ترتیب دینے کے لیے، انفراریڈ ریسیور کو جوڑ کر شروع کریں۔ ریسیور کے دائیں پن سے سرخ تار کو ESP32 پر 3.3 V پاور سپلائی سے جوڑیں۔ کالی تار گراؤنڈ پر جانی چاہیے، جبکہ انفراریڈ ریسیور کا بایاں پن ESP32 پر پن 14 سے جڑتا ہے۔

ESP32_36_guessing_number_schematic

اگلا، LCD ڈسپلے کو وائر کریں۔ LCD کے VCC پن کو ESP32 پر 5 V سپلائی سے اور گراؤنڈ پن کو گراؤنڈ سے جوڑیں۔ LCD کے SDA اور SCL پنوں کو بالترتیب پنوں 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;
}

یہ فنکشن کھلاڑی کے اندازے کو تصادفی طور پر پیدا ہونے والے نمبر کے خلاف چیک کرتا ہے، اوپری اور نچلی حدود کو اس کے مطابق ایڈجسٹ کرتا ہے۔ اگر اندازہ درست ہے، تو یہ شمار کو دوبارہ ترتیب دیتا ہے اور درست لوٹاتا ہے۔

مکمل کوڈ آپ کے حوالے کے لیے مضمون کے نیچے لوڈ کیا گیا ہے۔

ڈیمونسٹریشن / کیا توقع کریں

ایک بار جب سب کچھ وائرڈ ہو جائے اور کوڈ اپ لوڈ ہو جائے، تو گیم آپ کو ریموٹ کنٹرول پر کوئی بھی نمبر دبانے کا کہے گی۔ اس کے بعد گیم آپ کے اندازوں پر رائے دے گی، ممکنہ نمبروں کی حد کو اپ ڈیٹ کرتی رہے گی جب تک کہ آپ ہدف والے نمبر کا درست اندازہ نہ لگا لیں۔ اگر آپ پاور بٹن دبائیں گے، تو گیم ری سیٹ ہو کر دوبارہ شروع ہو جائے گی (ویڈیو میں 02:30 پر)۔

عام غلطیوں میں یہ شامل ہے کہ انفراریڈ ریسیور صحیح سمت میں ہو اور تمام کنکشن محفوظ ہوں۔ اگر گیم جواب نہ دے، تو بجلی کی فراہمی چیک کریں اور تصدیق کریں کہ Arduino IDE میں صحیح بورڈ اور پورٹ منتخب ہیں۔

ویڈیو ٹائم اسٹیمپس

  • 00:00 آغاز
  • 2:17 گیم پروجیکٹ کا تعارف
  • 4:37 وائرنگ
  • 6:15 Arduino کوڈ کی وضاحت
  • 12:32 Arduino IDE میں ESP32 بورڈ اور COM پورٹ کا انتخاب
  • 16:16 نمبر اندازہ لگانے والی گیم کھیلنا

تصاویر

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>

// 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";
    }
}

وسائل اور حوالہ جات

فائلیں📁

کوئی فائلیں دستیاب نہیں ہیں۔