Created
December 2, 2015 22:25
-
-
Save plantvsbirds/67943166a9321fa74a90 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "pitches.h" | |
const int LMAX = 230; | |
const int RMAX = 255; | |
const int L = 11; | |
const int R = 10; | |
int sensorValue = 0; | |
int Trig_pin = 9; | |
int Echo_pin = A2; | |
bool lock = false; | |
int randomWalkL(int moveSize){ | |
static int place; // variable to store value in random walk - declared static so that it stores | |
// values in between function calls, but no other functions can mess with its value | |
int randomWalkLowRange = LMAX / 2; | |
int randomWalkHighRange = LMAX; | |
place = place + (random(-moveSize, moveSize + 1)); | |
if (place < randomWalkLowRange){ // check lower and upper limits | |
place = randomWalkLowRange + (randomWalkLowRange - place); // reflect number back in positive direction | |
} | |
else if(place > randomWalkHighRange){ | |
place = randomWalkHighRange - (place - randomWalkHighRange); // reflect number back in negative direction | |
} | |
return place; | |
} | |
int randomWalkR(int moveSize){ | |
static int place; // variable to store value in random walk - declared static so that it stores | |
// values in between function calls, but no other functions can mess with its value | |
place = place + (random(-moveSize, moveSize + 1)); | |
int randomWalkHighRange = RMAX; | |
int randomWalkLowRange = RMAX / 2; | |
if (place < randomWalkLowRange){ // check lower and upper limits | |
place = randomWalkLowRange + (randomWalkLowRange - place); // reflect number back in positive direction | |
} | |
else if(place > randomWalkHighRange){ | |
place = randomWalkHighRange - (place - randomWalkHighRange); // reflect number back in negative direction | |
} | |
return place; | |
} | |
void blinkNose(){ | |
digitalWrite(13, HIGH); | |
delay(500); | |
digitalWrite(13, LOW); | |
delay(100); | |
} | |
void halt() { | |
analogWrite(L, 0); | |
analogWrite(R, 0); | |
} | |
void goStraightForSec(int len) { | |
analogWrite(L, LMAX - 20); | |
analogWrite(R, RMAX); | |
digitalWrite(4, HIGH); | |
digitalWrite(5, LOW); | |
digitalWrite(7, HIGH); | |
digitalWrite(8, LOW); | |
delay(len); | |
halt(); | |
} | |
void goRandomForSec(int len) { | |
analogWrite(L, randomWalkL(30)); | |
analogWrite(R, randomWalkR(30)); | |
digitalWrite(4, HIGH); | |
digitalWrite(5, LOW); | |
digitalWrite(7, HIGH); | |
digitalWrite(8, LOW); | |
delay(len); | |
halt(); | |
} | |
void goBackForSec(int len) { | |
analogWrite(L, LMAX-20); | |
analogWrite(R, RMAX); | |
digitalWrite(4, LOW); | |
digitalWrite(5, HIGH); | |
digitalWrite(7, LOW); | |
digitalWrite(8, HIGH); | |
delay(len); | |
halt(); | |
} | |
void rotate(int d, int len) { | |
analogWrite(L, LMAX); | |
analogWrite(R, RMAX); | |
if (d > 50) { | |
digitalWrite(4, LOW); | |
digitalWrite(5, HIGH); | |
digitalWrite(7, HIGH); | |
digitalWrite(8, LOW); | |
} else { | |
digitalWrite(4, HIGH); | |
digitalWrite(5, LOW); | |
digitalWrite(7, LOW); | |
digitalWrite(8, HIGH); | |
} | |
/*for (int i=0;i <= len / 200; i++) { | |
delay(50); | |
digitalWrite(12, HIGH); | |
delay(150); | |
digitalWrite(12, LOW); | |
}*/ | |
delay(len); | |
halt(); | |
} | |
double getDistance() { | |
digitalWrite(Trig_pin, LOW); | |
delayMicroseconds(2); | |
digitalWrite(Trig_pin, HIGH); | |
delayMicroseconds(10); | |
digitalWrite(Trig_pin, LOW); | |
int Time_out = 30000 ;//microsec | |
int duration; | |
duration = pulseIn(Echo_pin,HIGH,Time_out); | |
if (duration == 0) duration = Time_out; | |
Serial.print(duration/58); | |
Serial.print("cm"); | |
Serial.print("\n====\n"); | |
return duration / 58; | |
} | |
void goTillClose (int cm){ | |
while (getDistance() > cm) { | |
goStraightForSec(500); | |
blinkNose(); | |
tone(12, NOTE_C4 , 4); | |
} | |
} | |
void goTillAway (int cm){ | |
while (getDistance() < cm) { | |
goBackForSec(500); | |
} | |
} | |
void playGameMusic() { | |
int melody[] = { | |
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 | |
}; | |
int noteDurations[] = { | |
4, 8, 8, 4, 4, 4, 4, 4 | |
}; | |
for (int thisNote = 0; thisNote < 8; thisNote++) { | |
int noteDuration = 1000 / noteDurations[thisNote]; | |
tone(12, melody[thisNote], noteDuration); | |
int pauseBetweenNotes = noteDuration * 1.30; | |
delay(pauseBetweenNotes); | |
noTone(12); | |
} | |
} | |
void playZigeunerweisen() { | |
int melody[] = { | |
NOTE_GS5, NOTE_C6, NOTE_D6, NOTE_DS6, | |
NOTE_D6, NOTE_C6, NOTE_AS5, | |
NOTE_C6, NOTE_C6 | |
}; | |
int noteDurations[] = { | |
8, 8, 8, 4, | |
4, 6, 8, | |
4, 8 | |
}; | |
for (int thisNote = 0; thisNote < 9; thisNote++) { | |
int noteDuration = 3000 / noteDurations[thisNote]; | |
tone(12, melody[thisNote], noteDuration); | |
int pauseBetweenNotes = noteDuration * 1.45; | |
delay(pauseBetweenNotes); | |
noTone(12); | |
} | |
} | |
void setup() { | |
delay(2000); | |
playZigeunerweisen(); | |
Serial.begin(9600); | |
pinMode(10, OUTPUT); | |
pinMode(13, OUTPUT); | |
pinMode(11, OUTPUT); | |
pinMode(12, OUTPUT); | |
pinMode(4, OUTPUT); | |
pinMode(5, OUTPUT); | |
pinMode(7, OUTPUT); | |
pinMode(8, OUTPUT); | |
pinMode(A2, INPUT); | |
pinMode(A5, INPUT); | |
pinMode(9, OUTPUT); | |
halt(); | |
} | |
void loop() { | |
while(1) { if (lock) { | |
delay(200000000000000); | |
} else { | |
rotate(random(0,100), random(2000,3000)); | |
} | |
goTillClose(15); | |
delay(100); | |
playGameMusic(); | |
digitalWrite(13, HIGH); | |
for (int i=0; i<=20 000;i++) | |
if (analogRead(A5) < 117) { | |
lock = !lock; | |
digitalWrite(13, LOW); | |
delay(50); | |
} | |
digitalWrite(13, LOW); | |
if (lock) { | |
delay(200000000000000); | |
} else { | |
goTillAway(20); | |
goBackForSec(1000); | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment