' {$STAMP BS1} ' {$PBASIC 1.0} ' Mausoleum Prop ' -Chris Bartram www.creepynights.org ' ' Wait for motion detector ' Pause 4 seconds till victim gets closer ' Trigger sounds ' Pause (random) seconds ' Start random solenoid door-banging (for 20 seconds) ' Reset ' ' -----[ I/O Definitions ]------------------------------------------- SYMBOL PIR=PIN7 ' P7 = Infrared sensor SYMBOL PUSHER=1 ' Out1 = Box Pusher cylinder ' white wire to V+, black to Out1 terminal SYMBOL uMP3=3 ' uMP3 sound board on position 3 SYMBOL Baud = OT2400 SYMBOL COUNTER=W4 SYMBOL TriggerDelay=0 ' delay between motion detected and start SYMBOL IdleTime=20000 ' delay between reactivations SYMBOL lottery = W0 ' random number SYMBOL tix = W1 ' timer SYMBOL shakeTime = W2 ' time for shaking SYMBOL shakeAcc = W3 ' shake accumulator ' -----[ Initialization ]-------------------------------------------- SEROUT uMP3, Baud, ("PC F /SOUNDS/LETMEOUT.MP3", 13) DEBUG CLS ' Clear DEBUG Screen FOR counter = 40 TO 0 STEP -1 ' Wait 40 Seconds For PIR Warm-Up DEBUG "IR Ready in:", counter 'print how much time left PAUSE 1000 ' Display Counter Every Second DEBUG CLS ' Clear DEBUG Screen NEXT lottery = 1031 ' seed random generator counter = 0 ' Clear Counter Variable DEBUG "WAITING... " ' Display Waiting Message ' -----[ Program Code ]----------------------------------------- WaitForMotion: RANDOM lottery ' toss random generator LOW PUSHER PAUSE 25 counter = counter + PIR*PIR IF counter<20 THEN WaitForMotion ' Motion Detected? DEBUG "TRIPPED..." counter =0 PropSequence: ' motion detected, wait 'triggerdelay' seconds before turning head PAUSE triggerdelay DEBUG "Sounds!" SEROUT uMP3, Baud, ("PC F /SOUNDS/LETMEOUT.MP3", 13) DEBUG "Start banging" Pre_Shake_Delay: tix = lottery // 31 + 20 ' delay 2 to 5 seconds GOSUB Run_Timer shakeTime = lottery // 200 + 10 ' shake 1 to 20 secs shakeAcc = 0 ' clear accumulator Shake_Crate: RANDOM lottery ' toss random generator TOGGLE PUSHER ' toggle cylinder control DEBUG "crate Toggle", CR tix = lottery // 5 + 1 ' piston move, 0.1 to 1.5 secs shakeAcc = shakeAcc + tix ' update accumulator GOSUB Run_Timer IF shakeAcc < shakeTime THEN Shake_Crate ' done shaking? DEBUG "Stop banging" LOW PUSHER PAUSE idletime DEBUG "Resetting" GOTO WaitForMotion ' -----[ Subroutines ]----------------------------------------------------- ' Pass timing units (0.1 sec) in "tix" ' -- "tix" is destroyed by routine Run_Timer: IF tix = 0 THEN Timer_Exit ' expired? PAUSE 100 ' no, pause tix = tix - 1 ' and decrement GOTO Run_Timer ' test again Timer_Exit: RETURN