Cari Kode

Tutorial ESP32 36/55 - Permainan Tebak Angka | Kit Pembelajaran IoT ESP32 SunFounder

Tutorial ESP32 36/55 - Permainan Tebak Angka | Kit Pembelajaran IoT ESP32 SunFounder

Dalam tutorial ini, kita akan membuat permainan tebak angka yang menyenangkan menggunakan mikrokontroler ESP32 bersama dengan remote inframerah dan layar LCD. Pemain akan mencoba menebak angka yang dihasilkan secara acak antara 0 dan 99, dengan permainan memberikan petunjuk apakah tebakan terlalu tinggi atau terlalu rendah. Melalui proyek ini, Anda akan belajar cara menggunakan penerima inframerah, menampilkan nilai di LCD, dan mengelola input pengguna dari remote control. Anda dapat merujuk pada video untuk kejelasan tambahan (di video pada 00:00).

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

Penjelasan Perangkat Keras

Komponen utama yang digunakan dalam proyek ini termasuk mikrokontroler ESP32, remote control inframerah, penerima inframerah, dan layar LCD. ESP32 berfungsi sebagai unit pemrosesan utama dan mampu menangani komunikasi nirkabel, menjadikannya pilihan serbaguna untuk proyek IoT. Remote inframerah memungkinkan pengguna memasukkan tebakan tanpa memerlukan interaksi fisik dengan papan, sementara LCD menampilkan status permainan dan petunjuk.

Penerima inframerah mendeteksi sinyal dari remote control dan mendekodekannya untuk digunakan dalam permainan. Setiap penekanan tombol pada remote sesuai dengan nilai tertentu yang dapat diinterpretasikan oleh ESP32. Layar LCD menyediakan antarmuka visual bagi pengguna, menampilkan rentang tebakan saat ini dan apakah tebakan benar.

Detail Datasheet

Produsen SunFounder
Nomor bagian ESP32
Tegangan logika/IO 3,3 V
Tegangan suplai 5 V (melalui USB)
Arus keluaran (per saluran) 12 mA (maks)
Panduan frekuensi PWM 1 kHz
Ambang logika input 0,3 * Vcc hingga 0,7 * Vcc
Penurunan tegangan / RDS(on) / saturasi 0,2 V
Batas termal Suhu operasi: -40 hingga 85 °C
Kemasan Modul WROOM-32
Catatan / varian Mendukung Wi-Fi dan Bluetooth

 

  • Pastikan semua komponen memiliki rating 3,3 V dan 5 V sesuai kebutuhan.
  • Gunakan resistor pull-up yang tepat untuk penerima IR untuk menghindari input mengambang.
  • Pertimbangkan menggunakan heat sink jika berjalan pada arus keluaran maksimum untuk waktu yang lama.
  • Saat menggunakan PWM, pertahankan frekuensi sekitar 1 kHz untuk kinerja optimal.
  • Berhati-hatilah dengan kabel; pastikan koneksi aman untuk menghindari kegagalan intermiten.

Instruksi Pengkabelan

ESP32_36_guessing_number_wiring

Untuk mengatur pengkabelan untuk permainan tebak angka, mulailah dengan menghubungkan penerima inframerah. Hubungkan kabel merah dari pin kanan penerima ke suplai daya 3,3 V pada ESP32. Kabel hitam harus menuju ground, sementara pin kiri penerima inframerah terhubung ke pin 14 pada ESP32.

ESP32_36_guessing_number_schematic

Selanjutnya, sambungkan layar LCD. Hubungkan pin VCC LCD ke suplai 5 V pada ESP32 dan pin ground ke ground. Pin SDA dan SCL LCD harus terhubung ke pin 21 dan 22 masing-masing. Pastikan ada dua ruang kosong antara koneksi SDA dan SCL untuk menghindari konflik pin. Terakhir, pastikan untuk melepas penutup plastik dari baterai sebelum memberi daya pada papan.

Contoh Kode & Panduan

Potongan kode berikut mengilustrasikan bagian penting dari program yang digunakan untuk permainan tebak angka. Kita mulai dengan menyertakan pustaka yang diperlukan dan mendefinisikan pengidentifikasi kunci.

#include 
#include 
#include 
#include 

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

Dalam kutipan ini, kita menyertakan pustaka untuk menangani fungsi LCD dan penerima IR. Pin untuk penerima inframerah didefinisikan sebagai 14, dan kita membuat instance dari objek yang diperlukan untuk mengelola input dan output.

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

Potongan ini menunjukkan fungsi setup di mana kita menginisialisasi LCD, memulai komunikasi serial, dan mengaktifkan penerima IR. Fungsi initNewValue() dipanggil untuk menghasilkan angka acak baru yang harus ditebak pemain.

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

Fungsi ini memeriksa tebakan pemain terhadap angka yang dihasilkan secara acak, menyesuaikan batas atas dan bawah sesuai. Jika tebakan benar, ia mengatur ulang hitungan dan mengembalikan true.

Kode lengkap dimuat di bawah artikel ini untuk referensi Anda.

Demonstrasi / Apa yang Diharapkan

Setelah semuanya terhubung dan kode diunggah, permainan akan meminta Anda menekan angka apa pun pada remote control. Permainan kemudian akan memberikan umpan balik atas tebakan Anda, memperbarui rentang angka yang mungkin hingga Anda berhasil menebak angka target dengan benar. Jika Anda menekan tombol POWER, permainan akan direset dan dimulai ulang (dalam video pada 02:30).

Kesalahan umum yang sering terjadi termasuk memastikan bahwa penerima inframerah diorientasikan dengan benar dan semua koneksi aman. Jika permainan tidak merespons, periksa catu daya dan pastikan board serta port yang benar dipilih di Arduino IDE.

Stempel Waktu Video

  • 00:00 Mulai
  • 2:17 Pengenalan proyek permainan
  • 4:37 Perangkaian kabel
  • 6:15 Penjelasan Kode Arduino
  • 12:32 Memilih Board ESP32 dan Port COM di Arduino IDE
  • 16:16 Bermain permainan menebak angka

Gambar

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

Sumber daya & referensi

Berkas📁

Tidak ada file tersedia.