Tutorial ESP32 36/55 - Juego de Adivinanza de Números | Kit de Aprendizaje IoT ESP32 de SunFounder
En este tutorial, crearemos un divertido juego de adivinar el número utilizando el microcontrolador ESP32 junto con un control remoto por infrarrojos y una pantalla LCD. El jugador intentará adivinar un número generado aleatoriamente entre 0 y 99, y el juego proporcionará pistas sobre si la adivinanza es demasiado alta o demasiado baja. A través de este proyecto, aprenderás a utilizar el receptor infrarrojo, mostrar valores en una LCD y gestionar la entrada del usuario desde un control remoto. Puedes consultar el video para mayor claridad (en el video a las 00:00).
Hardware Explicado
Los componentes principales utilizados en este proyecto incluyen el microcontrolador ESP32, un control remoto infrarrojo, un receptor infrarrojo y una pantalla LCD. El ESP32 actúa como la unidad de procesamiento principal y es capaz de manejar la comunicación inalámbrica, lo que lo convierte en una opción versátil para proyectos de IoT. El control remoto infrarrojo permite a los usuarios introducir conjeturas sin requerir interacción física con la placa, mientras que la LCD muestra el estado del juego y las indicaciones.
El receptor infrarrojo detecta señales del control remoto y las decodifica para su uso en el juego. Cada pulsación de botón en el control remoto corresponde a un valor específico que el ESP32 puede interpretar. La pantalla LCD proporciona una interfaz visual para el usuario, mostrando el rango de suposiciones actual y si la suposición fue correcta.
Detalles de la hoja de datos
| Fabricante | SunFounder |
|---|---|
| Número de pieza | ESP32 |
| Tensión de lógica/entrada/salida | 3.3 V |
| Tensión de alimentación | 5 V (a través de USB) |
| Corriente de salida (por canal) | 12 mA (máx) |
| Guía de frecuencia PWM | 1 kHz |
| Umbrales de lógica de entrada | 0.3 * Vcc a 0.7 * Vcc |
| Caída de voltaje / RDS(on)/ saturación | 0.2 V |
| Límites térmicos | Temperatura de operación: -40 a 85 °C |
| Paquete | Módulo WROOM-32 |
| Notas / variantes | Soporta Wi-Fi y Bluetooth |
- Asegúrese de que todos los componentes estén calificados para 3.3 V y 5 V cuando sea aplicable.
- Utilice resistencias pull-up adecuadas para el receptor IR para evitar entradas flotantes.
- Considere usar un disipador de calor si funciona a la corriente máxima de salida durante períodos prolongados.
- Al usar PWM, mantenga una frecuencia de alrededor de 1 kHz para un rendimiento óptimo.
- Ten cuidado con el cableado; asegúrate de que las conexiones estén seguras para evitar fallos intermitentes.
Instrucciones de cableado

