Arduino Fart-o-matic toalett humor skämt (3 / 3 steg)
Steg 3: Skiss
Skissen kan ändras så att mer ljudklipp kan läggas, bara fortsätta med samma mönster - fallet: 35 playcomplete (filnamn) paus. Du måste också ändra antalet filer i randNum linjen, här står slumpmässiga (1, 22); , så till exempel om du hade 35 filer bör det stå random(1,35);. Ljudfiler på SD-kortet kan namnges vad du vill, jag bara räknade dem, Tänk bara på att ersätta de numrerade filnamn med egna namn på filen, ett exempel på detta är i denna skiss står det - playcomplete ("49.WAV") och säga din filen heter "bob", skulle du behöva ändra 49. WAV i skissen att säga ("bob. WAV").
Den färdiga tilltag är programmerad så att varje gång det finns rörelse kände, det spelar en random ljudfilen (min var alla brutto ljud, det är en toalett trots allt). Som ni kan se på bilden är enheten placerad så att den inte kan ses men rörelsedetektorn kan känna rörelse när som helst någon närmar sig pissoaren. Jag placerade några stövlar med ett par byxor över dem för att göra ståndet ser ockuperade. Jag använde den i toaletten har en ganska jämn ström av människor, med hjälp av magnet fäste och gås hals var det möjligt att sätta detta på plats i några sekunder. Det var inte förrän på eftermiddagen att mina medarbetare fick äntligen misstänkta och undersökta, de älskade det så mycket att de inte avslöja upptågen och njöt av deras nyfunna hemlighet för resten av dagen.
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
#define TRIGGER 7
#define LED 13
int val = 0;
int potvalue = 0;
lång randNum;
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
}
void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
void setup() {
Ställ in serieporten
Serial.BEGIN(9600);
pinMode (TRIGGER, indata);
pinMode (LED, OUTPUT);
randomSeed(analogRead(0));
putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(freeRam()); om detta är under 150 byte kan det stava problem!
Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}
Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true);
Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}
Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32?
Försök öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}
Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");
/ * TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;
Timer2 spill Interrupt Enable
TIMSK2 | = 1 << TOIE2;
*/
}
void loop()
{
Val = digitalRead(TRIGGER);
potvalue = analogRead(1);
Serial.println (potvalue, DEC);
om (val == hög & & potvalue > = 0 & & potvalue < = 1023)
{
randNum = random (1, 22);
Delay(1000);
växel (randNum)
{
fall 1:
Serial.println(1);
playcomplete("49.wav");
bryta;
fall 2:
Serial.println(2);
playcomplete("50.wav");
bryta;
fall 3:
Serial.println(3);
playcomplete("51.wav");
bryta;
fall 4:
Serial.println(4);
playcomplete("52.wav");
bryta;
fall 5:
Serial.println(5);
playcomplete("53.wav");
bryta;
fall 6:
Serial.println(6);
playcomplete("54.wav");
bryta;
fall 7:
Serial.println(7);
playcomplete("55.wav");
bryta;
mål 8:
Serial.println(8);
playcomplete("56.wav");
bryta;
mål 9:
Serial.println(9);
playcomplete("57.wav");
bryta;
mål 10:
Serial.println(10);
playcomplete("58.wav");
bryta;
mål 11:
Serial.println(11);
playcomplete("59.wav");
bryta;
ärende 12:
Serial.println(12);
playcomplete("60.wav");
bryta;
ärende 13:
Serial.println(13);
playcomplete("61.wav");
bryta;
fall 14:
Serial.println(14);
playcomplete("62.wav");
bryta;
mål 15:
Serial.println(15);
playcomplete("63.wav");
bryta;
fall 16:
Serial.println(16);
playcomplete("64.wav");
bryta;
fall 17:
Serial.println(17);
playcomplete("65.wav");
bryta;
fall 18:
Serial.println(18);
playcomplete("66.wav");
bryta;
fall 19:
Serial.println(19);
playcomplete("67.wav");
bryta;
mål 20:
Serial.println(20);
playcomplete("68.wav");
bryta;
mål 21:
Serial.println(21);
playcomplete("69.wav");
bryta;
fall 22:
Serial.println(22);
playcomplete("70.wav");
bryta;
standard:
bryta;
}
}
}
Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
}
void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();
}