Estoy haciendo un proyecto donde quiero que cuando un sensor de proximidad detecte un usuario, se encienda un led RGB i se escuche musica a la vez.
El problema esta en que no se como hacer que haga las dos cosas a la vez.
Os pongo el codigo:
Este codigo ejecuta la funcion RGB y hace que el led haga toda la gamma de colores possible.
void ledRGB() {
for (r=0;r<=255;r+=5) {
analogWrite(pinRojo,r);
delay(10);
}
for (b=0;b<=255;b+=5) {
analogWrite(pinAzul,b);
delay(10);
}
for (r=255;r>=0;r-=5) {
analogWrite (pinRojo,r);
delay(10);
}
for (g=0;g<=255;g+=5) {
analogWrite(pinVerde,g);
delay(10);
}
for (b=255;b>=0;b-=5) {
analogWrite (pinAzul,b);
delay(10);
}
for (r=0;r<=255;r+=5) {
analogWrite(pinRojo,r);
delay(10);
}
for (g=255;g>=0;g-=5) {
analogWrite (pinVerde,g);
delay(10);
}
for (r=255;r>=0;r-=5) {
analogWrite (pinRojo,r);
delay(10);
}
}
Y este otro la musica:
void musicaInicial() {
tone (8,31);
delay (2000);
for (i=31;i<4978;i++) {
tone (8,i);
}
for (i=4978;i>31;i--) {
tone (8,i);
}
tone (8,31);
delay (2000);
noTone (8);
}
Y luego en el void loop () pues le pongo :
ledRGB();
musicaInicial()
y como el codigo es sequencial pues me hace primero una y despues la otra.
Un único procesador no puede hacer "dos cosas al mismo tiempo", lo que si es posible es dividir las tareas en trozos pequeños y ejecutar un trozo de cada tarea de forma secuencial. De esta forma parece que hace dos cosas al mismo tiempo.
Ahora bien, como dice Chiva tienes un delay tremendo delay(2000); durante el cual el procesador está esperando durante dos segundos sin hacer otra cosa más que contar el tiempo.
La solución más sencilla (si, ya sé que es una chapuza) sería llamar a la función ledRGB() en vez de delay(2000); ya que según está la función ledRGB() puede tardar unos 1600 ms en ejecutarse.
problema solucionado. He mezclado las dos funciones entre si, y he aprovechado la funcion tone que emite un sonido permanentemente par que parezca que la musica y la luz van al mismo tiempo. Un poco chapuzero pero funciona.
void ledRGBmusica() {
tone (pinAltavoz,33);
analogWrite (pinRojo,255);
for (b=0;b<=255;b+=5) {
analogWrite(pinAzul,b);
delay(t);
}
for (i=33;i<522;i++) {
tone (pinAltavoz,i);
}
for (v=255;v>=0;v-=5) {
analogWrite (pinRojo,v);
delay(t);
}
for (i=523;i<2092;i++) {
tone (pinAltavoz,i);
}
for (g=0;g<=255;g+=5) {
analogWrite(pinVerde,g);
delay(t);
}
for (i=2093;i<4978;i++) {
tone (pinAltavoz,i);
}
for (b=255;b>=0;b-=5) {
analogWrite (pinAzul,b);
delay(t);
}
for (i=4978;i>2092;i--) {
tone (pinAltavoz,i);
}
for (v=0;v<=255;v+=5) {
analogWrite(pinRojo,v);
delay(t);
}
for (i=2093;i>524;i--) {
tone (pinAltavoz,i);
}
for (g=255;g>=0;g-=5) {
analogWrite (pinVerde,g);
delay(t);
}
for (i=523;i>33;i--) {
tone (pinAltavoz,i);
}
noTone (pinAltavoz);
}