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 hardwareNovedades 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?.