//twitchie v0.5 #define servoPinA 2 // Control pin for servo motor #define servoPinB 3 // Control pin for servo motor #define servoPinC 4 // Control pin for servo motor #define servoPinD 5 // Control pin for servo motor #define servoPinE 6 // Control pin for servo motor #define servoPinF 7 // Control pin for servo motor #define servoPinG 8 // Control pin for servo motor #define servoPinH 9 // Control pin for servo motor #define Led 10 // activity light #define touchsensor 11 // activity light #define minangle 550 // Minimum servo position #define maxangle 2400 // Maximum servo position #define trigger 0 // the analog pin that the sensor's on #define AWAKEN 100 #define SLEEPY 100 int uncleA[5] = {500, 1200, 2300, 1500, 3000}; int uncleB[5] = {500, 1200, 2600, 1500, 1200}; int uncleC[5] = {3000,1200, 300, 1500, 3000}; int uncleD[5] = {3000,1200, 600, 1500, 1700}; int uncleE[5] = {3000,1200, 600, 1500, 3000}; int uncleF[5] = {3000,1200, 600, 1500, 1700}; int uncleG[5] = {500, 1200, 3200, 1800, 3000}; int uncleH[5] = {500, 1200, 3600, 1300, 3000}; char uncleindex = 0; char recenttouch= 0; char SEEDS[256] __attribute__((progmem)) = {208,75,137,110,218,247,165,23,248,216,204,59,118,35,193,29,83,158,93,57,224,194,3,207,205,149,203,22,129,171,10, 142,251,99,249,244,144,16,17,238,37,197,111,151,4,192,104,7,95,150,67,101,69,15,132,186,87,156,206,27,166,20,182, 163,92,198,119,213,180,61,152,39,185,19,58,45,33,64,24,160,40,222,172,131,227,221,105,108,177,183,73,43,157,12,199, 113,9,245,126,130,106,120,210,215,31,167,246,76,139,195,239,50,229,169,55,122,212,30,112,6,85,141,82,236,21,32,89, 219,173,188,127,74,214,187,190,176,62,123,189,121,184,148,225,34,1,196,28,49,46,79,77,54,117,240,175,242,140,231, 13,128,25,97,146,228,179,116,70,53,178,18,254,78,109,155,241,233,81,255,159,202,102,2,174,14,147,234,60,8,84,52,98, 100,230,145,211,125,11,181,164,26,90,134,161,36,71,223,143,232,136,63,68,51,96,243,66,65,235,47,154,237,252,72,209, 114,138,115,86,250,5,94,133,42,44,88,226,103,253,124,168,91,48,217,56,80,135,220,107,191,201,162,153,38,170,41,200,0}; ///////////////////////////////////////////////////////////////// void setup() { pinMode(servoPinA, OUTPUT); // Set servo pin as an output pin pinMode(servoPinB, OUTPUT); // Set servo pin as an output pin pinMode(servoPinC, OUTPUT); // Set servo pin as an output pin pinMode(servoPinD, OUTPUT); // Set servo pin as an output pin pinMode(servoPinE, OUTPUT); // Set servo pin as an output pin pinMode(servoPinF, OUTPUT); // Set servo pin as an output pin pinMode(servoPinG, OUTPUT); // Set servo pin as an output pin pinMode(servoPinH, OUTPUT); // Set servo pin as an output pin pinMode(Led, OUTPUT); pinMode(touchsensor, INPUT); // touch sensor on one of the extra pins Serial.begin(9600); ledflash(3,200); Serial.println("I... am... ALIIIIVE!!!!!"); // purr(1,20,1); } ///////////////////////////////////////////////////////////////// void loop() { analogWrite(Led,random(1,200)); randomSeed(millis()); // if(analogRead(trigger)>AWAKEN){ // Serial.println("WAKEY!!!"); // } ooze(2,10,25); ooze(3,1,5); ooze(5,3,13); // if(analogRead(trigger)0;number--){ delay(duration/2); digitalWrite(Led, HIGH); // sets the LED on delay(duration/2); // waits for a second digitalWrite(Led, LOW); // sets the LED off } } ////////////////////////////////////////////////////////////// void servo(char pin, int angle){ // protect the servos from pulses that move them too far if(angle>maxangle){angle=maxangle;} if(angle0; quantity--){ flag=0; for(c=0;c<8;c++){ rtarget[c] = random(minangle,maxangle);} Serial.println("load r targets"); gosize=stepsize; goslowness=slowness; while(flag==0){ for ( c=goslowness; c>0; c--){ servo('a',rhold[0]); servo('b',rhold[1]); servo('c',rhold[2]); servo('d',rhold[3]); servo('e',rhold[4]); servo('f',rhold[5]); servo('g',rhold[6]); servo('h',rhold[7]); delay(15); if(recenttouch>0){recenttouch--;} } if ( (digitalRead(touchsensor)==0) && (recenttouch==0) ){ gosize=200; goslowness=1; rtarget[0]=uncleA[uncleindex]; rtarget[1]=uncleB[uncleindex]; rtarget[2]=uncleC[uncleindex]; rtarget[3]=uncleD[uncleindex]; rtarget[4]=uncleE[uncleindex]; rtarget[5]=uncleF[uncleindex]; rtarget[6]=uncleG[uncleindex]; rtarget[7]=uncleH[uncleindex]; uncleindex++; if(uncleindex>4){uncleindex=0;} recenttouch=40; Serial.println("Bad touch! UNCLE TOUCH!"); } flag=1; for(c=0;c<8;c++){ if((rhold[c]-rtarget[c])>gosize){flag=0; rhold[c]-=gosize;} if((rtarget[c]-rhold[c])>gosize){flag=0; rhold[c]+=gosize;} } } } } void burst(char quantity, char slowness, char type){ int c, holdcount ; int rhold0, rhold1, rhold2, rhold3, rhold4, rhold5, rhold6, rhold7; if (type==0){ for ( ; quantity>0; quantity--){ if (analogRead(trigger) < SLEEPY ) { return;} Serial.print("whee! "); rhold0 = random(minangle,maxangle); rhold1 = random(minangle,maxangle); rhold2 = random(minangle,maxangle); rhold3 = random(minangle,maxangle); rhold4 = random(minangle,maxangle); rhold5 = random(minangle,maxangle); rhold6 = random(minangle,maxangle); rhold7 = random(minangle,maxangle); holdcount = random(1,10); for ( c=slowness; c>0; c--){ servo('a',rhold0); servo('b',rhold1); servo('c',rhold2); servo('d',rhold3); servo('e',rhold4); servo('f',rhold5); servo('g',rhold6); servo('h',rhold7); delay(holdcount); } } } if (type==1){ for ( ; quantity>0; quantity--){ if (analogRead(trigger) < SLEEPY ) { return;} Serial.print("wh00t! "); rhold0 = random(minangle,maxangle); rhold1 = random(minangle,maxangle); rhold2 = random(minangle,maxangle); rhold3 = random(minangle,maxangle); rhold4 = random(minangle,maxangle); rhold5 = random(minangle,maxangle); rhold6 = random(minangle,maxangle); rhold7 = random(minangle,maxangle); holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('a',rhold0); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('b',rhold1); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('c',rhold2); delay(slowness); } for ( c=holdcount; c>0; c--){ servo('d',rhold3); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('e',rhold4); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('f',rhold5); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('g',rhold6); delay(slowness); } holdcount = random(1,10); for ( c=holdcount; c>0; c--){ servo('h',rhold7); delay(slowness); } } } } /////////////////////////////////////////////////////////////////////////////// void purr(int duration, int offset, int reps){ int c,i,ii; int start0, start1, start2, start3, start4, start5, start6, start7; int finish0, finish1, finish2, finish3, finish4, finish5, finish6, finish7; start0 = random(minangle,maxangle); start1 = random(minangle,maxangle); start2 = random(minangle,maxangle); start3 = random(minangle,maxangle); start4 = random(minangle,maxangle); start5 = random(minangle,maxangle); start6 = random(minangle,maxangle); start7 = random(minangle,maxangle); Serial.print("pu"); for(i=reps;i>0;i--){ Serial.print("r"); if (analogRead(trigger) < SLEEPY ) { return;} finish0 = random(minangle,maxangle); finish1 = random(minangle,maxangle); finish2 = random(minangle,maxangle); finish3 = random(minangle,maxangle); finish4 = random(minangle,maxangle); finish5 = random(minangle,maxangle); finish6 = random(minangle,maxangle); finish7= random(minangle,maxangle); for ( ii=duration; ii>0; ii--){ if (start0>(finish0+offset)){start0=start0-offset;} else if (start0<(finish0-offset)){start0=start0+offset;} else {start0=finish0;} if (start1>(finish1+offset)){start1=start1-offset;} else if (start1<(finish1-offset)){start1=start1+offset;} else {start1=finish1;} if (start2>(finish2+offset)){start2=start2-offset;} else if (start2<(finish2-offset)){start2=start2+offset;} else {start2=finish2;} if (start3>(finish3+offset)){start3=start3-offset;} else if (start3<(finish3-offset)){start3=start3+offset;} else {start3=finish3;} if (start4>(finish4+offset)){start4=start4-offset;} else if (start4<(finish4-offset)){start4=start4+offset;} else {start4=finish4;} if (start5>(finish5+offset)){start5=start5-offset;} else if (start5<(finish5-offset)){start5=start5+offset;} else {start5=finish5;} if (start6>(finish6+offset)){start6=start6-offset;} else if (start6<(finish6-offset)){start6=start6+offset;} else {start6=finish6;} if (start7>(finish7+offset)){start7=start7-offset;} else if (start7<(finish7-offset)){start7=start7+offset;} else {start7=finish7;} if (start0 != finish0){servo('a',start0);} if (start1 != finish1){servo('b',start1);} if (start2 != finish2){servo('c',start2);} if (start3 != finish3){servo('d',start3);} if (start4 != finish4){servo('e',start4);} if (start5 != finish5){servo('f',start5);} if (start6 != finish6){servo('g',start6);} if (start7 != finish7){servo('h',start7);} delay(25); } } } //////////////////////////////////////////////////////////////////////////// void quiver(char quittable, char duration,char slowness, char intensity){ int c, holdtime ; int rhold0, rhold1, rhold2, rhold3, rhold4, rhold5, rhold6, rhold7; Serial.print("qu"); for ( ; duration>0; duration--){ rhold0 = random(minangle,maxangle); rhold1 = random(minangle,maxangle); rhold2 = random(minangle,maxangle); rhold3 = random(minangle,maxangle); rhold4 = random(minangle,maxangle); rhold5 = random(minangle,maxangle); rhold6 = random(minangle,maxangle); rhold7 = random(minangle,maxangle); holdtime = random(2,25); if ((quittable)&&(analogRead(trigger) < SLEEPY)) { return;} Serial.print("i"); for ( c=slowness; c>0; c--){ servo('a',rhold0); servo('b',rhold1); servo('c',rhold2); servo('d',rhold3); servo('e',rhold4); servo('f',rhold5); servo('g',rhold6); servo('h',rhold7); delay(holdtime); servo('a',rhold0+intensity); servo('b',rhold1+intensity); servo('c',rhold2+intensity); servo('d',rhold3+intensity); servo('e',rhold4+intensity); servo('f',rhold5+intensity); servo('g',rhold6+intensity); servo('h',rhold7+intensity); delay(holdtime); } } Serial.println("ver"); } ///////////////////////////////////////////////////////////////////////// void timedsleep(int duration){ int c; Serial.print("I'm sleepy! I'm going to sleep for "); Serial.print(duration, DEC); Serial.print(" Z's... getting... "); Serial.print("sle"); for ( ; duration >0; duration --){ for (c=4;c>0;c--){ delay(150); Serial.print("e"); if (analogRead(trigger) > AWAKEN ) { Serial.print(" Oh! you woke me!"); return; } } } Serial.println("py "); }