Grupos de trabajo

Imagen de fondo del tipo de comunidad

Se trata de desarrollar en la práctica diferentes proyectos con Arduino de forma que se ponga de manifiesto las dificultades que pueden presentarse para los alumnos, se compruebe la posibilidad real de ejecutarlos en clase y los conocimientos que se adquieren al implementar los proyectos.

Blog Blog

Atrás

Código parcial "Cofre sorpresa"

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;
      }
    }
  }

Comentarios
Añadir comentario
Guillermo Francoso Vicente
Hola:
Como veis esta versión es más atractiva, ya que en lugar de que el alumno pulse números en un teclado, lo que hace es que detiene al pulsar unos números que se desplazan en plan ruleta, para luego incrementar o decrementar cada uno de los dígitos de la cifra y finalmente pulsar OK. Así para cada uno de los tres dígitos.

Todavía está en desarrollo, el anterior no es el código definitivo, hay que depurarlo.

Saludos.
Publicado el día 17/04/17 14:18.

Miembros Miembros

Foto de Andrés Lasry Hernández

Andrés Lasry Hernández

Foto de Jesús Carrión García

Jesús Carrión García

Foto de Juan José Callejón Acién

Juan José Callejón Acién

Foto de Guillermo Francoso Vicente

Guillermo Francoso Vicente

Foto de José Alberto García Paz

José Alberto García Paz

Foto de Luis Guevara Góngora

Luis Guevara Góngora

Foto de Aurelio Oliver López

Aurelio Oliver López

Foto de Miguel Olmedo García

Miguel Olmedo García

Foto de Francisco Javier Rodríguez Sánchez

Francisco Javier Rodríguez Sánchez

Foto de Ángel Gabriel Ruiz Andrés

Ángel Gabriel Ruiz Andrés