Étape 3: L’esquisse
L’esquisse peut être changé de sorte que plus les clips audio peuvent être ajoutés, tout simplement continuer avec le même pattern - cas : 35 playcomplete (filename) pause. Vous devrez également modifier le nombre de fichiers répertoriés dans la ligne de randNum, ici il est dit aléatoire (1, 22) ; , ainsi, par exemple, si vous aviez 35 fichiers il faut dire random(1,35);. Les fichiers audio sur la carte SD peuvent être nommés, ce que vous voulez, j’ai juste numérotées, juste n’oubliez pas de remplacer les noms de fichier numéroté par vos propres noms de fichier, est un exemple de cela dans ce sketch il dit - playcomplete ("49.WAV") et que votre fichier est nommé « bob », vous devrez changer le 49 / WAV dans le sketch de dire ("bob. « « « WAV »).
La farce finie est programmée pour que chaque fois il y a mouvement détecté, il lit un fichier audio aléatoire (la mienne étaient tous les sons bruts, après tout, c’est une salle de repos). Comme vous pouvez le voir sur la photo, le dispositif est placé afin qu’il ne peut pas être vu, mais le détecteur de mouvement peut détecter la requête chaque fois que quelqu'un s’approche l’urinoir. J’ai placé quelques bottes avec une paire de pantalons sur eux pour rendre la stalle occupée. Les toilettes, je l’ai utilisé dans a un flux assez constant de personnes, en utilisant le montage de l’aimant et goose neck, il était possible de mettre cela en place en quelques secondes. Ce n’est qu’en milieu d’après-midi, que mes collègues de travail a finalement obtenu suspectes et enquêtés, ils aimaient tellement qu’ils n’a pas révélé la farce et apprécié leur secret nouvellement trouvée pour le reste de la journée.
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include « WaveUtil.h »
#include « WaveHC.h »
Carte de SdReader ; Cet objet conserve les informations de la carte
Vol FatVolume ; Il conserve les informations pour la partition sur la carte
FatReader racine ; Il conserve les informations pour le système de fichiers sur la carte
FatReader f ; Il conserve les informations pour le fichier que nous allons jouer
WaveHC vague ; C’est le seul objet (audio) de la vague, puisque nous allons jouer seulement un à la fois
#define déclencheur 7
#define LED 13
int val = 0 ;
int potvalue = 0 ;
long randNum ;
Cette fonction pratique retournera le nombre d’octets actuellement libres en RAM, grand pour le débogage !
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) ;
}
Return free_memory ;
}
Sub sdErrorCheck(void)
{
Si (! card.errorCode()) retourner ;
putstring ("\n\rSD I/O erreur:") ;
Serial.Print(Card.ErrorCode(), HEX) ;
putstring (",") ;
Serial.println(Card.ErrorData(), HEX) ;
while(1) ;
}
void setup() {}
mettre en place le port série
Serial.Begin(9600) ;
pinMode (déclencheur, entrée) ;
pinMode (LED, sortie) ;
randomSeed(analogRead(0)) ;
putstring ("RAM libre:") ; Ce qui peut aider avec le débogage, manquer de RAM est mauvais
Serial.println(freeRam()) ; s’il s’agit moins de 150 octets Il peut épeler ennuis !
Définissez les broches de sortie pour le contrôle de la DAC. Ce broches sont définis dans la bibliothèque
pinMode (sortie 2) ;
pinMode (3, sortie) ;
pinMode (sortie 4) ;
pinMode (5, sortie) ;
Si (! card.init(true)) {//play avec 4 MHz spi si 8MHz ne fonctionne pas pour vous
Si (! card.init()) {//play avec spi 8 MHz (par défaut plus rapide!)
putstring_nl ("carte init. a échoué!") ; Quelque chose a mal tourné, permet d’imprimer les raisons pour lesquelles
sdErrorCheck() ;
while(1) ; puis « arrêter » - ne rien faire !
}
Enable optimiser la lecture - certaines cartes peuvent timeout. Désactiver si vous rencontrez des problèmes
card.partialBlockRead(true) ;
Maintenant, on va chercher une partition FAT !
uint8_t partie ;
pour (partie = 0; partie < 5; partie ++) {/ / nous avons jusqu'à 5 emplacements de regarder dans
Si (vol.init (carte, partie))
rupture ; Nous avons trouvé un, laisse en liberté sous caution
}
Si (partie == 5) {/ / si nous avons fini ne pas trouver un:(
putstring_nl ("aucun FAT partition valide!") ;
sdErrorCheck() ; Quelque chose a mal tourné, permet d’imprimer les raisons pour lesquelles
while(1) ; puis « arrêter » - ne rien faire !
}
Permet d’indiquer à l’utilisateur sur ce que nous avons trouvé
putstring ("partition à l’aide") ;
Serial.Print (partie, DEC) ;
putstring (", est de type FAT") ;
Serial.println(vol.fatType(),DEC) ; FAT16 ou FAT32 ?
Essayez d’ouvrir le répertoire racine
Si (! root.openRoot(vol)) {}
putstring_nl ("Impossible d’ouvrir le répertoire racine!") ; Quelque chose a mal tourné,
while(1) ; puis « arrêter » - ne rien faire !
}
Ouf ! Nous avons passé les parties difficiles.
putstring_nl("Ready!") ;
/ * TCCR2A = 0 ;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20 ;
TIMER2 débordement Interrupt Enable
TIMSK2 | = 1 << TOIE2 ;
*/
}
void loop()
{
Val = digitalRead(TRIGGER) ;
potvalue = analogRead(1) ;
Serial.println (potvalue, DEC) ;
Si (val == HIGH & & potvalue > = 0 & & potvalue < = 1023)
{
randNum = aléatoire (1, 22) ;
Delay(1000) ;
commutateur (randNum)
{
cas 1 :
Serial.println(1) ;
playcomplete("49.wav") ;
rupture ;
cas 2 :
Serial.println(2) ;
playcomplete("50.wav") ;
rupture ;
cas 3 :
Serial.println(3) ;
playcomplete("51.wav") ;
rupture ;
cas 4 :
Serial.println(4) ;
playcomplete("52.wav") ;
rupture ;
cas no 5 :
Serial.println(5) ;
playcomplete("53.wav") ;
rupture ;
cas 6 :
Serial.println(6) ;
playcomplete("54.wav") ;
rupture ;
cas 7 :
Serial.println(7) ;
playcomplete("55.wav") ;
rupture ;
cas 8 :
Serial.println(8) ;
playcomplete("56.wav") ;
rupture ;
cas 9 :
Serial.println(9) ;
playcomplete("57.wav") ;
rupture ;
cas no 10 :
Serial.println(10) ;
playcomplete("58.wav") ;
rupture ;
cas no 11 :
Si (! f.open (racine, nom)) {}
putstring ("Impossible d’ouvrir le fichier") ; Serial.Print(Name) ; retour ;
}
OK, lire le fichier et le transformer en un objet vague
Si (! wave.create(f)) {}
putstring_nl ("pas un valide" WAV") ; retour ;
}
OK le temps de jouer ! Démarrer la lecture
Wave.Play() ;
}