Search Code

ESP32 Оқулық 36/55 - Санды болжау ойыны | SunFounder компаниясының ESP32 IoT оқу жинағы

ESP32 Оқулық 36/55 - Санды болжау ойыны | SunFounder компаниясының 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 В
Қоректендіру кернеуі 5 В (USB арқылы)
Шығыс тогы (арнаға) 12 мА (макс)
PWM жиілігі бойынша нұсқау 1 кГц
Кіріс логикалық шектері 0.3 * Vcc - 0.7 * Vcc
Кернеудің төмендеуі / RDS(on) / қанығу 0.2 В
Жылулық шектер Жұмыс температурасы: -40 - 85 °C
Қаптама WROOM-32 модулі
Ескертулер / нұсқалар Wi-Fi және Bluetooth қолдайды

 

  • Барлық компоненттердің қажет болған жерде 3.3 В және 5 В үшін есептелгеніне көз жеткізіңіз.
  • Қалқымалы кірістерді болдырмау үшін IR қабылдағыш үшін дұрыс тарту резисторларын қолданыңыз.
  • Ұзақ уақыт бойы максималды шығыс тогында жұмыс істегенде жылу таратқышты қолдануды қарастырыңыз.
  • PWM қолданғанда, оңтайлы өнімділік үшін шамамен 1 кГц жиілікті сақтаңыз.
  • Сымдармен абай болыңыз; үзіліссіз ақауларды болдырмау үшін қосылымдардың сенімді екеніне көз жеткізіңіз.

Сымдарды қосу нұсқаулары

ESP32_36_guessing_number_wiring

Санды болжау ойыны үшін сымдарды орнату үшін инфрақызыл қабылдағышты қосудан бастаңыз. Қабылдағыштың оң жақ түйреуішінен қызыл сымды ESP32-дегі 3.3 В қоректендіруге қосыңыз. Қара сым жерге қосылуы керек, ал инфрақызыл қабылдағыштың сол жақ түйреуіші ESP32-дегі 14 түйреуішіне қосылады.

ESP32_36_guessing_number_schematic

Әрі қарай, LCD дисплейді қосыңыз. LCD-дің VCC түйреуішін ESP32-дегі 5 В қоректендіруге және жер түйреуішін жерге қосыңыз. 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;
}

Бұл функция ойыншының болжамын кездейсоқ жасалған санмен тексереді, жоғарғы және төменгі шектерді сәйкесінше реттейді. Егер болжам дұрыс болса, ол санақты қалпына келтіреді және true мәнін қайтарады.

Толық код сілтеме үшін мақаланың төменінде жүктелген.

Демонстрация / Не күтуге болады

Барлығы сыммен жалғанып, код жүктелгеннен кейін, ойын сізден пульттегі кез келген санды басуыңызды сұрайды. Содан кейін ойын сіздің болжамдарыңызға кері байланыс береді, мақсатты санды дұрыс тапқанша мүмкін сандар ауқымын жаңартып отырады. POWER түймесін бассаңыз, ойын қалпына келіп, қайта басталады (бейнеде 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";
    }
}

Ресурстар мен сілтемелер

Файлдар📁

Файлдар жоқ.