Ejercicio 18: Replay

Introducimos una secuencia de pulsaciones de longitud predefinida usando 4 pulsadores y se reproduce con los LEDs y notas asociadas a cada pulsador.

Novedades hardwareNovedades software
 Uso de la iteración y las cadenas para almacenar entradas digitales sucesivas.

Requisitos:

  • 4 LEDs, 4 resistencias de 220 ohmios
  • 4 pulsadores, 4 resistencias de 1Kohmio.

Planteamiento: Grabador/reproductor de secuencias de luces.

Presentación: Cómo almacenar entradas digitales sucesivas en cadenas.

El programa está dividido en dos partes: la grabación y la reproducción, cada una con su procedimiento.

  • El de grabación, void guardapuls( ) , comienza esperando, con un bucle while, a que se presione un pulsador.

A continuación todo está dentro de una iteración que recorre las 4 entradas digitales, y en cada ciclo se comprueba si hay señal desde una entrada.

Si en alguno de los 4 ciclos se presiona el pulsador, se ejecutará lo que está dentro del condicional:

Las instrucciones que hacen parpadear el LED.
Guardamos en una cadena la pulsación que acaba de ocurrir, en la posición que corresponde al valor de la variable, m, que lleva la cuenta de las pulsaciones.
Añadimos uno a la cuenta de pulsaciones.

Veamos en más detalle qué es lo que estamos guardando:

cadenapuls[n]: es el nº del PIN al que está conectado el pulsador.
seriePuls[m]+4: 4+ el nº del PIN del pulsador nos da el nº de PIN del LED que asociamos a cada pulsador, como se ve en las cadenas que definen entradas y salidas:

--> int cadenaLeds[]={6,7,8,9};
--> int cadenaPuls[] ={2,3,4,5};

  • El de reproducción, void replay( ) , simplemente hace parpadear cada LED al recorrer la cadena donde están guardados loa números de PIN del LED asociado a cada pulsación, hasta llegar al último (que es el de la posición correspondiente al nº de pulsaciones).

El programa principal sólo se ocupa de ejecutar la grabación y, si se ha completado el nº total de pulsaciones, ejecutar la reproducción y reiniciar el nº de pulsaciones a 0 para vover a empezar. El bucle general, que guarda el nº de pulsaciones que establecemos en la variable nleds es el infinito del void loop ( ) que se detiene y reinicia al cumplirse la condición del if y reiniciarse la variable contador a 0.

Variantes:

  • Como el procedimiento de reproducción sólo usa serieLeds[n] podríamos ahorrarnos seriePuls[n] en el de grabación. No lo hemos hecho, porque parece más claro dar el paso intermedio. Ahora puedes hacerlo, tal como está escrito, debería ser evidente.
  • Conocemos una instrucción que nos hace el bucle y el condicional a la vez (while), introdúcela para sustituir el if(m= =nleds).
  • Supón que no puedes colocar las entradas y salidas en orden consecutivo, con lo que la traducción entre ellas no sería sumar una constante. ¿Cómo la harías?

VIDEO DEL EJERCICIO 18

VIDEO DEL EJERCICIO 18 (versión para el montaje del SIMON)

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int cadenaLeds[]={6,7,8,9};
 int cadenaPuls[]={2,3,4,5};
 int serieLeds[]={0,0,0,0,0,0,0,0,0,0};   //cadena en la que guardamos qué LEDs se van encendiendo
 int seriePuls[]={0,0,0,0,0,0,0,0,0,0};   //cadena en la que guardamos qué  pulsadores se van pulsando
 int npuls=6;                             //número de pulsaciones que se guardan
 int n=0;
 int m=0;                                 //variable que guarda el nº de pulsaciones
 void setup (){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
     pinMode(cadenaPuls[n],INPUT);
   }
 }
 void guardapuls(){                       //Procedimiento que almacena en dos listas los pulsadores que se 
                                          // van pulsando y los LEDs asociados a ellos.
   while(digitalRead(2)==LOW&&digitalRead(3)==LOW&&digitalRead(4)==LOW&&digitalRead(5)==LOW){   //Esperando que se pulse
     delay(100);
   }
   for(n=0;n<4;n++){                      //iteración que revisa los 4 pulsadores
     if(digitalRead(cadenaPuls[n])==HIGH){//si se ha pulsado el que va en la posición n de la cadena que define los 
       digitalWrite(cadenaLeds[n],HIGH);  //PIN de entrada parpadea el LED correspondiente al pulsador
       delay(200);
       digitalWrite(cadenaLeds[n],LOW);   
       seriePuls[m]=cadenaPuls[n];        //guardamos el nº del PIN del pulsador
       serieLeds[m]=seriePuls[m]+4;       //guardamos el nº del PIN del LED asociado al pulsador
       delay(200);                        //un retardo para levantar el dedo
       m=m+1;                             //pasamos a la siguiente posición de las dos listas 
     }                                    //donde estamos guardando las pusaciones y sus LEDs
   }
 }
 void replay(){                           //procedimiento que hace parpadear en secuencia loa LEDs que 
   for(n=0;n<npuls;n++){                  //habíamos guardado en la lista serieLeds en el procedimiento anterior
     digitalWrite(serieLeds[n],HIGH);
     delay(200);
     digitalWrite(serieLeds[n],LOW);
     delay(200);
   }
 }
 void resetea(){
   m=0;
 }
 void loop(){
   guardapuls();
   if(m==npuls){                          //si hemos llegado al límite de pulsaciones
    replay();                                     
    resetea();                            //reiniciamos las variables que se han actualizado y vuelta a emoezar
   }
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.