Пребарување код

ESP32 Упатство 36/55 - Игра со погодување број | SunFounder's ESP32 IoT Learning комплет

ESP32 Упатство 36/55 - Игра со погодување број | SunFounder's ESP32 IoT Learning комплет

Во ова упатство, ќе создадеме забавна игра за погодување број користејќи го 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 и Bluetooth

 

  • Осигурете се дека сите компоненти се оценети за 3.3 V и 5 V каде што е применливо.
  • Користете соодветни pull-up отпорници за IR приемникот за да избегнете лебдечки влезови.
  • Размислете за користење на ладилник ако работите со максимална излезна струја подолг период.
  • Кога користите PWM, одржувајте фреквенција од околу 1 kHz за оптимални перформанси.
  • Бидете внимателни со жиците; осигурете се дека врските се сигурни за да избегнете повремени дефекти.

Инструкции за поврзување

ESP32_36_guessing_number_wiring

За да го поставите поврзувањето за играта за погодување број, започнете со поврзување на инфрацрвениот приемник. Поврзете ја црвената жица од десниот пин на приемникот со 3.3 V напојување на ESP32. Црната жица треба да оди на земја, додека левиот пин на инфрацрвениот приемник се поврзува со пин 14 на ESP32.

ESP32_36_guessing_number_schematic

Следно, поврзете го LCD дисплејот. Поврзете го VCC пинот на LCD со 5 V напојување на 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();
}

Овој фрагмент ја прикажува setup функцијата каде што ги иницијализираме 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 Избор на ESP32 плоча и COM порт во Arduino IDE
  • 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";
    }
}

Ресурси и референци

Датотеки📁

Нема достапни датотеки.