miércoles, 3 de febrero de 2010

LED (RGB) sensor luz, timbre y botón.

En este pequeño programa vamos a utilizar un sensor de luz, cuando este no reciba la suficiente luz hará que suene el timbre. El color del LED tricolor lo controlaremos con un botón que irá cambiando los colores en cada pulsación hasta que se apague.
Durante los primeros 5 segundos calibramos el sensor de luz.

El circuito lo implementaremos de la siguiente manera:

+ Lado positivo sensor de luz a +5V
+ Lado positivo sensor de luz al pin 0 (analógico)
- Lado negativo sensor de luz a ground

+ 1º pin LED al pin 11 (digital)
- 2º pin LED al pin a ground
+ 3º pin LED al pin 10 (digital)
+ 4º pin LED al pin 9 (digital)

+ Lado positivo altavoz al pin 5 (digital)
- Lado negativo altavoz a ground

+ Lado positivo botón a +5V.
+ Lado positivo botón al pin 3 (digital)
- Lado negativo botón a ground






int rojo=11;
int verde=10;
int azul=9;

int pulsador=3;
int contadorPulsador=0;
int last_timePulsador=0;
int estadoPulsador=0;

int altavoz=5;//Pin del altavoz
int length=15; //Numero de notas
char notes[]="abcffeabffccaba";//Notas
int beats[]= {1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1};//Duracion de cada nota
int intervalo=200;//Intervalo de duracion de cada nota (argumento de la duncion PlayNote

int sensorLuz=0;
int valorLuz=0;
int sensorMax=0;
int sensorMin=1000;

int i=0;

void playTone(int tone, int duration)
{
for (long i = 0; i {
digitalWrite(altavoz, HIGH);
delayMicroseconds(tone);
digitalWrite(altavoz, LOW);
delayMicroseconds(tone);
}
}

void playNote(char note, int duration)
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
for (int i=0; i<8; i++)
{
if (names[i]==note)
{
playTone(tones[i], duration);//Toca la nota correspondiente a las notas introducidas en la declaracion del array notes[]
}
}
}

void setup()
{
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(sensorLuz, INPUT);
pinMode(pulsador, INPUT);
pinMode(altavoz, OUTPUT);
digitalWrite(13, HIGH);//Durante los 5 primeros segundos encendemos el LED de la placa mientras hace operaciones
while(millis()<5000)//Da valores maximos y minimos a al sensor de luz
{
valorLuz=analogRead(sensorLuz);
if(valorLuz>sensorMax)
{
sensorMax=valorLuz;
}
if (valorLuz {
sensorMin=valorLuz;
}
}
digitalWrite(13, LOW);//Apagamos el LED de la placa
}

void loop()
{
estadoPulsador=digitalRead(pulsador);
if(estadoPulsador!=last_timePulsador)
{
if(estadoPulsador==HIGH)
{
contadorPulsador++;
}
last_timePulsador=estadoPulsador;
}
if(contadorPulsador%4==1)
{
analogWrite(rojo, 25);
analogWrite(verde, 0);
analogWrite(azul, 0);
}
if(contadorPulsador%4==2)
{
analogWrite(rojo, 0);
analogWrite(verde, 25);
analogWrite(azul, 0);
}
if(contadorPulsador%4==3)
{
analogWrite(rojo, 0);
analogWrite(verde, 0);
analogWrite(azul, 25);
}
if(contadorPulsador%4==0)
{
analogWrite(rojo, 0);
analogWrite(verde, 0);
analogWrite(azul, 0);
}

valorLuz=analogRead(sensorLuz);
valorLuz=map(valorLuz, sensorMin, sensorMax, 0, 255);//Se mapea la señal del sensor de Luz, se le da los valores maximos y minimos y el rango
valorLuz=constrain(valorLuz, 0, 255);//Limitamos el valor al rango que queremos 0-255
if(valorLuz>123)
{
for(i=0; i {
playNote(notes[i], intervalo);
}
}
}

No hay comentarios:

Publicar un comentario