#include <LiquidCrystal.h>
#include <Servo.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
Servo myservo;
const int servoBox = 7;
const int servoDoll = 6;
const int buzzer = 5;
const int buttonBox = 4;
const int buttonStop = 0;
const int button1 = 1;
const int button2 = 2;
const int button3 = 3;
const int c = 14;
const int d = 15;
const int e = 17;
const int f = 18;
const int g = 19;
const int a = 20;
const int b = 21;
bool servoActivated = false;
bool boxOpen = false;
bool doll = false;
bool songPlaying = false;
void displayPotter() {
lcd.clear();
lcd.print("Now playing:");
lcd.setCursor(0, 1);
lcd.print("Harry Potter");
}
void displaySummer() {
lcd.clear();
lcd.print("Now playing:");
lcd.setCursor(0, 1);
lcd.print("Summer Away");
}
void displayFlyMoon() {
lcd.clear();
lcd.print("Now playing:");
lcd.setCursor(0, 1);
lcd.print("Fly me to moon");
}
void openBox() {
if (digitalRead(buttonBox) == LOW && !servoActivated) {
myservo.attach(servoBox);
for (int pos = 90; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
delay(1000);
myservo.detach();
servoActivated = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("The music box is");
lcd.setCursor(0, 1);
lcd.print("fully opened.");
delay(2000);
boxOpen = true;
}
}
void stopMusic() {
songPlaying = false;
noTone(buzzer); // Stop playing the note
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Music stopped");
delay(2000);
}
void chooseSong() {
if (boxOpen) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Please choose");
lcd.setCursor(0, 1);
lcd.print("a song.");
delay(1000);
}
if (digitalRead(button1) == LOW) {
songPlaying = true;
doll = true;
harryPotter();
songPlaying = false;
} else if (digitalRead(button2) == LOW) {
songPlaying=true;
doll = true;
flyMoon();
songPlaying = false;
} else if (digitalRead(button3) == LOW) {
songPlaying = true;
doll = true;
summerAway();
songPlaying = false;
} else if (digitalRead(buttonStop) == LOW) {
stopMusic();
return;
}
delay(500);
}
void playNote(int frequency, int duration) {
if (digitalRead(buttonStop) == HIGH) {
moveServoDoll();
tone(buzzer, frequency, duration);
delay(duration + 50);
switch (frequency) {
case 2217: //c
digitalWrite(c, HIGH);
digitalWrite(c, LOW);
break;
case 2093: //c
digitalWrite(c, HIGH);
digitalWrite(c, LOW);
break;
case 1046: //c
digitalWrite(c, HIGH);
digitalWrite(c, LOW);
break;
case 1108: //c
digitalWrite(c, HIGH);
digitalWrite(c, LOW);
break;
case 1174: //d
digitalWrite(d, HIGH);
digitalWrite(d, LOW);
break;
case 2349: //d
digitalWrite(d, HIGH);
digitalWrite(d, LOW);
break;
case 1244: //d
digitalWrite(d, HIGH);
digitalWrite(d, LOW);
break;
case 1760: //a
digitalWrite(a, HIGH);
digitalWrite(a, LOW);
break;
case 1864: //a
digitalWrite(a, HIGH);
digitalWrite(a, LOW);
break;
case 1975: //b
digitalWrite(b, HIGH);
digitalWrite(b, LOW);
break;
case 987: //b
digitalWrite(b, HIGH);
digitalWrite(b, LOW);
break;
case 1318: //e
digitalWrite(e, HIGH);
digitalWrite(e, LOW);
break;
case 1479: //f
digitalWrite(f, HIGH);
digitalWrite(f, LOW);
break;
case 1396: //f
digitalWrite(f, HIGH);
digitalWrite(f, LOW);
break;
case 1567: //g
digitalWrite(g, HIGH);
digitalWrite(g, LOW);
break;
default: //g
digitalWrite(g, HIGH);
digitalWrite(g, LOW);
break;
}
} else {
noTone(buzzer); // Stop playing the note immediately
playNote(0,0);
// Check if a song button is pressed during the note
if (digitalRead(button1) == LOW) {
songPlaying = true;
harryPotter();
songPlaying = false;
} else if (digitalRead(button2) == LOW) {
songPlaying = true;
flyMoon();
songPlaying = false;
} else if (digitalRead(button3) == LOW) {
songPlaying = true;
summerAway();
songPlaying = false;
}
}
if (digitalRead(button1) == LOW) {
songPlaying = true;
harryPotter();
songPlaying = false;
} else if (digitalRead(button2) == LOW) {
songPlaying = true;
flyMoon();
songPlaying = false;
} else if (digitalRead(button3) == LOW) {
songPlaying = true;
summerAway();
songPlaying = false;
}
}
void harryPotter() {
if (songPlaying) {
displayPotter();
moveServoDoll();
playNote(1975, 300); // b6
playNote(1318, 600); // e6
playNote(1567, 150); // g6
playNote(1479, 250); // f#6
playNote(1318, 700); // e6
playNote(1975, 300); // b6
playNote(1760, 1000); // a6
playNote(1479, 1000); // f#6
playNote(1318, 600); // e6
playNote(1567, 150); // g6
playNote(1479, 300); // f#6
playNote(1174, 700); // d#6
playNote(1396, 300); // f6
playNote(987, 1000); // b5
delay(500);
playNote(987, 300); // b5
playNote(1318, 600); // e6
playNote(1567, 150); // g6
playNote(1479, 250); // f#6
playNote(1318, 600); // e6
playNote(1975, 300); // b6
playNote(2349, 800); // d7
playNote(2217, 300); // c#7
playNote(2093, 600); // c7
playNote(1661, 300); // g#6
playNote(2093, 600); // c7
playNote(1975, 200); // b6
playNote(1864, 600); // a#6
delay(100);
playNote(987, 700); // b5
playNote(1567, 300); // g6
playNote(1318, 1500); // e6
lcd.clear();
delay(2000);
}
}
void flyMoon() {
if (songPlaying) {
displayFlyMoon();
moveServoDoll();
playNote(2093, 500); // c
playNote(1975, 200); // b
playNote(1760, 300); // a
playNote(1567, 200); // g
playNote(1396, 300); // f
playNote(1567, 300); // g
playNote(1760, 300); // a
playNote(2093, 300); // c
playNote(1975, 400); // b
playNote(1760, 300); // a
playNote(1567, 300); // g
playNote(1396, 300); // f
playNote(1318, 500); // e
delay(500);
playNote(1760, 400); // a
playNote(1567, 300); // g
playNote(1396, 300); // f
playNote(1318, 300); // e
playNote(1174, 300); // d
playNote(1318, 300); // e
playNote(1396, 300); // f
playNote(1760, 300); // a
playNote(1661, 300); // g#
playNote(1396, 300); // f
playNote(1318, 300); // e
playNote(1174, 300); // d
playNote(1046, 500); // c-
delay(500);
playNote(1108, 300); // c-#
playNote(1174, 700); // d
playNote(1760, 300); // a
delay(30);
playNote(1760, 700); // a
delay(300);
playNote(2093, 500); // c
playNote(1975, 300); // b
playNote(1567, 700); // g
delay(300);
playNote(988, 300); // b--
playNote(1046, 500); // c-
playNote(1396, 300); // f
delay(30);
playNote(1396, 700); // f
delay(500);
playNote(1760, 300); // a
playNote(1567, 300); // g
playNote(1396, 500); // f
playNote(1318, 700); // e
lcd.clear();
delay(1000);
}
}
void summerAway() {
if (songPlaying) {
displaySummer();
moveServoDoll();
playNote(1760, 300); // a6
playNote(1975, 300); // b6
playNote(2093, 300); // c7
delay(25);
playNote(2093, 300); // c7
playNote(2349, 300); // d7
playNote(2093, 300); // c7
playNote(1975, 300); // b6
delay(200);
playNote(1318, 300); // e
playNote(1567, 300); // g
playNote(1760, 300); // a
delay(25);
playNote(1760, 300); // a
playNote(1567, 300); // g
playNote(1396, 300); // f
playNote(1567, 300); //
delay(300);
playNote(1567, 300); // g
delay(25);
playNote(1567, 300); // g
playNote(1396, 300); // f
delay(25);
playNote(1396, 300); // f
playNote(1244, 300); // d#
playNote(1396, 300); // f
playNote(1567, 300); // g
playNote(1661, 300); // g#
playNote(1864, 300); // a#
playNote(1661, 300); // g#
delay(25);
playNote(1661, 300); // g#
playNote(1567, 300); // g
playNote(1661, 300); // g#
delay(50);
playNote(1567, 200); // g
playNote(1661, 200); // g#
playNote(1864, 300); // a#
playNote(2093, 800); // c7
delay(100);
playNote(1661, 300); // g#
playNote(1864, 300); // a#
playNote(2093, 800); // c7
delay(50);
playNote(2093, 300); // c7
playNote(1975, 500); // b6
playNote(2093, 300); // c7
playNote(2349, 800); // d7
lcd.clear();
delay(2000); // Pause for a moment before repeating
}
}
void moveServoDoll() {
static unsigned long previousMillis = 0;
const int interval = 15; // Interval between each step (milliseconds)
static int position = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
myservo.attach(servoDoll);
myservo.write(position);
position += 5;
if (position > 180) {
position = 0;
}
}
}
void setup() {
lcd.begin(16, 2);
pinMode(buttonBox, INPUT_PULLUP);
pinMode(buttonStop, INPUT_PULLUP);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
pinMode(a, OUTPUT);
}
void loop() {
openBox();
chooseSong();
}