Ruleta Higher Lower
Autores: Juan Guillo Bermejo, Eduardo Ivorra Salinas
Grupo 12 de la asignatura de Sistemas Empotrados y de Tiempo Real
Grado en Ingeniería Informática – Curso 2021/22
Introducción
La idea inicial de nuestro proyecto era realizar un juego similar al popular Higher or Lower, juego en el cual el usuario va escogiendo entre dos conceptos aleatorios y ha de escoger entre ellos dos cuál cree que ha tenido más búsquedas en Internet. Para ello disponíamos tanto de la pantalla LCD, como el sensor de infrarrojos para interactuar con esta. Además, se buscaba también añadir alguna forma de hacer este juego más entretenido, y se decidió añadir una ruleta con LEDS que permitiera establecer una penalización cuando el usuario errase. También, siguiendo con la idea del juego principal se añadió la posibilidad de ir estableciendo puntuaciones mientras se juegan, con un récord que permita añadir nuevas normas.
Funcionamiento
Al comienzo se escogen 2 variables aleatorias entre las 40 predefinidas. Cada variable lleva asociada un número con la cantidad de búsquedas.
Además, los números de la derecha muestran la puntuación actual y el récord desde el inicio del programa. Al comienzo ambos son 0.
Cada vez que acertamos, se comprueba si la puntuación actual supera al record, y en caso de ser así se nos muestra la siguiente pantalla.
Seguimos avanzando acertando el mayor número posible, y una vez fallamos se nos muestra la siguiente pantalla indicándonos que hemos establecido un nuevo récord.
En el siguiente turno, el jugador verá el nuevo récord a batir, mientras su puntuación se va actualizando.
Cada vez que el jugador falla, se realiza el efecto de la ruleta mediante los LEDs, hasta detenerse en una franja de forma aleatoria. Posteriormente, continúa el juego.
Costes de materiales
Tratando sobre el coste de los materiales, intentamos gastarnos la menor cantidad posible. Una de las ventajas que teníamos es que se nos daba una caja de Arduino Uno completa (proporcionada por los profesores de la Universidad), por lo que los costes se iban a reducir.
Como ambos estamos concienciados con el medio ambiente, decidimos reutilizar la mayor cantidad de productos posibles, de este modo, conseguiríamos que el coste se redujera. Por ejemplo, para la creación de la ruleta utilizamos un plástico de poliespán que conseguimos de una base de pizza. Para la protección de la placa de Arduino y la protoboard nos apoyamos de una caja de ropa, la cual forramos con cinta aislante negra.
Es por ello, que conseguimos no tener coste material, ahorrándonos tiempo y dinero. Así que el coste fue de 0 €.
Problemas y soluciones encontradas
Uno de los problemas que nos encontramos fue la gestión de cables, pues utilizamos una gran cantidad de éstos. Para solucionarlo, nos ayudamos principalmente de la caja para protegerlos y esconderlos (parcialmente) y por otro lado hacer uso de los jumpers para poder alargarlos y de este modo crear fácilmente la ruleta.
Aparición de símbolos raros en la pantalla LCD. En ciertos momentos, a la hora de ejecutar la función “premioRecord” en la pantalla LCD, se mostraban símbolos extraños. No conseguimos solucionarlo de ningún modo y se nos ocurrió añadir a los print unos espacios y de esta forma los eliminamos (se puede ver en la captura del código mostrada a continuación).
Fallos con el sensor de infrarrojos y el mando. En un primer momento no conseguíamos hacer funcionar el sensor de infrarrojos porque no nos detectaba las señales del mando, pero nos dimos cuenta de que los pines del sensor de Infrarrojos estaban mal colocados y lo conseguimos hacer funcionar.
Las versiones de la librería IRremote, que no nos ejecutaba el código con las características que estábamos utilizando, tuvimos que investigar en la libería IRremote de GitHub la cual nos sacó de todos los problemas.
Circuito y componentes – Hardware
Código de desarrollo
#include <IRremote.hpp>
#include <IRRemoteControl.h>
#include <IRRemoteControlInt.h>
#include <LiquidCrystal.h>
#define tecla1 0xF30CFF00
#define tecla2 0xE718FF00
int ReceptorIR = 13;
IRrecv irrecv(ReceptorIR);
decode_results results;
String marcas[] = {"F1", "Irme Huracan", "San Valentin", "IP address", "FC Barcelona", "Jay Z", "Viena", "Abraham Linc.", "Madrid", "Ordenadores", "Lavado Coche", "ATM", "Snickers", "Ford", "Petra", "Walmart", "Camp Nou", "Wrestling", "Ikea", "Allen Iver", "Federer", "Macron", "Hambre", "Golden Gate", "BNP", "Mark Zuk", "20th Century", "Meditacion", "Macau", "Comida Hecha", "Nint Switch", "Ellon Musk", "Nicky Minaj", "Uganda", "Johnny Cash", "Photoshop", "IBM"};
int cantidad[] = {5000,7000,1500,540,9400,1200,450,820,673,450,1000,1600,300,4000,301,4500,310,670,3720,366,2740,1830,14,369,1840,1220,108,692,318,5,1110,1000,4000,302,1020,6120,642}; //37 marcas en total
int numero1;
int numero2;
int record = 0;
bool recordActualizado = false;
int puntuacionActual = 0;
char Dato ='C';
const int buttonPin = 8;
const int ledPin=12;
int buttonState = 0;
bool pulsador = false;
int leds[] = {8,9,10,11,12};
int tiempo = 50;
int n= 0;
LiquidCrystal lcd (7,6,5,4,3,2);
void setup() {
lcd.begin(16,2);
pinMode(ledPin, OUTPUT); // Se define ledpin como puerto de salida
pinMode(buttonPin, INPUT);
for(n=0;n<5;n++){
pinMode(leds[n],OUTPUT);
}
Serial.begin(9600);
irrecv.begin(ReceptorIR, DISABLE_LED_FEEDBACK);
//irrecv.enableIRIn();
randomSeed(analogRead(0));
}
void premioRecord(){
if(!recordActualizado){
lcd.clear();
lcd.setCursor(0,0);
lcd.println("RECORD SUPERADO ");
lcd.setCursor(0,1);
lcd.println("VE A POR MAS ");
delay(1000);
lcd.clear();
}
recordActualizado = true;
}
void setNuevoRecord(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("NUEVO RECORD");
lcd.setCursor(0,1);
lcd.print(puntuacionActual);
delay(1000);
recordActualizado = false;
record = puntuacionActual;
}
void ejecutarRuleta(){
int i= 0;
int j = 0;
int randomNumber = random(0,4);
while (tiempo <211){
if (tiempo>200){
Serial.print(randomNumber);
for (int i= 0;i<4; i++){
if (i == randomNumber){
for (int j = 0;j<i;j++){
digitalWrite(leds[j],LOW);
delay(tiempo);
digitalWrite(leds[j],HIGH);
}
digitalWrite(leds[i],LOW);
delay(4000);
}
else
digitalWrite(leds[i],HIGH);
}
tiempo = tiempo + 20;
}
else{
for (n=0;n<5;n++){
digitalWrite(leds[n],LOW);
delay(tiempo);
digitalWrite(leds[n],HIGH);
delay(tiempo);
}
tiempo = tiempo + 20;
}
}
}
void loop() {
Dato = 'C';
tiempo = 50;
numero1 = random(0,37);
numero2 = random(0,37);
Serial.println(numero1);
Serial.println(numero2);
while(numero1 == numero2){
numero2 = random(0,37);
}
Serial.println(numero1);
Serial.println(numero2);
String marca1 = marcas[numero1];
String marca2 = marcas[numero2];
digitalWrite(leds[0],HIGH);
digitalWrite(leds[1],HIGH);
digitalWrite(leds[2],HIGH);
digitalWrite(leds[3],HIGH);
digitalWrite(leds[4],HIGH);
lcd.setCursor(0,0);
lcd.print(marca1);
lcd.setCursor(15,0);
lcd.print(puntuacionActual);
lcd.setCursor(0,1);
lcd.print(marca2);
lcd.setCursor(15,1);
lcd.print(record);
while(Dato != 'A' && Dato!='B' ){
Dato = Serial.read();
if(irrecv.decode()){
if(irrecv.decodedIRData.decodedRawData == tecla1){
Dato='A';
}else if(irrecv.decodedIRData.decodedRawData == tecla2){
Dato='B';
}
irrecv.resume();
}
}
if(Dato == 'A') {
if (cantidad[numero1] > cantidad[numero2])
{
puntuacionActual = puntuacionActual +1;
if(puntuacionActual > record){
premioRecord();
}
digitalWrite(leds[2],LOW);
delay(1000);
}else {
Serial.println(puntuacionActual);
if(puntuacionActual>record){
setNuevoRecord();
}
puntuacionActual = 0;
digitalWrite(leds[4],LOW);
delay(1000);
ejecutarRuleta();
}
lcd.clear();
}
else if(Dato == 'B') {
if (cantidad[numero1] < cantidad[numero2]){
puntuacionActual = puntuacionActual +1;
if(puntuacionActual> record){
premioRecord();
}
digitalWrite(leds[2],LOW);
delay(1000);
}
else {
Serial.println(puntuacionActual);
if(puntuacionActual>record){
setNuevoRecord();
}
puntuacionActual = 0;
digitalWrite(leds[4],LOW);
delay(1000);
ejecutarRuleta();
}
lcd.clear();
}
}