Montaje 6: Reloj de cocina

Requisitos:

  • 4 LEDs, 4 resistencias de 220 ohmios
  • Un pulsador, una resistencia de 1Kohmio.
  • Un potenciómetro (ej.:100K)
  • Un zumbador.

Planteamiento: ¿Te olvidaste de retirar esos huevos cocidos?¿Se han pegado las lentejas?. Necesitas un reloj que te avise.

Al girar el potenciómetro se van encendiendo los LEDs y seleccionando intervalos de 5, 10, 15 y 20 segundos (que representarán los minutos en el caso real). Al presionar el pulsador los LEDs se van apagando según pasan los grupos de 5 segundos y, al terminarse el tiempo, suena una alarma sonora.

El único procedimiento nuevo respecto al ejercicio anterior, sensor de ángulo?, es el que produce los pitidos de la alarma, con una iteración simple.

El programa tiene que distinguir cuándo empieza a descontar el tiempo, y lo hace actualizando el valor de una variable, p, al presionar el pulsador.

Si no se ha pulsado, hace lo mismo que en [GuíaProfesores/U2E19 | sensor de ángulo]], y, cuando sí se ha pulsado, deja de leer la señal de entrada y sólo ejecuta la función muestra(m) con un argumento que decrece de uno en uno una vez que han pasado los 5 segundos.

En cada ciclo comprueba si el tiempo ha terminado, y si es así entra en un bucle cerrado con while en el que suena la alarma.

Variantes:

  • Cambia los tiempos.
  • Haz que los LEDs parpadeen en lugar de quedarse encendidos.
  • Cambia la alarma de pitidos por otra con tonos.

VIDEO DEL MONTAJE 6

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 puls=5;
 int zumb=10;
 int pot=0;                               //nº de la entrada analógica a la que va conectado 
 int n=0;                                 //el potenciómetro 
 int m=0;
 int c=0;
 int p=0;
 int medida=0;                            //variable que guarda la lectura de la señal en la entrada
 int tiempo=200;

 void setup(){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
   }
   pinMode(puls,INPUT);
   pinMode(zumb,OUTPUT);
 }
 void flash(){
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],HIGH);
   }
   delay(tiempo);
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],LOW);
   }
   delay(tiempo);
 }
 void lectura(){                          //procedimiento que acota en 4 tramos la señal de la entrada
   medida=analogRead(pot);
   if(medida<1024/4){
     m=1;
   }
   if((medida>=1024/4)&&(medida<1024/2)){ 
     m=2;
   }
   if((medida>=1024/2)&&(medida<1024*3/4)){
     m=3;
   }
   if(medida>=1024*3/4){
     m=4;
   }
 }
 muestra(int m){                          //procedimiento que enciende y apaga los LEDs 
   for(n=0;n<m;n++){                      //correspondientes a cada tramo
     digitalWrite(cadenaLeds[n],HIGH);
   }
   for(c=4;c>m;c--){
     digitalWrite(cadenaLeds[n],LOW);
   }
 }
 void alarma(){                           //alarma sonora, en grupos de 3 pitidos
   for(n=0;n<3;n++){
     digitalWrite(zumb,HIGH);
     delay(200);
     digitalWrite(zumb,LOW);
     delay(200);
   }
 }
 void loop(){
   if(p==0){                              //si no se ha pulsado el pulsador
     lectura();
     muestra(m);
   }
   if(digitalRead(puls)==HIGH){           //al pulsar:
     delay(500);
     flash();
     p=p+1;                               //queda recogida la pulsación en la variable
   }
   if(p>0){                               //si se ha pulsado
     muestra(m);                          //se encienden y apagan los LEDs correspondeientes
     delay(5000);                         //pasan 5 segundos
     m=m-1;                               //cambiamos al tramo inferior
   }
   while(m==0){                           //Al acabarse el tiempo se repite la alarma sonora
     digitalWrite(cadenaLeds[0],LOW);
     alarma();
   }
 }

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