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 hardware | Novedades 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?.