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