#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27,16,2);// descripcion del display
//potenciometro velocidada de los obstaculos USO DE ESTRUCTURA
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;
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);
}
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
}