' Close Encounters of the Curiously Minty Kind ' Eat your heart out Spielberg! ' ' Andy Gadget - 2009 ' ' 12/9 Count 'dormant' loop and change random seed ' Eliminate zero values from random LED flash ' 253 of 256 bytes used! #picaxe 08m 'Tells the editor the target chip #freq m8 'Ups the internal oscillator to 8MHz data 0,(23,25,21,5,144,255) ' main tune data (161,33,207,97,97,97,97,255) ' response 1 data (74,80,72,104,195,255) ' tune 2 data (161,97,97,97,97,97,98,15,33,255)' response 2 data (87,89,21,229,128,255) ' ship joins in data (23,25,21,165,128,255) ' final phrase 'Behaviours: ' Slow pulse on turn-on ' Wait until magnet positioned ' Run main theme ' Run random data until.magnet removed ' Takeoff! ' w6 b13 rnd_h ' w6 b12 rnd_l ' w5 b11 cnt ' w5 b10 tmp1 ' w4 b9 tmp2 ' w4 b8 tmp3 symbol x = output0 'x is LED bank 1 symbol y = output1 'y is LED bank 2 symbol z = output4 'z is LED bank 3 symbol aud = output2 'Audio output symbol sw = pin3 'Reed switch input symbol rnd = w6 '16 bit random number storage symbol rnd_h = b13 'High byte of random number symbol rnd_l = b12 'Low byte of randon number symbol cnt = b11 'Loop counter symbol tmp1= b10 'Scratch variable symbol tmp2 = b9 'Scratch variable symbol tmp3 = b8 'Scratch variable symbol oldval = b5 'Var to test for repeat pattern symbol newval = b4 'Var to test for repeat pattern 'Audio always on output2 low x,y,z main: if sw = 1 then gosub Dormant 'Slow pulse else gosub PlayIt 'Tune sequence gosub RandomData goto Takeoff endif goto main PlayIt: wait 3 for cnt=0 to 41 'Loads data sequentially from beginning of EEPROM read cnt,tmp3 if tmp3 = 255 then 'Value 255 indicates end of current line low x,y,z 'Turn LEDs off wait 3 'Wait before playing next line else gosub RndLed 'Set a random pattern on LEDs tune 0,5,(tmp3) 'Play the note loaded from memory pause 50 '50mS pause endif next cnt wait 3 return RndLed: do random w6 'Use the RANDOM command to gen. 16bit number newval=rnd_h & %00010011 'Mask high byte to correcpond to LED outputs loop until newval <> oldval AND newval <>0 'Loop if value is the same as last time or zero pins = newval oldval=newval return Dormant: servo x,0 'SERVO comand is normally used for driving servo y,0 'RC servos, but I'm using it as PWM source servo z,0 'to pulse LED brightness for tmp1 = 1 to 254 'Loop up to maximum servo position servopos x,tmp1 servopos y,tmp1 servopos z,tmp1 pause 10 next tmp1 tune 0,1,($5b) 'High beep for tmp1 = 254 to 1 step -1 'Loop down to minimum servo position servopos x,tmp1 servopos y,tmp1 servopos z,tmp1 next tmp1 tune 0,1,($60) 'Low beep low x,y,z 'Redefine the LED pins as normal outputs inc w6 'Increment variable to count loops before stimulus applied. return RandomData: do tune 0,1,(rnd_l) 'Play a note using low byte of random number gosub RndLed 'Call the random LED flash routine loop until sw=1 'until the stimulus magnet is removed low x,y,z 'Turn off all LEDs wait 5 'and wait for 5 seconds return TakeOff: for b3 = 1 to 127 'This uses nested loops to give alternating tones b1=b1+1 'and uses the fact that the SOUND command starts off b2=b1+20 'with tones and then changes to modulated noise for cnt=b1 to b2 'at values above 127. high x,y,z sound aud,(cnt,1) next cnt for cnt=b2 to b1 step -1 sound aud,(cnt,1) low x,y,z next cnt next b3 low x,y,z 'Turn everything off wait 60 'and go to sleep for a minute.