#include <EEPROM.h>;
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27, 16, 2); // descripcion del display
String Leer="Bienvenido";
int direccion=0;
//ESTRUCTURA potenciometro para velocidad de los obstaculos
struct potenciometro {
const int pin;
int v_minimo;
int v_maximo;
};
struct potenciometro Pote = {33, 1, 10};
//USO DE FUNCIONES
volatile bool GAME_OVER = false;
void IRAM_ATTR Colision() {
// Manejar la interrupción de colisión
GAME_OVER = true;
lcd.println("GAME OVER");
}
//constes de tiempo;
unsigned long tiempo_actual;
unsigned long tiempo_anterior_pote;
unsigned long tiempo_base;
unsigned long tiempo_anterior_pulsador;
unsigned long tiempo_anterior_obst;
//Obstaulos:
byte cactus1[] = { B00000, B00000, B00100, B10100, B10101, B11101, B00111, B00100
};
//Dinosaurio parado
byte dino1[] = { B00000, B00000, B00000, B01001, B01111, B00111, B00011, B00001
};
byte dino2[] = { B01111, B01011, B11111, B11100, B11100, B11100, B11000, B01000
};//2°parte del dino
//Dinos levantando la pata derecha
byte derecha[] = { B00000, B00000, B00000, B01001, B01111, B00111, B00011, B00000
};
//dino levantando la pata izq
byte izq[] = { B01111, B01011, B11111, B11100, B11100, B11100, B10000, B00000
};
// facilito que columna muestro y fila
int dino_columna1 = 3;
int dino_columna2 = 4;
int parado_fila = 1;
int saltando_fila = 0;
int fila_obst = 1;
int columna_obst = 15;
//para ver mas facil que MATRIZ muestro en writhe
int dinop1 = 1;
int dinop2 = 2;
int derecha1 = 3;
int izq1 = 4;
int vercactus1 = 5;
//variables
int estado_pulsador;
int i;
int estado_dino;
int ubi_obst;
int aumento = 150;
int valor;
int estado;
int tiempo;
int p_derecha;
int s;
#define EEPROM_SIZE 100
#define direccion 0
void writeString(int addr, String data) {
for (size_t s = 0; s < data.length(); s++) {
EEPROM.write(addr + s, data[s]);
}
EEPROM.write(addr + data.length(), '\0'); // Null-terminate the string
EEPROM.commit(); // Store data to EEPROM
}
String readString(int addr) {
String data = "";
char c;
while ((c = EEPROM.read(addr++)) != '\0' && addr <= EEPROM_SIZE) {
data += c;
}
return data;
}
void setup() {
lcd.init();
lcd.backlight();
//DINO COMPLETO:
lcd.createChar(1, dino1); //lo uso si es la misma en donde levanta la pata iz
lcd.createChar(2, dino2); //lo uso donde levanta la pata derecha
lcd.createChar(3, derecha); //dino levantando la DERECHA
lcd.createChar(4, izq); // dino levantando la IZQUIERDA:
Serial.begin(115200);
lcd.createChar(5, cactus1); //Cactus1
pinMode(16, INPUT); // Pulsador
pinMode(GPIO_NUM_27, INPUT_PULLUP); // Configurar pin como entrada con pull-up interno
attachInterrupt(digitalPinToInterrupt(GPIO_NUM_27), Colision, FALLING);
EEPROM.begin(EEPROM_SIZE);
String texto_guardado = "Bienvenido.Te presento mi proyecto!";
writeString(direccion, texto_guardado);
String textoenEEPROM = readString(direccion);
Serial.println("Texto guardado en EEPROM: " + textoenEEPROM);
}
void loop() {
valor = map(analogRead(Pote.pin), 0, 4095, Pote.v_minimo, Pote.v_maximo);
tiempo = 1650 - (valor * aumento);
tiempo_actual = millis();
// ver estado del pulsador cd 20 miliseg para hacer una funcion no bloqueante
if (!GAME_OVER) {
if ((tiempo_actual - tiempo_anterior_pote) >= 20) {
estado_pulsador = digitalRead(16);
tiempo_anterior_pote = tiempo_actual;
if (estado_pulsador == 0) { //dino levantando DERECHA:
estado_dino = 0;
estado_pulsador = digitalRead(16);
lcd.setCursor(dino_columna1, parado_fila);
lcd.write(derecha1);
lcd.setCursor(dino_columna2, parado_fila);
lcd.write(dinop2);
p_derecha = 1;
}
if (p_derecha == 1) { // Dino levantando la IZQUIERDA:
estado_dino == 0;
lcd.clear();
lcd.setCursor(dino_columna1, parado_fila);
lcd.write(dinop1);
lcd.setCursor(dino_columna2, parado_fila);
lcd.write(izq1);
p_derecha = 0;
}
else if (estado_pulsador == 1) { //pulsador pulsado:DINO SALTANDO POSICION COLUMNA 3 FILA 0:
estado_dino == 1;
lcd.clear();
estado_pulsador = digitalRead(16);
lcd.setCursor(dino_columna1, saltando_fila);
lcd.write(dinop1);
lcd.setCursor(dino_columna2, saltando_fila);
lcd.write(dinop2);
}
tiempo_anterior_pulsador = tiempo_actual;
}
if ((tiempo_actual - tiempo_anterior_obst) >= 10) { //Obstaculos
if ( (tiempo_actual - tiempo_anterior_obst) >= tiempo) {
tiempo_anterior_obst = tiempo_actual;
lcd.setCursor(columna_obst - i, fila_obst);
lcd.write(vercactus1);
i++;
ubi_obst = i;
if ( i == 16) {
i = 0;
}
if ( estado_dino == 0 ) { //cactus
if (ubi_obst == 12) {
lcd.clear();
GAME_OVER = true;
IRAM_ATTR Colision();
}
if ( ubi_obst == 11) {
lcd.clear();
GAME_OVER = true;
IRAM_ATTR Colision();
}
}
}
}
}
Serial.println(tiempo);
if (GAME_OVER == true) {
estado_pulsador = digitalRead(16);
if (estado_pulsador == 1) {
GAME_OVER = false;
}
}
delay(20); // this speeds up the simulation
}