#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 = {33,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 27 //pin GPIO para Interrupcion
//-----FUNCION_INTERRUPCION------//
//para relacionar con el loop
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);
}
}
//-----FUNCION Para EEPROM-----//
//void escribirEEPROM(int direccion, String texto) { //Para escribir en la EEPROM
// for (size_t s = 0; s < texto.length(); s++) {
// EEPROM.write(direccion + s, texto[s]);
// }
//}
//String leerTexEEPROM(int direccion, int longitud) { //Para lee en la EEPROM
// String resultado = "";
// for (int s=0; s< longitud; s++){
// char caracter = EEPROM.read(direccion+s);
// if ( caracter != '\0'){
// resultado+=caracter;
// } else{
// break;
//}
//}
// return resultado;
//}
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
//Interrupcion:
pinMode(pin_interrupcion, INPUT);
attachInterrupt(digitalPinToInterrupt(pin_interrupcion), Pausa, FALLING);
//EEPROM: texto a mostrar
EEPROM.begin(EEPROM_SIZE);
//escribirEEPROM( 0, texto);
String readString(direccion);
//String textoenEEPROM = leerTexEEPROM(0, texto.length());
Serial.println("Texto guardado en EEPROM: " + texto);
EEPROM.commit();
}
void loop() {
estado_pulsador=digitalRead(16);
Serial.println(digitalRead(16));
if (interrupcion_activa){
valor=map(analogRead(Pote.pin), 0, 4095,Pote.v_minimo, Pote.v_maximo);
tiempo=1650-(valor*aumento);
tiempo_actual=millis();
if(Inicio==0){
if((tiempo_actual-tiempo_anterior_pote)>=20){ //Dinosaurio
estado_pulsador=digitalRead(16);
if (estado_pulsador==0){
Dino_CoS(); //uso de la funcion
} else {
Dino_CoS();
}
}
}
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;
}
}
}
// 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;}
}
// interrupcion_activa = false; // Reiniciamos la bandera después de procesarla
}
delay (200);
}