Para configurar el cableado del juego de adivinanza de números, comienza conectando el receptor infrarrojo. Conecta el cable rojo del pin derecho del receptor a la fuente de alimentación de 3.3 V en el ESP32. El cable negro debe ir a tierra, mientras que el pin izquierdo del receptor infrarrojo se conecta al pin.14en el ESP32.
A continuación, cablee la pantalla LCD. Conecte el pin VCC de la LCD a la fuente de 5 V en el ESP32 y el pin de tierra a tierra. Los pines SDA y SCL de la LCD deben conectarse a los pines.21y22respectivamente. Asegúrese de que haya dos espacios vacíos entre las conexiones SDA y SCL para evitar conflictos de pines. Finalmente, asegúrese de quitar cualquier cubierta de plástico de la batería antes de encender la placa.
Ejemplos de código y guía paso a paso
Los siguientes fragmentos de código ilustran partes esenciales del programa utilizado para el juego de adivinar un número. Comenzamos incluyendo las bibliotecas necesarias y definiendo identificadores clave.
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
En este extracto, incluimos bibliotecas para manejar la funcionalidad de la LCD y el receptor de infrarrojos. El pin para el receptor infrarrojo se define como14, y creamos instancias de los objetos necesarios para gestionar la entrada y la salida.
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}Este fragmento muestra la función de configuración donde inicializamos el LCD, comenzamos la comunicación serial y habilitamos el receptor IR. La funcióninitNewValue()se llama a generar un nuevo número aleatorio para que el jugador adivine.
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;
}Esta función comprueba la suposición del jugador en comparación con el número generado aleatoriamente, ajustando los límites superiores e inferiores en consecuencia. Si la suposición es correcta, reinicia el contador y devuelve verdadero.
El código completo se carga debajo del artículo para su referencia.
Demostración / Qué Esperar
Una vez que todo esté conectado y el código esté subido, el juego te pedirá que presiones cualquier número en el control remoto. Luego, el juego proporcionará retroalimentación sobre tus conjeturas, actualizando el rango de números posibles hasta que adivines correctamente el número objetivo. Si presionas el botón de POWER, el juego se reinicia y comienza de nuevo (en el video a las 02:30).
Las trampas comunes incluyen asegurarse de que el receptor de infrarrojos esté correctamente orientado y que todas las conexiones sean seguras. Si el juego no responde, verifica la fuente de alimentación y asegúrate de que la placa y el puerto correctos estén seleccionados en el IDE de Arduino.
Marcas de tiempo del video
- 00:00 Comenzar
- 2:17 Introducción al proyecto del juego
- 4:37 Cableado
- 6:15 Código de Arduino explicado
- 12:32 Seleccionando la placa ESP32 y el puerto COM en Arduino IDE
- 16:16 Jugando al juego de adivinar el número
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// Define el pin receptor de IR.
const uint16_t IR_RECEIVE_PIN = 14;
// Crea un objeto IRrecv
IRrecv irrecv(IR_RECEIVE_PIN);
// Crea un objeto decode_results
decode_results results;
const long interval = 1000;
unsigned long previousMillis = 0;
// Inicializa el objeto LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inicializa el valor del número de entrada.
int count = 0;
// Inicializa el punto de suerte aleatorio
int pointValue = 0;
// Inicializa las puntas de límite superior e inferior.
int upper = 99;
int lower = 0;
void setup() {
// Inicializa la pantalla LCD
lcd.init();
lcd.backlight();
// Inicie la comunicación serial
Serial.begin(9600);
// Habilitar el receptor IR
irrecv.enableIRIn();
// Inicializa un nuevo valor de punto de la suerte.
initNewValue();
}
void loop() {
// Si se recibe una señal del receptor IR
if (irrecv.decode(&results)) {
bool result = 0;
String num = decodeKeyValue(results.value);
// Si se presiona el botón de ENERGÍA
if (num == "POWER") {
initNewValue(); // Inicializa un nuevo valor de punto de la suerte.
}
// Si se presiona el botón CYCLE
else if (num == "CYCLE") {
result = detectPoint(); // Detectar el número de entrada
lcdShowInput(result); // Muestra el resultado en la pantalla LCD.
}
// Si se presiona un botón numérico (0-9),
// agrega el dígito al número de entrada
// y detectar el número si es mayor o igual a 10
else if (num >= "0" && num <= "9") {
count = count * 10;
count += num.toInt();
if (count >= 10) {
result = detectPoint();
}
lcdShowInput(result);
}
irrecv.resume();
}
}
// Función para inicializar un nuevo valor de punto de la suerte
void initNewValue() {
// Establecer la semilla aleatoria en función del valor analógico del pin A0.
randomSeed(analogRead(A0));
// Generar un nuevo valor de punto de suerte aleatorio
pointValue = random(99);
// Restablecer las recomendaciones de límite superior e inferior
upper = 99;
lower = 0;
// Muestre el mensaje de bienvenida en la pantalla LCD.
lcd.clear();
lcd.print(" Welcome!");
lcd.setCursor(0, 1);
lcd.print("Press Any Number");
// Restablecer el valor numérico de entrada
count = 0;
// Imprime el valor del punto de la suerte en el monitor serie.
Serial.print("point is ");
Serial.println(pointValue);
}
// Detectar el número de entrada
// y actualiza las recomendaciones de límites superiores/inferiores en consecuencia
bool detectPoint() {
if (count > pointValue) {
if (count < upper)upper = count;
}
else if (count < pointValue) {
if (count > lower)lower = count;
}
// Si el número de entrada es igual al valor del punto de la suerte,
else if (count == pointValue) {
// Restablecer el número de entrada y devolver verdadero.
count = 0;
return 1;
}
// Restablecer el número de entrada y devolver falso.
count = 0;
return 0;
}
// Muestre el número de entrada y los consejos de límite superior/inferior.
void lcdShowInput(bool result) {
lcd.clear();
// Si el número de entrada es igual al valor del punto de la suerte
if (result == 1)
{
// Mostrar el mensaje de éxito e inicializar un nuevo valor de punto de suerte.
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);
}
// Función para decodificar el valor de la clave de la señal del receptor IR
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";
}
}
Common Course Links
Common Course Files
Recursos y referencias
-
Documentación
Archivos📁
No hay archivos disponibles.