L6 - Happy Birthday!
Description
A present which plays happy birthday when you open it (rather like those musical cards you can buy nowadays).
Components Used
- Light Emitting Diode (LED)
- Resistors
- Piezo speaker
- Cardboard box
Arduino Code
/* Happy Birthday
* -----------
*
* Program to play melodies stored arrays based on the amount of light hitting a photocell.
*
* The calculation of the tones is made following the mathematical
* operation:
*
* timeHigh = 1/(2 * toneFrequency) = period / 2
*
* where the different tones are described as in the table:
*
* note frequency period PW (timeHigh)
* c 261 Hz 3830 1915
* d 294 Hz 3400 1700
* e 329 Hz 3038 1519
* f 349 Hz 2864 1432
* g 392 Hz 2550 1275
* a 440 Hz 2272 1136
* b 493 Hz 2028 1014
* C 523 Hz 1912 956
*
* (cleft) 2005 D. Cuartielles for K3
*/
int potPin = 0; // select the input pin for the potentiometer
int potVal = 0; // variable to store the value coming from pot
int ledPin = 13;
int speakerOut = 9;
byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'B', 'b', 'C'};
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1073, 1014, 956};
byte intro[] = "8c8e8g8a8B8p8p8p";
byte birthday[] = "2c1p1c4d4c4f6e2p2c1p1c4d4c4g6f2p2c2c4C4a4f4e6d2p2B1p1B4a4f4g8f8p8p8p";
// count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
// 10 20 30
int count = 0;
int count2 = 0;
int count3 = 0;
int MAX_COUNT = 40;
int statePin = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(speakerOut, OUTPUT);
Serial.begin(9600);
}
void play_melody(byte *melody){
for (count = 0; count < MAX_COUNT; count++) {
statePin = !statePin;
digitalWrite(ledPin, statePin);
for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
for (count2=0;count2<9;count2++) {
if (names[count2] == melody[count*2 + 1]) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tones[count2]);
digitalWrite(speakerOut, LOW);
delayMicroseconds(tones[count2]);
}
if (melody[count*2 + 1] == 'p') {
// make a pause of a certain size
digitalWrite(speakerOut, 0);
delayMicroseconds(500);
}
}
}
}
}
void loop() {
digitalWrite(speakerOut, LOW);
potVal = analogRead(potPin); // read the value from pot, between 0 - 1024
Serial.println(potVal);
if (potVal > 256 && potVal < 512) {
play_melody(intro);
} else if (potVal >=
512) {
play_melody(birthday);
}
}