Montaje 7: Sirena luminosa de velocidad variable

Requisitos:

  • Un LED, una resistencias de 220 ohmios
  • Un potenciómetro (ej.:100K)
  • Un zumbador piezoeléctrico

Planteamiento: Girando un mando, la sirena cambia de ritmo.

En este caso usamos dos mapas, uno para a duración de los tonos y otro para la intensidad del LED.

La posición del potenciómetro no determina el tiempo del pulso, como en el ejercicio control de tono?, sino el nº de repeticiones, es decir, el tiempo, que está sonando.

Tampoco determina la intensidad del LED, como en el ejercicio control de luz?, sino que los valores de intensidad, como los tiempos de los pulsos los obtenemos a partir de los valores de un contador decreciente, m.

De esta forma, los valores del contador nos dan directamente los tiempos de pulso y su disminución hace el efecto sirena.

Los valores de intensidad del LED se obtienen en una función que traslada linealmente el intervalo de tiempos de pulso (2000 a 1000) a un intervalo de valores de la salida analógica comprendido ente 0 y 250.

El contador sigue decreciendo de 10 en 10 hasta llegar a 1000, momento en que se reinicia a 2000.

Variantes:

  • Haz una sirena de ida y vuelta, con una secuencia ascendente seguida de otra descendente.

VIDEO DEL MONTAJE 7

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 zumb=10;
 int led=9;
 int pot=0;
 //int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
 int n=0;
 int m=2000;              
 int medida=0;                 //variable que guarda el valor de la señal del potenciómetro

 void setup() { 
   pinMode(zumb,OUTPUT);
 } 
 mapatiempo(int medida){      
   return(medida/64);          //los tiempo van entre 0 y 16
 }
 luzled(int m){
   return(250-((m-1000)/4));   //los tonos van entre 1000 y 2000 y las intensidades entre 0 y 250
 }
 void tono(){                  //procedimiento que reproduce una frecuencia 
   digitalWrite(zumb,HIGH);
   delayMicroseconds(m);
   digitalWrite(zumb,LOW);
   delayMicroseconds(m);
 }  
 void loop(){
   medida=analogRead(pot);
   for(n=0;n<mapatiempo(medida);n++){
     analogWrite(led,luzled(m));
     tono();
   }  
   if(m>1000){
     m=m-10;
   }
   else{
     m=2000;
     delay(1000);
   }
 }

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