Bincika Lambar

Koyarwar ESP32 36/55 - Wasan Zazzage Lamba | Kayan Koyon ESP32 IoT na SunFounder

Koyarwar ESP32 36/55 - Wasan Zazzage Lamba | Kayan Koyon ESP32 IoT na SunFounder

A cikin wannan koyawa, za mu ƙirƙiri wasan zance lamba mai daɗi ta amfani da microcontroller na ESP32 tare da infrared remote da nunin LCD. Mai wasa zai yi ƙoƙarin zance lambar da aka samar da bazuwar tsakanin 0 da 99, tare da wasan yana ba da alamu game da ko zance ya yi yawa ko ya yi ƙasa. Ta hanyar wannan aikin, za ku koyi yadda ake amfani da mai karɓar infrared, nuna ƙima a kan LCD, da sarrafa shigarwar mai amfani daga remote. Kuna iya koma ga bidiyon don ƙarin haske (a cikin bidiyo a 00:00).

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

Bayanin Kayan Aiki

Abubuwan farko da aka yi amfani da su a cikin wannan aikin sun haɗa da microcontroller na ESP32, infrared remote, mai karɓar infrared, da nunin LCD. ESP32 yana aiki a matsayin babban sashin sarrafawa kuma yana iya sarrafa sadarwar mara waya, yana mai da shi zaɓi mai amfani don ayyukan IoT. Infrared remote yana ba da damar masu amfani su shigar da zance ba tare da buƙatar hulɗa ta jiki da allo ba, yayin da LCD ke nuna matsayin wasan da umarni.

Mai karɓar infrared yana gano sigina daga remote kuma yana warware su don amfani a cikin wasan. Kowane dannawa na maɓalli a kan remote yana dacewa da takamaiman ƙima wanda ESP32 zai iya fassara. Nunin LCD yana ba da fuskar gani ga mai amfani, yana nuna kewayon zance na yanzu da kuma ko zance ya yi daidai.

Bayanan Datasheet

Manufacturer SunFounder
Part number ESP32
Logic/IO voltage 3.3 V
Supply voltage 5 V (ta USB)
Output current (kowane tashar) 12 mA (max)
PWM frequency guidance 1 kHz
Input logic thresholds 0.3 * Vcc zuwa 0.7 * Vcc
Voltage drop / RDS(on) / saturation 0.2 V
Thermal limits Yanayin aiki: -40 zuwa 85 °C
Package WROOM-32 module
Notes / variants Yana goyon bayan Wi-Fi da Bluetooth

 

  • Tabbatar cewa duk abubuwan sun dace da 3.3 V da 5 V inda ya dace.
  • Yi amfani da ingantattun resistors na pull-up don mai karɓar IR don guje wa shigarwar da ba ta da tushe.
  • Yi la'akari da amfani da heat sink idan kuna aiki a matsakaicin ƙarfin fitarwa na dogon lokaci.
  • Lokacin amfani da PWM, kiyaye mitar kusan 1 kHz don ingantaccen aiki.
  • Yi hankali da wayoyi; tabbatar cewa haɗin suna da aminci don guje wa gazawar tsaka-tsaki.

Umarnin Haɗin Waya

ESP32_36_guessing_number_wiring

Don saita haɗin waya don wasan zance lamba, fara da haɗa mai karɓar infrared. Haɗa wayar ja daga fil na dama na mai karɓar zuwa samar da wutar 3.3 V akan ESP32. Wayar baƙar fata ya kamata ta tafi ƙasa, yayin da fil na hagu na mai karɓar infrared ya haɗa da fil 14 akan ESP32.

ESP32_36_guessing_number_schematic

Na gaba, haɗa nunin LCD. Haɗa fil VCC na LCD zuwa samar da 5 V akan ESP32 da fil ƙasa zuwa ƙasa. Fil SDA da SCL na LCD ya kamata a haɗa su da fil 21 da 22 bi da bi. Tabbatar cewa akwai wurare biyu marasa amfani tsakanin haɗin SDA da SCL don guje wa rikice-rikice na fil. A ƙarshe, tabbatar da cire duk wani murfin filastik daga baturi kafin kunna allo.

Misalan Code & Bayani

Ƙananan sassan code da ke gaba suna nuna mahimman ɓangarori na shirin da aka yi amfani da su don wasan zance lamba. Mun fara da haɗa dakunan karatu masu mahimmanci da ayyana mahimman masu ganowa.

#include 
#include 
#include 
#include 

const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;

A cikin wannan ɓangaren, mun haɗa dakunan karatu don sarrafa aikin LCD da mai karɓar IR. Fil don mai karɓar infrared an ayyana shi a matsayin 14, kuma mun ƙirƙiri misalai na abubuwan da ake buƙata don sarrafa shigarwa da fitarwa.

void setup() {
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  irrecv.enableIRIn();
  initNewValue();
}

Wannan ɓangaren yana nuna aikin setup inda muke fara LCD, fara sadarwar serial, da kunna mai karɓar IR. Ana kiran aikin initNewValue() don samar da sabuwar lambar bazuwar don mai wasa ya zance.

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

Wannan aikin yana duba zance na mai wasa da lambar da aka samar da bazuwar, yana daidaita iyakokin sama da ƙasa daidai da haka. Idan zance ya yi daidai, yana sake saita ƙidaya kuma ya dawo da gaskiya.

Cikakken code an saukar da shi a ƙasan labarin don tunani.

Nuni / Abin da za ku Yi Tsammani

Da zarar an haɗa komai kuma an ɗora lambar, wasan zai umarce ka ka danna kowace lamba a kan remote control. Wasan zai ba da amsa game da zatonka, yana sabunta iyakar lambobin da za a iya har sai ka yi daidai da lambar da aka nufa. Idan ka danna maɓallin POWER, wasan zai sake farawa daga farko (a cikin bidiyo a 02:30).

Matsalolin gama-gari sun haɗa da tabbatar da cewa infrared receiver yana fuskantar daidai kuma duk haɗin suna da ƙarfi. Idan wasan bai amsa ba, duba wutar lantarki kuma ka tabbatar da cewa an zaɓi board da port daidai a cikin Arduino IDE.

Lokutan Bidiyo

  • 00:00 Farko
  • 2:17 Gabatarwa ga aikin wasan
  • 4:37 Haɗin wayoyi
  • 6:15 Bayanin lambar Arduino
  • 12:32 Zaɓin ESP32 Board da COM Port a cikin Arduino IDE
  • 16:16 Kunna wasan zaton lamba

Hotuna

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

Albarkatun da kuma shafukan da za a duba

Fayiloli📁

Babu fayiloli da ake da su.