#include <Wire.h>
#include <LiquidCrystal.h>
// Pins for joystick
#define PIN_X 34 // Pin X del joystick conectado a pin 34
#define PIN_Y 35 // Pin Y del joystick conectado a pin 35
// Pins for LCD
LiquidCrystal LCD(23, 22, 5, 18, 19, 21); // RS, E, D4, D5, D6, D7
// Tamaño de la pantalla
const int screenWidth = 16;
const int screenHeight = 2;
// Posición actual del Pacman en la pantalla virtual
int fantasmaX = 0;
int fantasmaY = 0;
// Posición anterior del Pacman en la pantalla virtual
int lastghostX = 0;
int lastghostY = 0;
// Símbolos del Pacman con boca abierta y boca cerrada
byte fantasma01Symbol[] = {
B01110,
B11111,
B10101,
B10101,
B11111,
B11111,
B11111,
B10101
};
byte fantasma02Symbol[] = {
B01110,
B11111,
B10101,
B10101,
B11111,
B11111,
B11111,
B01010
};
// Variable para alternar entre boca abierta y boca cerrada
bool fantasma01 = true;
// Variable para almacenar la última dirección del movimiento del joystick
int lastJoystickDirection = 0;
// Pantalla virtual
byte pantalla[screenWidth][screenHeight];
// Umbrales para la lectura del joystick
const int thresholdX = 200; // Umbral para el eje X
const int thresholdY = 200; // Umbral para el eje Y
void mostrarEnunciados() {
// Mostrar presentación
LCD.setCursor(0, 0);
LCD.print("PARCIAL ENFASIS");
LCD.setCursor(0, 1);
LCD.print("CORTE 3");
delay(2000); // Delay para mostrar cada texto por 2 segundos
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("PRESENTADOR POR:");
LCD.setCursor(0, 1);
LCD.print("JUAN MUNOZ"); // Modificación aquí
delay(2000); // Delay para mostrar cada texto por 2 segundos
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("CODIGO:");
LCD.setCursor(0, 1);
LCD.print("1221020008"); // Modificación aquí
delay(2000); // Delay para mostrar cada texto por 2 segundos
// Limpiar la pantalla después de la presentación
LCD.clear();
}
void setup() {
Serial.begin(9600);
LCD.begin(screenWidth, screenHeight);
LCD.createChar(0, fantasma01Symbol);
LCD.createChar(1, fantasma02Symbol);
analogReadResolution(10); // Para poner el mismo rango que se usa en Arduino, declaramos que se leerán de 2*10 bits, que son 1024 bits
// Inicializar la pantalla virtual
for (int x = 0; x < screenWidth; x++) {
for (int y = 0; y < screenHeight; y++) {
pantalla[x][y] = ' ';
}
}
pinMode(PIN_X, INPUT);
pinMode(PIN_Y, INPUT);
}
void loop() {
mostrarEnunciados(); // Mostrar los enunciados antes de iniciar el juego
// Leer los valores del joystick en los ejes X e Y
int xValue = analogRead(PIN_X);
int yValue = analogRead(PIN_Y);
// Dirección del movimiento del Pacman
int directionX = 0;
int directionY = 0;
// Verificar la entrada del joystick para determinar la dirección del movimiento
// Si el valor de yValue es menor que 312, significa que el joystick se mueve hacia arriba
if (yValue < (512 - thresholdY)) {
directionY = -1; // Arriba
}
// Si el valor de yValue es mayor que 712, significa que el joystick se mueve hacia abajo
else if (yValue > (512 + thresholdY)) {
directionY = 1; // Abajo
}
// Si el valor de xValue es menor que 312, significa que el joystick se mueve hacia la izquierda
if (xValue < (512 - thresholdX)) {
directionX = -1; // Izquierda
}
// Si el valor de xValue es mayor que 712, significa que el joystick se mueve hacia la derecha
else if (xValue > (512 + thresholdX)) {
directionX = 1; // Derecha
}
// Si hay movimiento del joystick, actualizar la posición del Pacman
if (directionX != 0 || directionY != 0) {
// Verificar si el joystick se ha movido en una nueva dirección
if (directionX != lastJoystickDirection || directionY != lastJoystickDirection) {
// Actualizar la última dirección del joystick
lastJoystickDirection = directionX != 0 ? directionX : directionY;
// Actualizar la última posición del Pacman
lastghostX = fantasmaX;
lastghostY = fantasmaY;
// Mover el Pacman en la dirección actual
fantasmaX += directionX;
fantasmaY += directionY;
// Verificar los límites de la pantalla
fantasmaX = constrain(fantasmaX, 0, screenWidth - 1);
fantasmaY = constrain(fantasmaY, 0, screenHeight - 1);
}
}
// Borrar el Pacman de la pantalla
for (int x = 0; x < screenWidth; x++) {
for (int y = 0; y < screenHeight; y++) {
pantalla[x][y] = ' ';
}
}
// Dibujar el Pacman en la nueva posición
pantalla[fantasmaX][fantasmaY] = fantasma01 ? 0 : 1;
// Mostrar la pantalla virtual en el LCD
for (int y = 0; y < screenHeight; y++) {
LCD.setCursor(0, y);
for (int x = 0; x < screenWidth; x++) {
LCD.write(pantalla[x][y]);
}
}
// Alternar entre boca abierta y boca cerrada
fantasma01 = !fantasma01;
delay(150); // Ajusta el tiempo de animación según sea necesario
}