Ejercicio 8: Para la ruleta y gana
Mientras gira la ruleta luminosa, si se presiona el pulsador cuando está encendido el LED verde, suena un pitido y aumenta la velocidad. Si se acierta varias veces, vuelve a empezar.
| Novedades hardware | Novedades software |
| | Condicional if/else |
| | Condicionales anidados |
Requisitos:
- Cinco diodos luminosos LED, cuatro resistencias de 220 ohmios. * Un pulsador, una resistencia de 1Kohmio.
Planteamiento: Vamos a hacer el primer juego. Es un juego de habilidad en el que hay que parar la ruleta luminosa con el pulsador cuando esté encendida la luz verde. Cuando presionamos el pulsador, la luz que esté encendida permanece así un tiempo y si es la verde, tras sonar un pitido, la ruleta continúa a más velocidad. Cuando la velocidad es ya excesiva, vuelve a empezar al ritmo del comienzo.
Presentación de:
- Estructuras condicionales con if/else.
- Anidamiento de estructuras condicionales o una forma de hacer que se cumplan varias condiciones a la vez.
- Reset por software.
En este ejercicio insertamos en medio del código del ejercicio de la ruleta luminosa? un procedimiento llamado compruebacierto( ) que contiene dos condicionales anidados.
Vamos a ver la anidación de los condicionales:
Tenemos el primero, el más externo, que es el del ejercicio dispara el flash?, y detecta si está presionado el pulsador.
El segundo, el interno, está dentro de las llaves del primero y detectará si el LED que está encendido es el que está conectado al PIN 7, (el 2º en la cadena).
Al estar el segundo dentro del primero, sólo se ejecuta si se cumple la condición del primero, es decir, sólo comprueba si el LED encendido es el 2 cuando está presionado el pulsador y no lo comprueba si el pulsador no está presionado.
Vamos a ver más de cerca este segundo condicional:
Tiene dos partes:
if(n= =1){
………
………
}
y :
else{
…………
…………
}
La primera parte es como la del ejercicio interruptor del intermitente? y el código que va entre llaves se ejecutará si efectivamente la variable n tiene el valor 1.
La segunda parte guarda entre llaves el código que se ejecutará si la condición no se cumple, es decir, si la variable n tiene un valor distinto de 1.
Como vemos, se ha producido una bifurcación en el desarrollo del código y hay una parte que se ejecuta en un caso y otra que lo hace en los demás.
Finalmente, cuando el tiempo que está parpadeando cada LED va a hacerse 0, devolvemos la variable tiempo a su valor inicial, para que vuelva todo a empezar.
Variaciones:
- Leyendo el código, ¿sabrías cómo hacer trampa?, sin modificar el programa, claro.
VIDEO DEL EJERCICIO 8
VIDEO DEL EJERCICIO 8 (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 zumb=10;
int puls=5;
int tiempo=160; //marca el ritmo inicial
int n=0;
void setup (){
for(n=0;n<4;n++){
pinMode(cadenaLeds[n],OUTPUT);
}
pinMode(puls,INPUT);
pinMode(zumb,OUTPUT);
}
void compruebacierto(){ //procedimiento para comprobar que se cumplen las 2 condiciones:
if(digitalRead(puls)==HIGH){ //que está presionado el pulsador y que está encendido el LED correcto
if(n==1){ //n==1, nº del PIN al que conectamos el LED verde
digitalWrite(zumb,HIGH); // si se cumplen el zumbador pita
delay(1000);
digitalWrite(zumb,LOW);
tiempo=tiempo-10; //y el ritmo aumenta al disminuir el tiempo de parpadeo
}
else{ //si no se cumple la segunda, es decir si se presiona el pulsador
digitalWrite(cadenaLeds[n], HIGH);//pero está encendido otro LED el LED se queda encendido 1 segundo.
delay(1000);
}
}
}
void loop(){
for(n=0;n<4;n++){
digitalWrite(cadenaLeds[n], HIGH);
delay(tiempo);
compruebacierto();
digitalWrite(cadenaLeds[n],LOW);
delay(tiempo);
if(tiempo<=10){ //si va a ir demasiado rápido, que vuelva al ritmo del comienzo
tiempo=160;
}
}
}
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?.