Search Code

ESP32 Eğitimi 36/55 - Sayı Tahmin Oyunu | SunFounder'ın ESP32 IoT Öğrenme Kiti

ESP32 Eğitimi 36/55 - Sayı Tahmin Oyunu | SunFounder'ın ESP32 IoT Öğrenme Kiti

Bu eğitimde, ESP32 mikrodenetleyicisini bir kızılötesi uzaktan kumanda ve bir LCD ekranla birlikte kullanarak eğlenceli bir sayı tahmin oyunu oluşturacağız. Oyuncu, 0 ile 99 arasında rastgele üretilen bir sayıyı tahmin etmeye çalışacak ve oyun, tahminin çok yüksek veya çok düşük olup olmadığı konusunda ipuçları sağlayacak. Bu proje aracılığıyla, kızılötesi alıcının nasıl kullanılacağını, LCD üzerinde değerlerin nasıl görüntüleneceğini ve uzaktan kumandadan kullanıcı girişinin nasıl yönetileceğini öğreneceksiniz. Ek netlik için videoya başvurabilirsiniz (videoda 00:00'da).

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

Donanım Açıklaması

Bu projede kullanılan ana bileşenler ESP32 mikrodenetleyicisi, bir kızılötesi uzaktan kumanda, bir kızılötesi alıcı ve bir LCD ekrandır. ESP32 ana işlem birimi olarak görev yapar ve kablosuz iletişimi yönetebilir, bu da onu IoT projeleri için çok yönlü bir seçim haline getirir. Kızılötesi uzaktan kumanda, kullanıcıların kartla fiziksel etkileşim gerektirmeden tahmin girmesine olanak tanırken, LCD oyun durumunu ve istemleri görüntüler.

Kızılötesi alıcı, uzaktan kumandadan gelen sinyalleri algılar ve oyunda kullanılmak üzere kodlarını çözer. Uzaktan kumandadaki her düğmeye basış, ESP32'nin yorumlayabileceği belirli bir değere karşılık gelir. LCD ekran, kullanıcıya görsel bir arayüz sağlar ve mevcut tahmin aralığını ile tahminin doğru olup olmadığını gösterir.

Veri Sayfası Ayrıntıları

Üretici SunFounder
Parça numarası ESP32
Mantık/IO voltajı 3,3 V
Besleme voltajı 5 V (USB üzerinden)
Çıkış akımı (kanal başına) 12 mA (maks)
PWM frekans kılavuzu 1 kHz
Giriş mantık eşikleri 0,3 * Vcc ila 0,7 * Vcc
Gerilim düşümü / RDS(on) / doyum 0,2 V
Termal sınırlar Çalışma sıcaklığı: -40 ila 85 °C
Paket WROOM-32 modülü
Notlar / varyantlar Wi-Fi ve Bluetooth destekler

 

  • Tüm bileşenlerin geçerli olduğu yerlerde 3,3 V ve 5 V için derecelendirildiğinden emin olun.
  • Yüzen girişleri önlemek için IR alıcı için uygun pull-up dirençleri kullanın.
  • Maksimum çıkış akımında uzun süreler çalışıyorsanız bir soğutucu kullanmayı düşünün.
  • PWM kullanırken optimum performans için yaklaşık 1 kHz frekansını koruyun.
  • Kablolama konusunda dikkatli olun; aralıklı arızaları önlemek için bağlantıların güvenli olduğundan emin olun.

Kablolama Talimatları

ESP32_36_guessing_number_wiring

Sayı tahmin oyunu için kablolamayı kurmak için kızılötesi alıcıyı bağlayarak başlayın. Alıcının sağ pinindeki kırmızı kabloyu ESP32 üzerindeki 3,3 V güç kaynağına bağlayın. Siyah kablo toprağa gitmeli, kızılötesi alıcının sol pini ise ESP32 üzerindeki 14 pinine bağlanır.

ESP32_36_guessing_number_schematic

Ardından, LCD ekranı bağlayın. LCD'nin VCC pinini ESP32 üzerindeki 5 V kaynağına ve toprak pinini toprağa bağlayın. LCD'nin SDA ve SCL pinleri sırasıyla 21 ve 22 pinlerine bağlanmalıdır. Pin çakışmalarını önlemek için SDA ve SCL bağlantıları arasında iki boş alan olduğundan emin olun. Son olarak, kartı güçlendirmeden önce pilden tüm plastik kapakları çıkardığınızdan emin olun.

Kod Örnekleri ve Açıklama

Aşağıdaki kod parçacıkları, sayı tahmin oyunu için kullanılan programın temel bölümlerini göstermektedir. Gerekli kütüphaneleri dahil ederek ve anahtar tanımlayıcıları tanımlayarak başlıyoruz.

#include 
#include 
#include 
#include 

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

Bu alıntıda, LCD ve IR alıcı işlevselliğini yönetmek için kütüphaneleri dahil ediyoruz. Kızılötesi alıcının pini 14 olarak tanımlanır ve giriş ve çıkışı yönetmek için gerekli nesnelerin örneklerini oluşturuyoruz.

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

Bu parçacık, LCD'yi başlattığımız, seri iletişimi başlattığımız ve IR alıcıyı etkinleştirdiğimiz kurulum işlevini gösterir. Oyuncunun tahmin etmesi için yeni bir rastgele sayı üretmek üzere initNewValue() işlevi çağrılır.

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

Bu işlev, oyuncunun tahminini rastgele üretilen sayıya karşı kontrol eder ve üst ve alt sınırları buna göre ayarlar. Tahmin doğruysa, sayacı sıfırlar ve true döndürür.

Tam kod, referansınız için makalenin altında yüklenmiştir.

Gösterim / Ne Beklemeli

Her şey bağlandığında ve kod yüklendiğinde, oyun uzaktan kumandada herhangi bir sayıya basmanızı isteyecektir. Oyun daha sonra tahminleriniz hakkında geri bildirim sağlayacak ve hedef sayıyı doğru tahmin edene kadar olası sayı aralığını güncelleyecektir. POWER düğmesine basarsanız, oyun sıfırlanır ve yeniden başlar (videoda 02:30'da).

Yaygın hatalar arasında kızılötesi alıcının doğru yönlendirildiğinden ve tüm bağlantıların güvenli olduğundan emin olmak yer alır. Oyun yanıt vermezse, güç kaynağını kontrol edin ve Arduino IDE'de doğru kart ve portun seçildiğini doğrulayın.

Video Zaman Damgaları

  • 00:00 Başlangıç
  • 2:17 Oyun projesine giriş
  • 4:37 Bağlantılar
  • 6:15 Arduino Kodu açıklaması
  • 12:32 Arduino IDE'de ESP32 Kartı ve COM Portunun Seçilmesi
  • 16:16 Sayı tahmin oyunu oynama

Görseller

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

Kaynaklar ve referanslar

Dosyalar📁

Dosya mevcut değil.