Hola.
Aunque el material hardware para el "Cofre sorpresa" aún no ha llegado, lo que va a imposibilitar su desarrollo a tiempo para la Feria de Ciclos, ya estamos desarrollando parte del código en Arduino.
En principio existirán tres displays matriciales que presentarán números aleatorios a gran velocidad. Existirán tres pulsadores (subir, bajar y OK) cuya pulsación detendrá el scroll de cifras del primer display para que el usuario seleccione (mediante + y -) la cifra que desea. Al pulsar OK, el display activo será el segundo y repetirá la acción. Cuando presione OK en la última cifra, el sistema comprueba el premio abriendo la caja si es correcto.
A continuación incluimos parte del código, que incluye la asignación del código secreto aleatorio, el scroll de cifras y la selección de cifras deseadas, así como la comprobación del premio.
A ver que os parece.
Saludos.
/* Caja sorpresa con clave
* Feria de Ciclos IES Virgen de la Esperanza
* J.Alberto García & Guillermo Francoso
*/
const int pulsaSubir=2; // asigna pines a los botones Subir, Bajar y Ok
const int pulsaBajar=3;
const int pulsaOk=4;
const int tiempoVisualiza= 200; // retraso para visualizar dígito en display
const int tamanoClave=3; // establece el tamaño de la clave a descubrir
const int intentoMaximo=5; // establece el número máximo de intentos
int intentoActual= 0; // almacena el número máximo de intentos para descubrir la clave
int numeroSecreto[tamanoClave]; // almacena la clave secreta aleatoria
int numeroDisplay[tamanoClave]; // almacena el valor a mostrar en cada display
int tiempoDisplay[tamanoClave]; // duración de visualización de cifra en cada display
boolean rollingDisplay[tamanoClave];// controla el movimiento de cifras en cada display
int parpadeaPosicion[tamanoClave]; // almacena el periodo de parpadeo de cada display. 0 es sin parpadeo.
int posicionActual=0; // almacena el número de display controlado
void setup() {
pinMode(pulsaSubir, INPUT);
pinMode(pulsaBajar, INPUT);
pinMode(pulsaOk, INPUT);
for (int i=0;i<tamanoClave;i++){
rollingDisplay[i]=true; // activa el movimiento de cifras en todos los displays
tiempoDisplay[i]=0; // inicializa a 0 el tiempo de visualización de cifra en display
parpadeaPosicion[i]=0; // inicializa SIN parpadeo a todos los displays
}
}
void loop() {
if (intentoActual==0) {
generaClave();
}
for (int i=0;i<tamanoClave;i++){
if (rollingDisplay[i]){
runCifra(i); // llama a actualizar cifra si el display tiene rolling activo
}
}
}
// runCifra muestra números aleatorios corriendo en el display
void runCifra(int posicion){
if (millis()-tiempoDisplay[posicion]>=tiempoVisualiza) { //la cifra se mantiene durante el tiempoVisualiza
numeroDisplay[posicion]=random(0,10); //si ha pasado se crea nueva cifra aleatoria
tiempoDisplay[posicion]=millis(); //actualiza t inicial
muestraDigito(posicion,numeroDisplay[posicion]); //envia nueva cifra a display correspondiente
}
// botonPulsado es llamado por interrupcion y responde según botón
void botonPulsado(){
rollingDisplay[posicionActual]=false;
if (pulsaOk=LOW){
if (posicionActual=tamanoClave-1){
compruebaPremio();
}
else{
posicionActual++;
}
}
if (pulsaSubir=LOW){
numeroDisplay[posicionActual]++;
muestraDigito(numeroDisplay[posicionActual]);
}
if (pulsaBajar=LOW){
numeroDisplay[posicionActual]--;
muestraDigito(numeroDisplay[posicionActual]);
}
}
}
void generaClave(){
for (int i=0;i<tamanoClave;i++){
numeroClave[i]=random(0,10);
}
}
void compruebaPremio(){
intentoActual++; // incrementa contador de intentos
int aciertos=0; // inicializa número de aciertos en este intento
for (int i=0;i<tamanoClave;i++){ // comprueba cada cifra con la secreta
if (numeroDisplay[i]=numeroSecreto[i]{
aciertos++;
parpadeaPosicion[i]=300;
}
}
}