#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición de pines para el sensor de temperatura y el botón
const int buttonPin = 7; // Pin del botón
const int tempSensorPin = A1; // Pin del sensor de temperatura
// Inicialización de los LCDs
LiquidCrystal_I2C lcdHorno(0x27, 16, 2); // LCD para el horno
LiquidCrystal_I2C lcdEstado(0x26, 16, 2); // LCD para el estado del juego
// Estructura para recetas
struct Recipe {
float temp; // temperatura en grados Celsius
unsigned long time; // tiempo en segundos para mantener la temperatura
};
Recipe currentRecipe;
unsigned long startTime;
boolean recipeActive = false;
// Variables de juego
unsigned long gameStartTime;
const unsigned long gameDuration = 120000; // Duración del juego en milisegundos (2 minutos)
boolean gameRunning = false;
int score = 0; // Puntuación para el horno
int successfulBakes = 0; // Contador de horneados exitosos
void setup() {
Serial.begin(9600);
lcdHorno.init(); // Inicializa el LCD del horno
lcdEstado.init(); // Inicializa el LCD de estado
lcdHorno.backlight();
lcdEstado.backlight();
lcdEstado.clear();
lcdEstado.print("Baking Chaos!");
delay(2000);
pinMode(buttonPin, INPUT_PULLUP);
startGame();
}
void loop() {
if (gameRunning) {
unsigned long currentTime = millis();
if (currentTime - gameStartTime > gameDuration) {
endGame();
} else {
lcdHorno.setCursor(0, 0);
lcdHorno.print(readTemperature());
if (digitalRead(buttonPin) == LOW) {
checkRecipe();
}
}
}
}
void startGame() {
gameStartTime = millis();
gameRunning = true;
setRandomRecipe();
//updateGameState();
}
void endGame() {
gameRunning = false;
lcdEstado.clear();
lcdEstado.print("Game Over");
lcdEstado.setCursor(0, 1);
lcdEstado.print("Score: ");
lcdEstado.print(score);
}
void setRandomRecipe() {
currentRecipe.temp = random(150, 251); // Temperatura aleatoria entre 150 y 250
currentRecipe.time = random(10, 21); // Tiempo aleatorio entre 10 y 20 segundos
lcdHorno.clear();
lcdHorno.print("Set Temp: ");
lcdHorno.print(currentRecipe.temp);
lcdHorno.setCursor(0, 1);
lcdHorno.print("Time: ");
lcdHorno.print(currentRecipe.time);
lcdHorno.print("s");
}
void checkRecipe() {
float currentTemp = readTemperature();
if (!recipeActive) {
if (abs(currentTemp - currentRecipe.temp) <= 5) { // Tolerancia de temperatura
startTime = millis();
recipeActive = true;
}
} else {
if (abs(currentTemp - currentRecipe.temp) > 5) {
recipeActive = false; // Reset si la temperatura varía mucho
} else if (millis() - startTime >= currentRecipe.time * 1000) {
score += 50; // Otorga puntos
successfulBakes++; // Incrementa el contador de horneados exitosos
lcdEstado.clear();
lcdEstado.print("Perfect Bake!");
//updateGameState();
recipeActive = false;
setRandomRecipe(); // Nueva receta
}
}
}
float readTemperature() {
int reading = analogRead(tempSensorPin);
float voltage = reading * 5.0 / 1024.0;
return (voltage - 0.5) * 100.0;
}