Skip to content

Instantly share code, notes, and snippets.

@plantvsbirds
Created December 2, 2015 22:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save plantvsbirds/67943166a9321fa74a90 to your computer and use it in GitHub Desktop.
Save plantvsbirds/67943166a9321fa74a90 to your computer and use it in GitHub Desktop.
#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