#include <EEPROM.h>;
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27,16,2);// descripcion del display
volatile bool interrupcion_activa=false ;
// ESTRUCTURA: Potenciometro para la velocidad de los obstaculos
struct potenciometro {
const int pin;
int v_minimo;
int v_maximo;
};
struct potenciometro Pote = {2,1,10};
//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;
unsigned long tiempo_anterior_reset;
//Arreglos para diseñar los caracteres a mostrar en el display:
byte cactus1[]={ B00000,B00000,B00100,B10100, B10101,B11101,B00111,B00100
}; //cactus ostaculo
byte dino1[]={ B00000,B00000,B00000,B01001, B01111,B00111,B00011,B00001
}; //1° parte Dinosaurio parado
byte dino2[]={ B01111,B01011,B11111,B11100, B11100,B11100,B11000,B01000
}; //2°parte del dino
byte derecha[]={ B00000,B00000,B00000,B01001, B01111,B00111,B00011,B00000
}; //Dino levantando ,la pata derecha
byte izq[]={ B01111,B01011,B11111,B11100, B11100,B11100,B10000,B00000
}; //dino levantando la pata izq
//Ayuda para ver que columna y fila muestro:
int dino_columna1=3;
int dino_columna2=4;
int parado_fila=1;
int saltando_fila=0;
int fila_obst=1;
int columna_obst=15;
//Ayuda para ver que MATRIZ muestro en writhe
int dinop1=1;
int dinop2=2;
int derecha1=3;
int izq1=4;
int vercactus1=5;
//variables
int Inicio;
int estado_pulsador;
int i;
int estado_dino;
int ubi_obst;
int aumento=150;
int valor;
int estado;
int tiempo;
int p_derecha;
//----variables a usar en la EEPROM----//
#define EEPROM_SIZE 100
#define direccion 0
String texto= "Bienvenido!";
//#define longitud=21
#define pin_interrupcion 12 //pin GPIO para Interrupcion
//-----FUNCION_INTERRUPCION------//
void IRAM_ATTR Pausa() { //Funcion de la interrupcion
interrupcion_activa=!interrupcion_activa;
}
//----FUNCION DINO_CORRIENDO/SALTANDO----//
void Dino_CoS(){
if (estado_pulsador==0){ //dino corriendo: 1° derecha
lcd.clear();
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 corriendo: 2° izquierda:
estado_dino=0;
lcd.setCursor(dino_columna1,parado_fila);
lcd.write(dinop1);
lcd.setCursor(dino_columna2,parado_fila);
lcd.write(izq1);
p_derecha=0;
}
}
else{ //dino Saltando
estado_dino=1;
lcd.clear();
lcd.setCursor(dino_columna1,saltando_fila);
lcd.write(dinop1);
lcd.setCursor(dino_columna2,saltando_fila);
lcd.write(dinop2);
}
}
void setup() {
Serial.begin(115200);
//Encender display
lcd.init();
lcd.backlight();
//Defino Matriz de los caracteres: dino1+dino2 lo uso para el salto y mov de patas
lcd.createChar(1,dino1); //lo uso donde levanta la pata izquierda
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:
lcd.createChar(5,cactus1); // Cactus1
pinMode(16, INPUT); // Pulsador para saltar
pinMode(Pote.pin, INPUT);
//Interrupcion:
pinMode(pin_interrupcion, INPUT);
attachInterrupt(digitalPinToInterrupt(pin_interrupcion), Pausa, FALLING);
//EEPROM: texto a mostrar
EEPROM.begin(EEPROM_SIZE);
//EEPROM.writeString(direccion, texto);
//EEPROM.commit();
//String String(direccion);
Serial.println(EEPROM.readString(direccion));
}
void loop() {
if (interrupcion_activa){
valor=map(analogRead(Pote.pin), 0, 4095,Pote.v_minimo, Pote.v_maximo);
tiempo=1900-(valor*aumento);
tiempo_actual=millis();
// ver estado del pulsador cd 20 miliseg para hacer una funcion no bloqueante
if(Inicio==0){
if((tiempo_actual-tiempo_anterior_pote)>=20){ //Dinosaurio
estado_pulsador=digitalRead(16);
Dino_CoS(); //uso de la funcion
//tiempo_anterior_pote=tiempo_actual;
}
tiempo_anterior_pote=tiempo_actual;
}
if((tiempo_actual-tiempo_anterior_obst)>=200){ //Obstaculos
if( (tiempo_actual-tiempo_anterior_obst)>=tiempo){
lcd.setCursor(columna_obst-i,fila_obst);
lcd.write(vercactus1);
i++;
ubi_obst=i;
if( i==16){
i=0;
}
tiempo_anterior_obst=tiempo_actual;
}
}
// juego finalizado
if (estado_dino == 0) {
if (ubi_obst == 12 || ubi_obst == 13) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("GAME_OVER");
Inicio=1;
}
}
//Reanudar el juego:
if (Inicio==1){
estado_pulsador=digitalRead(16);
if (estado_pulsador==1){
Inicio=0;
i=0;
} else { i=0;}
}
}
delay(20);
}