Paso 3: El bosquejo
El bosquejo puede ser cambiada de modo que pueden agregar clips de audio más, continuar con el mismo patrón - caso: rotura de playcomplete (filename) 35. Usted también tendrá que cambiar el número de archivos que aparecen en la línea randNum, aquí dice al azar (1, 22); , por ejemplo si tuvieras 35 archivos debe decir random(1,35);. Los archivos de audio en la tarjeta SD pueden ser nombrados lo que quieras, yo sólo numeradas, asegúrese de reemplazar los nombres de archivo numerados con su propio nombre, es un ejemplo de ello en este bosquejo dice - playcomplete ("49.WAV") y decir tu archivo se llama "bob", tendría que modificar el 49. WAV en el bosquejo al decir ("bob. WAV").
La broma final está programado para que cualquier momento es el movimiento percibido, reproduce un archivo audio al azar (mina fueron todos los sonidos brutos, es un baño después de todo). Como se puede ver en la foto el aparato se coloca de modo que no puede verse pero el detector de movimiento puede detectar movimiento en cualquier momento alguien acerca al urinario. He puesto unas botas con un par de pantalones sobre ellos para hacer la parada mirada ocupada. El baño lo utilizado en tiene un caudal bastante constante de personas, mediante el montaje de imán y ganso cuello era posible poner esto en marcha en cuestión de segundos. No fue hasta media tarde que mis compañeros de trabajo consiguieron finalmente sospechosos y de investigar, les encantó tanto que no revelan la broma y disfrutar de su nuevo secreto para el resto del día.
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
Tarjeta SdReader; Este objeto contiene la información de la tarjeta
FatVolume vol; Contiene la información de la partición en la tarjeta
FatReader raíz; Esto contiene la información para el sistema de archivos en la tarjeta
FatReader f; Esto contiene la información del archivo estamos jugamos
Ola WaveHC; Este es el único objeto (audio) de la onda, puesto que sólo jugaremos uno a la vez
#define gatillo 7
#define LED 13
int val = 0;
int potvalue = 0;
randNum largo;
Esta práctica función devolverá el número de bytes actualmente libres en RAM, ideal para depuración!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Si ((int) __brkval == 0) {}
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
Else {}
free_memory = ((int) & free_memory)-((int) __brkval);
}
volver free_memory;
}
void sdErrorCheck(void)
{
Si (! card.errorCode()) retorno;
putstring ("\n\rSD I/O error:");
Serial.Print(Card.ErrorCode(), hexagonal);
putstring (",");
Serial.println(Card.errorData(), hexagonal);
while(1);
}
void setup() {}
Configurar puerto serie
Serial.Begin(9600);
pinMode (gatillo, entrada);
pinMode (LED, salida);
randomSeed(analogRead(0));
putstring ("memoria RAM libre:"); Esto puede ayudar con la depuración, es malo quedarse sin RAM
Serial.println(freeRam()); Si es menor de 150 bytes escribe con problemas!
Configurar los pines de salida para el control de la DAC. Este los pernos se definen en la biblioteca
pinMode (2, salida);
pinMode (3, salida);
pinMode (4, salida);
pinMode (5, salida);
Si (! card.init(true)) {//play con spi de 4 MHz si 8MHz no funciona para usted
Si (! card.init()) {//play con spi de 8 MHz (por defecto más rápido!)
putstring_nl ("tarjeta init. no se pudo!"); Algo salió mal, permite imprimir por qué
sdErrorCheck();
while(1); entonces 'detener': ¡ no!
}
permiten optimizar la lectura - algunas tarjetas pueden tiempo de espera. Desactivar si tienes problemas
card.partialBlockRead(true);
Ahora buscaremos una partición FAT!
parte de uint8_t;
para (parte = 0; parte < 5; parte ++) {/ / tenemos hasta 5 ranuras en
Si (vol.init (tarjeta, parte))
rotura; encontró uno, permite la libertad bajo fianza
}
Si (parte == 5) {/ / si terminamos por no encontrar uno :(
putstring_nl ("No válida partición FAT!");
sdErrorCheck(); Algo salió mal, permite imprimir por qué
while(1); entonces 'detener': ¡ no!
}
Permite decir que el usuario lo que encontramos
putstring ("partición de uso");
Serial.Print (parte, DEC);
putstring (", el tipo es grasa");
Serial.println(Vol.fatType(),DEC); ¿FAT16 o FAT32?
Intente abrir el directorio raíz
Si (! {root.openRoot(vol))}
putstring_nl ("no se puede abrir raíz dir!"); Algo salió mal,
while(1); entonces 'detener': ¡ no!
}
¡ UF! Llegamos pasado las partes difíciles.
putstring_nl("Ready!");
/ * TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;
Permiten interrumpir el desbordamiento del TIMER2
TIMSK2 | = 1 << TOIE2;
*/
}
void loop()
{
Val = digitalRead(TRIGGER);
potvalue = analogRead(1);
Serial.println (potvalue, DEC);
Si (val == alto & & potvalue > = 0 & & potvalue < = 1023)
{
randNum = al azar (1, 22);
Delay(1000);
interruptor (randNum)
{
caso 1:
Serial.println(1);
playcomplete("49.wav");
rotura;
caso 2:
Serial.println(2);
playcomplete("50.wav");
rotura;
caso 3:
Serial.println(3);
playcomplete("51.wav");
rotura;
caso 4:
Serial.println(4);
playcomplete("52.wav");
rotura;
caso 5:
Serial.println(5);
playcomplete("53.wav");
rotura;
caso 6:
Serial.println(6);
playcomplete("54.wav");
rotura;
caso 7:
Serial.println(7);
playcomplete("55.wav");
rotura;
caso 8:
Serial.println(8);
playcomplete("56.wav");
rotura;
caso 9:
Serial.println(9);
playcomplete("57.wav");
rotura;
caso 10:
Serial.println(10);
playcomplete("58.wav");
rotura;
caso 11:
Serial.println(11);
playcomplete("59.wav");
rotura;
caso 12:
Serial.println(12);
playcomplete("60.wav");
rotura;
caso 13:
Serial.println(13);
playcomplete("61.wav");
rotura;
caso 14:
Serial.println(14);
playcomplete("62.wav");
rotura;
caso 15:
Serial.println(15);
playcomplete("63.wav");
rotura;
caso 16:
Serial.println(16);
playcomplete("64.wav");
rotura;
caso 17:
Serial.println(17);
playcomplete("65.wav");
rotura;
caso 18:
Serial.println(18);
playcomplete("66.wav");
rotura;
caso 19:
Serial.println(19);
playcomplete("67.wav");
rotura;
caso 20:
Serial.println(20);
playcomplete("68.wav");
rotura;
caso 21:
Serial.println(21);
playcomplete("69.wav");
rotura;
caso 22:
Serial.println(22);
playcomplete("70.wav");
rotura;
por defecto:
rotura;
}
}
}
Reproduce un archivo completo de principio a fin sin pausa.
void playcomplete(char *name) {}
llamar a nuestro ayudante para buscar y reproducir este nombre
playfile(Name);
mientras (wave.isplaying) {}
no hacer nada durante la reproducción de su
}
su hecho reproduciendo
}
void playfile(char *name) {}
ver si el objeto ola está haciendo algo
Si (wave.isplaying) {/ / así que ya está reproduciendo algo, stop!
Wave.STOP(); Basta
}
Buscar en el directorio raíz y abre el archivo
Si (! f.open (raíz, nombre)) {}
putstring ("no puede abrir archivo"); Serial.Print(Name); retorno;
}
Leer bien el archivo y convertirlo en un objeto de onda
Si (! {wave.create(f))}
putstring_nl ("no un válido WAV"); retorno;
}
OK el tiempo para jugar! iniciar la reproducción
Wave.Play();
}