Proyecto con Arduino: juntando sonido y luces en un solo programa

Ya he hecho el programa para las luces, y el programa para el audio, así que solo queda juntarlos.

El circuito es simplemente el de audio y el de las luces juntos:

Como veis en el diagrama, he cambiado los pines del circuito definitivo porque necesitaba libres los puertos analógicos, pero el código no es más que la última versión de las luces con las instrucciones de audio incrustadas en el bucle de ejecución:


#include <sd_l0.h>
#include <sd_l1.h>
#include <sd_l2.h>
#include <SimpleSDAudio.h>
#include <SimpleSDAudioDefs.h>

int boton = 2;
int redPin = 3;
int greenPin = 5;
int bluePin = 6;


long tiempo_anterior;
long diferencia;
bool flagLuces = false;


void setup() {
Serial.begin(9600);

pinMode(boton, INPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

attachInterrupt(digitalPinToInterrupt(boton), botonLuces, FALLING);
Serial.print("\nInitializing SD card...");
if (!SdPlay.init(SSDA_MODE_FULLRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER)) {
Serial.println(F("initialization failed."));
Serial.print(F("Error code: "));
Serial.println(SdPlay.getLastError());
while(1);
} else {
Serial.println(F("Wiring is correct and a card is present."));
}
Serial.print(F("Looking for on.wav... "));
if(!SdPlay.setFile("ALARMA.WAV")) {
Serial.println(F(" not found on card! Error code: "));
Serial.println(SdPlay.getLastError());
while(1);
} else {
Serial.println(F("found."));
}
}
void loop() {
if(flagLuces){
flagLuces = false;
cambiaEstadoLED();
}
}

void botonLuces(){
diferencia = millis() - tiempo_anterior;
tiempo_anterior = millis();
if(diferencia > 500){
flagLuces = true;
}
}

void cambiaEstadoLED(){
SdPlay.play();
if(digitalRead(greenPin) == false){
encender();
Serial.println("encendido");
} else{
apagar();
Serial.println("apagado");
}
}

void encender(){
for (int brillo = 0; brillo <= 122; brillo++) {
setColor(0, brillo, brillo); // es esta combinación porque queremos el color aqua
delay(30);
}
for(int brillo = 123; brillo <= 255; brillo++) {
setColor(0, brillo, brillo);
delay(5);
}
}

void apagar(){
for (int brillo = 255; brillo >= 0; brillo--) {
setColor(0, brillo, brillo); // es esta combinación porque queremos el color aqua
delay(10);
}
}

void setColor(int red, int green,int blue){
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}

Sobre el código:

Muy poquito que decir aquí que no haya dicho ya, la verdad. He incrustado la instrucción SdPlay.play() al principio de cada interrupción para que suene mientras se encienden y apagan los LEDs, pero se puede colocar dentro del bucle cuando ya estén a medias, o solo cuando se enciendan (o solo cuando se apaguen).

Sigo manteniendo los Serial.println porque aunque no servirán de nada en el montaje final, para ir afinando con los tiempos de encendido y apagado viene muy bien.

 

[No he logrado quitar el pitido que suena – no durante la reproducción de la música sino durante el encendido y apagado de los LEDs -, tendré que investigar qué sucede ahí. O igual lo dejo así porque cuando cambie el audio puede que no se note demasiado.]

 

************************************************************

Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.