Szukaj kodu

Samouczek ESP32 36/55 - Gra w zgadywanie liczby | Zestaw do nauki IoT ESP32 od SunFounder

Samouczek ESP32 36/55 - Gra w zgadywanie liczby | Zestaw do nauki IoT ESP32 od SunFounder

W tym samouczku stworzymy zabawną grę polegającą na zgadywaniu liczby z użyciem mikrokontrolera ESP32 wraz z pilotem na podczerwień i wyświetlaczem LCD. Gracz będzie próbował odgadnąć losowo wygenerowaną liczbę z zakresu od 0 do 99, a gra będzie udzielać podpowiedzi, czy zgadywana liczba jest za wysoka, czy za niska. Dzięki temu projektowi nauczysz się korzystać z odbiornika podczerwieni, wyświetlać wartości na LCD oraz zarządzać danymi wejściowymi użytkownika z pilota. Możesz odwołać się do filmu, aby uzyskać dodatkowe wyjaśnienia (na filmie w 00:00).

ESP32_36_guessing_numbe-1
ESP32_36_guessing_numbe-2

Wyjaśnienie sprzętu

Główne komponenty użyte w tym projekcie obejmują mikrokontroler ESP32, pilota na podczerwień, odbiornik podczerwieni oraz wyświetlacz LCD. ESP32 służy jako główna jednostka przetwarzająca i jest w stanie obsługiwać komunikację bezprzewodową, co czyni go wszechstronnym wyborem do projektów IoT. Pilot na podczerwień umożliwia użytkownikom wprowadzanie zgadywanych liczb bez konieczności fizycznej interakcji z płytką, podczas gdy LCD wyświetla status gry i monity.

Odbiornik podczerwieni wykrywa sygnały z pilota i dekoduje je do wykorzystania w grze. Każde naciśnięcie przycisku na pilocie odpowiada określonej wartości, którą ESP32 może zinterpretować. Wyświetlacz LCD zapewnia wizualny interfejs dla użytkownika, pokazując bieżący zakres zgadywania oraz to, czy zgadywana liczba była poprawna.

Szczegóły z karty katalogowej

Producent SunFounder
Numer części ESP32
Napięcie logiczne/IO 3,3 V
Napięcie zasilania 5 V (przez USB)
Prąd wyjściowy (na kanał) 12 mA (maks.)
Zalecana częstotliwość PWM 1 kHz
Progi logiczne wejściowe 0,3 * Vcc do 0,7 * Vcc
Spadek napięcia / RDS(on) / nasycenie 0,2 V
Limity termiczne Temperatura pracy: od -40 do 85 °C
Obudowa Moduł WROOM-32
Uwagi / warianty Obsługuje Wi-Fi i Bluetooth

 

  • Upewnij się, że wszystkie komponenty są przystosowane do napięcia 3,3 V i 5 V tam, gdzie to ma zastosowanie.
  • Użyj odpowiednich rezystorów podciągających dla odbiornika podczerwieni, aby uniknąć pływających wejść.
  • Rozważ użycie radiatora, jeśli urządzenie pracuje z maksymalnym prądem wyjściowym przez dłuższy czas.
  • Podczas korzystania z PWM utrzymuj częstotliwość około 1 kHz dla optymalnej wydajności.
  • Zachowaj ostrożność podczas okablowania; upewnij się, że połączenia są pewne, aby uniknąć sporadycznych awarii.

Instrukcje okablowania

ESP32_36_guessing_number_wiring

Aby skonfigurować okablowanie gry w zgadywanie liczby, zacznij od podłączenia odbiornika podczerwieni. Podłącz czerwony przewód z prawego pinu odbiornika do zasilania 3,3 V na ESP32. Czarny przewód powinien iść do masy, a lewy pin odbiornika podczerwieni podłącz do pinu 14 na ESP32.

ESP32_36_guessing_number_schematic

Następnie podłącz wyświetlacz LCD. Podłącz pin VCC wyświetlacza do zasilania 5 V na ESP32, a pin masy do masy. Piny SDA i SCL wyświetlacza należy podłączyć odpowiednio do pinów 21 i 22. Upewnij się, że między połączeniami SDA i SCL są dwie wolne przestrzenie, aby uniknąć konfliktów pinów. Na koniec pamiętaj o usunięciu plastikowych osłon z baterii przed zasileniem płytki.

Przykłady kodu i omówienie

Poniższe fragmenty kodu ilustrują istotne części programu używanego w grze w zgadywanie liczby. Zaczynamy od dołączenia niezbędnych bibliotek i zdefiniowania kluczowych identyfikatorów.

#include 
#include 
#include 
#include 

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

W tym fragmencie dołączamy biblioteki do obsługi funkcji LCD i odbiornika podczerwieni. Pin odbiornika podczerwieni jest zdefiniowany jako 14, a my tworzymy instancje niezbędnych obiektów do zarządzania danymi wejściowymi i wyjściowymi.

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

Ten fragment pokazuje funkcję setup, w której inicjalizujemy LCD, uruchamiamy komunikację szeregową i włączamy odbiornik podczerwieni. Funkcja initNewValue() jest wywoływana w celu wygenerowania nowej losowej liczby, którą gracz ma odgadnąć.

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

Ta funkcja sprawdza zgadywaną liczbę gracza względem losowo wygenerowanej liczby, odpowiednio dostosowując górne i dolne limity. Jeśli zgadywana liczba jest poprawna, resetuje licznik i zwraca true.

Pełny kod znajduje się poniżej artykułu do wglądu.

Demonstracja / Czego się spodziewać

Gdy wszystko jest podłączone, a kod wgrany, gra poprosi Cię o naciśnięcie dowolnego numeru na pilocie. Gra będzie następnie udzielać informacji zwrotnej na temat Twoich zgadywań, aktualizując zakres możliwych liczb, aż poprawnie odgadniesz docelową liczbę. Jeśli naciśniesz przycisk POWER, gra resetuje się i zaczyna od nowa (na filmie o 02:30).

Typowe pułapki obejmują upewnienie się, że odbiornik podczerwieni jest prawidłowo zorientowany, a wszystkie połączenia są pewne. Jeśli gra nie reaguje, sprawdź zasilanie i zweryfikuj, czy w Arduino IDE wybrano właściwą płytkę i port.

Znaczniki czasu wideo

  • 00:00 Start
  • 2:17 Wprowadzenie do projektu gry
  • 4:37 Podłączanie
  • 6:15 Wyjaśnienie kodu Arduino
  • 12:32 Wybór płytki ESP32 i portu COM w Arduino IDE
  • 16:16 Granie w grę zgadywania liczby

Obrazy

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
Język: 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";
    }
}

Zasoby i odniesienia

Pliki📁

Brak dostępnych plików.