Ejercicio 9: ¡Para ese despertador!
El zumbador suena en grupos de 3 pitidos. Si se presiona el pulsador calla durante un tiempo y vuelve a empezar con los pitidos en una sucesión más rápida. Tras pararlo 3 veces ya calla para siempre.
| Novedades hardware | Novedades software |
| | Uso de una variable como contador |
| | While para bloquear |
Requisitos: Un pulsador, una resistencia de 1Kohmio.
Planteamiento: Reproducimos uno de esos despertadores que no se contentan con chafarnos el sueño sino que cuando los apagamos insisten al rato cada vez más apremiantes. Éste lo tendremos que parar hasta 3 veces para que nos deje en paz.
Presentación de:
- Uso de una variable como contador
- Bucle implementado por la instrucción while.
- Cómo usar este bucle con una condición cumplida que no cambia para bloquear un programa.
En este ejercicio aparecen dos elementos nuevos:
- La variable m que usamos para llevar la cuenta de las veces que se activa la entrada digital.
Sólo hay que situar su actualización (que consiste en sumarle 1) dentro del condicional que comprueba si está presionado el pulsador.
- El bucle con la instrucción while.
Este bucle funciona repitiendo en ciclos el código que vaya entre sus llaves mientras se cumpla la condición que va entre sus paréntesis.
En este caso la condición no se cumple hasta que m llega a tomar el valor 3 y cuando lo toma se inicia el bucle while con lo que se ejecuta lo que hay dentro, o sea, como no hemos escrito ningún código: nada.
Como dentro del bucle while no se actualiza la variable m, ésta sigue valiendo 3, la condición del bucle se cumple y este sigue ejecutándose: tenemos bloqueado el programa. Seguirá dando vueltas en un bucle vacío.
Variaciones:
- Cambiando los valores de las variables que declaramos al inicio puedes cambiar el tiempo que tarda en empezar a sonar, la longitud de los pitidos, la pausa entre alarmas y el nº de veces que hay que pararlo.
- Si pones alarma(); dentro del bucle while oirás cómo tras pararlo 3 veces se pone a sonar sin parar.
- Cambia de orden los procedimientos bloquea( ) y alarma( ) en void loop( ). ¿Qué pasa? ¿Por qué?
VIDEO DEL EJERCICIO 9
VIDEO DEL EJERCICIO 9 (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 puls=5;
int zumb=10;
int n=0;
int m=0; //variable que usamos para contar las veces que se pulsa
int tiempo=200; //marca la duración inicial de los pitidos
int pausa=1000; //tiempo que pasa hasta que suena la alarma por primera vez
int espera=5000;
void setup(){
pinMode(puls,INPUT);
pinMode(zumb,OUTPUT);
}
void alarma(){ //produce los 3 pitidos
for(n=0;n<3;n++){
digitalWrite(zumb,HIGH);
delay(tiempo);
digitalWrite(zumb,LOW);
delay(tiempo);
}
}
void para(){ //tiempo de silencio entre alarmas consecutivas
digitalWrite(zumb,LOW);
delay(espera);
}
void bloquea(){ //mintras el valor de la variable sea 3 no hace nada
while(m==3){
}
}
void loop(){
delay(pausa); //tiempo hasta qu empieza a sonar la alarma
if(digitalRead(puls)==HIGH){ //si se presiona el pulsador
m=m+1; //llevamos la cuenta de las veces que se ha pulsado contando una más
tiempo=tiempo-50; //disminuye la longitud de los pitidos
para(); //para de sonar el toempo entre alarmas seguidas
}
bloquea(); //comprueba si se ha pulsado 3 veces para bloquear
alarma(); //suena
}
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?.