Search Code

د 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 ښودونکی د کاروونکي لپاره یو بصری انٹرفیس چمتو کوي، چې د اټکل اوسنی حد او دا چې آیا اټکل سم و ښکاره کوي.

ډیټاشیټ تفصیلات

جوړونکی SunFounder
د پرزې شمېره ESP32
منطق/IO ولټاژ 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 لپاره مناسب درجه لري چیرې چې applicable وي.
  • د 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;
}

دا فنکشن د لوبغاړي اټکل د تصادفي تولید شوې شمیرې په مقابل کې ګوري، او پورتنۍ او ښکته حدونه په مطابق تنظیموي. که اټکل سم وي، دا شمېره بیا تنظیموي او ریښتینی بیرته راګرځوي.

بشپړ کوډ ستاسو د حوالې لپاره د مقالې لاندې بار شوی دی.

ښکارونه / څه تمه وکړو

یوځل چې هرڅه وصل شي او کوډ اپلوډ شي، لوبه به تاسو ته اشاره وکړي چې په ریموټ کنټرول کې کوم شمېره فشار کړئ. لوبه به بیا ستاسو د اټکلونو په اړه فیډبیک درکړي، د ممکنه شمېرو حد تازه کوي تر هغه چې تاسو په سمه توګه هدف شمېره اټکل کړئ. که تاسو د POWER تڼۍ فشار کړئ، لوبه بیا پیل کیږي او له سره پیل کیږي (په ویډیو کې په 02:30).

عامې ستونزې دا دي چې ډاډ ترلاسه کړئ چې د انفراریډ رسېونکی په سمه توګه موقعیت لري او ټولې اړیکې خوندي دي. که لوبه ځواب ورنه کړي، د برېښنا رسول وګورئ او تصدیق کړئ چې په Arduino IDE کې سم بورډ او پورټ غوره شوی دی.

د ویډیو وخت نښې

  • 00:00 پیل
  • 2:17 د لوبې پروژې پیژندنه
  • 4:37 تارونه
  • 6:15 د Arduino کوډ تشریح شوی
  • 12:32 په Arduino IDE کې د ESP32 بورډ او COM پورټ غوره کول
  • 16:16 د شمېرې اټکل لوبه کول

Images

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
Language: 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";
    }
}

Resources & references

Files📁

No files available.