ESP32 টিউটোরিয়াল ৩৬/৫৫ - সংখ্যা অনুমান করার খেলা | সানফাউন্ডারের ESP32 আইওটি লার্নিং কিট
এই টিউটোরিয়ালে, আমরা ESP32 মাইক্রোকন্ট্রোলার, একটি ইনফ্রারেড রিমোট এবং একটি LCD ডিসপ্লে ব্যবহার করে একটি মজার সংখ্যা অনুমান করার গেম তৈরি করব। খেলোয়াড় 0 থেকে 99 এর মধ্যে এলোমেলোভাবে তৈরি একটি সংখ্যা অনুমান করার চেষ্টা করবে, এবং গেমটি অনুমানটি খুব বেশি বা খুব কম কিনা সে সম্পর্কে ইঙ্গিত দেবে। এই প্রকল্পের মাধ্যমে, আপনি ইনফ্রারেড রিসিভার ব্যবহার, LCD-তে মান প্রদর্শন এবং রিমোট কন্ট্রোল থেকে ব্যবহারকারীর ইনপুট পরিচালনা করতে শিখবেন। অতিরিক্ত স্পষ্টতার জন্য আপনি ভিডিওটি দেখতে পারেন (ভিডিওতে 00:00 এ)।
হার্ডওয়্যার ব্যাখ্যা
এই প্রকল্পে ব্যবহৃত প্রধান উপাদানগুলির মধ্যে রয়েছে ESP32 মাইক্রোকন্ট্রোলার, একটি ইনফ্রারেড রিমোট কন্ট্রোল, একটি ইনফ্রারেড রিসিভার এবং একটি LCD ডিসপ্লে। ESP32 প্রধান প্রসেসিং ইউনিট হিসাবে কাজ করে এবং ওয়্যারলেস যোগাযোগ পরিচালনা করতে সক্ষম, যা এটিকে IoT প্রকল্পগুলির জন্য একটি বহুমুখী পছন্দ করে তোলে। ইনফ্রারেড রিমোট ব্যবহারকারীদের বোর্ডের সাথে শারীরিক মিথস্ক্রিয়া ছাড়াই অনুমান ইনপুট করতে দেয়, যখন LCD গেমের অবস্থা এবং প্রম্পট প্রদর্শন করে।
ইনফ্রারেড রিসিভার রিমোট কন্ট্রোল থেকে সংকেত সনাক্ত করে এবং গেমে ব্যবহারের জন্য সেগুলি ডিকোড করে। রিমোটের প্রতিটি বোতাম চাপা একটি নির্দিষ্ট মানের সাথে মিলে যায় যা ESP32 ব্যাখ্যা করতে পারে। LCD ডিসপ্লে ব্যবহারকারীর জন্য একটি ভিজ্যুয়াল ইন্টারফেস সরবরাহ করে, বর্তমান অনুমানের পরিসীমা এবং অনুমানটি সঠিক ছিল কিনা তা দেখায়।
ডেটাশিট বিবরণ
| নির্মাতা | SunFounder |
|---|---|
| পার্ট নম্বর | 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 মডিউল |
| নোট / ভেরিয়েন্ট | Wi-Fi এবং ব্লুটুথ সমর্থন করে |
- নিশ্চিত করুন যে সমস্ত উপাদান প্রযোজ্য ক্ষেত্রে 3.3 V এবং 5 V এর জন্য রেট করা হয়েছে।
- ফ্লোটিং ইনপুট এড়াতে IR রিসিভারের জন্য সঠিক পুল-আপ রোধ ব্যবহার করুন।
- দীর্ঘ সময়ের জন্য সর্বোচ্চ আউটপুট কারেন্টে চলার সময় হিট সিঙ্ক ব্যবহার করার কথা বিবেচনা করুন।
- PWM ব্যবহার করার সময়, সর্বোত্তম কর্মক্ষমতার জন্য প্রায় 1 kHz ফ্রিকোয়েন্সি বজায় রাখুন।
- ওয়্যারিং সম্পর্কে সতর্ক থাকুন; বিরতিহীন ব্যর্থতা এড়াতে সংযোগগুলি নিরাপদ কিনা তা নিশ্চিত করুন।
ওয়্যারিং নির্দেশাবলী

সংখ্যা অনুমান করার গেমের জন্য ওয়্যারিং সেট আপ করতে, ইনফ্রারেড রিসিভার সংযোগ করে শুরু করুন। রিসিভারের ডান পিন থেকে লাল তারটি ESP32-এর 3.3 V পাওয়ার সাপ্লাইতে সংযুক্ত করুন। কালো তারটি গ্রাউন্ডে যাওয়া উচিত, যখন ইনফ্রারেড রিসিভারের বাম পিনটি ESP32-এর পিন 14-এর সাথে সংযুক্ত হয়।
এরপর, 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;
}
এই ফাংশনটি এলোমেলোভাবে তৈরি সংখ্যার বিরুদ্ধে খেলোয়াড়ের অনুমান পরীক্ষা করে, উপরের এবং নীচের সীমাগুলি সেই অনুযায়ী সামঞ্জস্য করে। যদি অনুমানটি সঠিক হয়, এটি গণনা রিসেট করে এবং সত্য ফেরত দেয়।
সম্পূর্ণ কোডটি আপনার রেফারেন্সের জন্য নিবন্ধের নীচে লোড করা হয়েছে।
প্রদর্শন / কী আশা করবেন
সবকিছু সংযুক্ত হয়ে গেলে এবং কোড আপলোড করা হলে, গেমটি আপনাকে রিমোট কন্ট্রোলে যেকোনো সংখ্যা চাপতে অনুরোধ করবে। এরপর গেমটি আপনার অনুমানের উপর প্রতিক্রিয়া জানাবে, সম্ভাব্য সংখ্যার পরিসর আপডেট করবে যতক্ষণ না আপনি সঠিকভাবে লক্ষ্য সংখ্যাটি অনুমান করতে পারেন। আপনি যদি POWER বাটন চাপেন, গেমটি রিসেট হয়ে আবার শুরু হয় (ভিডিওতে 02:30 এ)।
সাধারণ ভুলগুলির মধ্যে রয়েছে ইনফ্রারেড রিসিভার সঠিকভাবে অবস্থান করা এবং সমস্ত সংযোগ নিরাপদ কিনা তা নিশ্চিত করা। গেমটি সাড়া না দিলে, পাওয়ার সাপ্লাই পরীক্ষা করুন এবং Arduino IDE-তে সঠিক বোর্ড এবং পোর্ট নির্বাচিত হয়েছে কিনা যাচাই করুন।
ভিডিও টাইমস্ট্যাম্প
- 00:00 শুরু
- 2:17 গেম প্রকল্পের পরিচিতি
- 4:37 ওয়্যারিং
- 6:15 Arduino কোড ব্যাখ্যা
- 12:32 Arduino IDE-তে ESP32 বোর্ড এবং COM পোর্ট নির্বাচন
- 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
ফাইলসমূহ📁
কোনো ফাইল উপলব্ধ নেই।